-1

我创建数据库连接类只是为了打开、关闭和创建连接字符串。我命名它db_connections。我创建了另一个名为 db_operations执行所有 CRUD 数据库事务的类。

我的想法是:我只想声明一次连接字符串(为此,假设我有一个表单来输入任何数据库连接属性,例如:server_name、db_name 等)。

我所知道的 C# 确实有全局变量 cmiiw,我的搜索很多建议使用静态变量来存储数据。但有人告诉我,使用静态变量并不安全。

所有代码都使用 C# 4.0。

这是我的连接类的代码:

class db_connections : databases_abstract
{

    private static string dbname;
    private static string dbuser;
    private static string dbpass;
    private static string dbserver;

    public MySqlConnection mysqlConn;

    public static string DB_NAME
    {
        get
        {
            return dbname;
        }
        set
        {
            dbname = value;
        }
    }

    public static string DB_USER
    {
        get
        {
            return dbuser;
        }
        set
        {
            dbuser = value;
        }
    }

    public static string DB_PASSWORD
    {
        get
        {
            return dbpass;
        }
        set
        {
            dbpass = value;
        }
    }

    public static string DB_SERVER
    {
        get
        {
            return dbserver;
        }
        set
        {
            dbserver = value;
        }
    }


    protected override string db_make_connstring(string dbserver, string dbuser, string dbpass, string dbname)
    {
        //## Our connection string
        string connString = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false",
        dbserver, dbuser, dbpass, dbname);

        return connString;
    }

    public override Boolean db_open_connection()
    {
        try
        {
            //## Initialise the connection
            mysqlConn = new MySqlConnection(
                this.db_make_connstring(db_connections.dbserver, db_connections.dbuser,
                    db_connections.dbpass, db_connections.dbname)
                );
            if (mysqlConn != null)
            {
                mysqlConn.Close();
            }
            //## Open the connection
            mysqlConn.Open();

            return true;
        }
        catch (Exception Ex)
        {
            System.Windows.Forms.MessageBox.Show(Ex.Message, "Error",
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Error);
            return false;
        }
    }

    public override void db_close_connection()
    {
        try
        {
            if (mysqlConn != null)
            {
                mysqlConn.Close();
                mysqlConn.Dispose();
            }
        }
        catch(Exception Ex)
        {
            System.Windows.Forms.MessageBox.Show(Ex.Message, "Error",
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Error);

        }

    }
}

从数据库连接表单中,我像这样实例化了该类:

    db_connections db_conn = new db_connections();
    db_connections.DB_SERVER = txtDbServer.Text;
    db_connections.DB_NAME = txtDbName.Text;
    db_connections.DB_USER = txtDbUser.Text;
    db_connections.DB_PASSWORD = txtDbPass.Text;

    //##Just testing the connection
    //##Once the connection succes, the database setting cannot be opened again
    //##until the application is terminated or any really special event request
    if (db_conn.db_open_connection() == true)
    {
       MessageBox.Show("Successfully connect to the database!!");
       this.Owner.Controls["btnUpload"].Enabled = true;
       this.Owner.Controls["btnDb"].Enabled = false;
       this.Close();
    }

我想知道:

  1. 这是真的,使用静态变量不安全吗?如果是的话,有什么建议可以重构我的代码吗?

  2. 我关心在类mysqlConn.Dispose()中的每个函数中使用db_operations,我只是调用db_operations类来打开和关闭连接(而不是创建或修改connection string)。那么仅用于mysqlConn.Close();关闭连接就足够了吗?

  3. 有什么建议可以让我db_connections更安全吗?

4

2 回答 2

0

使用应用程序配置文件来存储此类信息。如果使用 asp.net,您可以使用 Web.Config 文件来存储所有连接字符串。如果您使用的是 Winforms,那么您可以使用 App.config 来执行相同的操作。

您可以在此处阅读有关 ConnectionStrings 部分的更多信息:http: //msdn.microsoft.com/en-us/library/ms254494.aspx

您只需使用 ConfigurationManager 类访问此信息,如下所示:

MySqlConnection con = new MySqlConnection(ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString);

这也是学习如何为所有类型的数据库和驱动程序定义连接字符串的好来源:http: //www.connectionstrings.com/Articles/Show/store-connection-string-in-web-config

于 2013-01-10T14:20:31.270 回答
0

不,静态通常不是不安全的。但是您以它们不应该被使用的方式使用它们。例如,您创建类 db_connections 的实例,然后将值分配给类 db_connections 的静态属性,然后使用该类的对象方法,该方法又再次使用静态属性。静态属性绝不会连接到声明它们的类的特定对象实例。静态属性有点像 PHP 中的全局变量 - 在给定的上下文中(通常是整个应用程序,每个线程也是可能的),它只存在一次。因此,您可以将配置信息存储在类的静态属性中,但您必须记住,您在任何时候只能保留一个信息。例如,您可以不为不同的数据库创建两个配置。

一个关于静态属性的小例子:

public class TestClass
{

     public static string Text1 { get; set; }
     public string Text2 { get; set; }

     public void WriteText1()
     {
         Console.WriteLine(TestClass.Text1);
     }

     public void WriteText2()
     {
         Console.WriteLine(this.Text2);
     }
}



public class Program
{

   public static void Main(string[] args)
   {
       TestClass class1 = new TestClass;
       TestClass.Text1 = "Some Text";
       class1.Text2 = "More Text";

       class1.WriteText1();
       class1.WriteText2();

       TestClass class2 = new TestClass;
       TestClass.Text1 = "Another Text";
       class2.Text2 = "And a fourth text";

       class2.WriteText1();
       class2.WriteText2();

       class1.WriteText1();
   }
}

对此的输出是:

Some Text
More Text
Another Text
And a fourth text
Another Text

对 class1.WriteText1() 的最后一次调用写入与 class2.WriteText1 相同的输出。两个对象 class1 和 class2 都访问相同的静态属性 Text1。这与 Text2 等实例属性不同。两个对象都包含一个名为 Text2 的属性,但值不同,它们是单个对象的一部分。更改单个对象的该属性的值,并且仅在该对象内更改,其他对象虽然具有相同的属性,但仍保留自己的值。

于 2013-01-10T14:31:29.913 回答