2013-01-10 54 views
-1

我已经创建了数据库连接类来打开,关闭并创建连接字符串。我把它命名为db_connections。我创建了另一个名为db_operations的类来执行所有CRUD数据库事务。我只想声明一次连接字符串(为此,假设我有一个表单输入任何数据库连接属性,例如:server_name,db_name等)。需要建议:使用C#连接到mysql的数据库连接类

我所知道的所有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更安全吗?

+0

“不安全”是什么意思? – RBarryYoung

+0

哈哈,我不知道朋友,但有点从来没有感到安全每次我写代码,我需要探索更多的每个代码我写,只是为了确保我做了一个很好的代码:D – r3d

+0

-1:你是一个问我们这是否安全。你需要澄清你的意思。 – RBarryYoung

回答

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的属性,但值不同,它们是单个对象的一部分。为单个对象更改该属性的值,并且仅在该对象内更改该值,其他对象在具有相同属性时保留其自己的值。

+0

嗨@Dirk Trilsbeek,无论如何都有出色的答案......
>但是你用它们的方式并不意味着要使用
我同意或者更好的使用**应用程序配置文件**来存储这种信息?
>静态属性决不会连接到它们声明的类的特定对象实例
我是sory朋友,你能更具体地解释一下(仍然困惑)吗? – r3d

+0

静态属性未连接到任何对象。如果您有一个具有属性的对象并且您创建了第二个对象,则第二个对象的属性是该对象的一部分。这两个对象不共享它们的属性,属性值可能不同。访问静态属性的两个对象实际上访问相同的属性。如果一个对象改变了这些属性,那么对于使用它们的其他人也会改变它们。 –

+0

我在静态属性上添加了一个小代码示例,我的意思是“未连接到特定对象”。 –

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

+0

hey @lcarus,thx快速回复:D,对于一个很好的链接课程:D – r3d