更正SqlConnection声明

Lon*_*der 0 c# sqlconnection sql-server-2008

问题是我使用了我SqlConnection作为公共静态连接,认为这可能是导致错误时间的问题:

*连接未打开或连接已打开

那么SqlConnection在静态类中使用一个语句是否可以?

所以我只能宣告它一次,我知道我可以使用connectionStringweb.config

ConfigurationManager.ConnectionStrings["conn"].ConnectionString ...
Run Code Online (Sandbox Code Playgroud)

但我喜欢它与web.config设置或服务器名称无关.

  • ReEdit:

因为它确实是同一个类中的两个方法,也是该主类中的另一个类,但这不是重要的,而是对所有执行使用相同的连接!所以你说即使我用我的帮助者类的正确代码编辑,这是错的?

public static class myDBhelper
{
 public static SqlConnection Conn = new SqlConnection ("server=(local);Initial Catalog=dbName;Integrated Security=True");

        public static int ExecSQLint(string TblintSQL)
        {
            int anIntValue=0;
            SqlCommand TblintCMD = new SqlCommand(TblintSQL, Conn);
            try
            {
                Conn.Open();
                anIntValue = Convert.ToInt32(TblintCMD.ExecuteScalar());
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }
          return anIntValue;
        }



        public static string ExecSQLstring(string TblStrSQL)
        {
          string strValue="";
          SqlCommand TblStrCMD = new SqlCommand(TblStrSQL, Conn);
            try
            {
                Conn.Open();
                strValue = TblStrCMD.ExecuteScalar().ToString();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }

            return strValue;
        }


}
Run Code Online (Sandbox Code Playgroud)

我怀疑的主要问题是这两个选项:

SqlConnection Conn = new SqlConnection("Data Source=(local);Integrated Security=True;database=dbName")
Run Code Online (Sandbox Code Playgroud)

在我DBhelper班上我正在使用这个声明

SqlConnection Conn = new SqlConnection("server=(local);Initial Catalog=dbName;Integrated Security=True");
Run Code Online (Sandbox Code Playgroud)

可能不稳定或容易出错吗?

ps:我正在通过try catch执行命令

            try
            {
                Conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }
Run Code Online (Sandbox Code Playgroud)

Using语句比较合适?虽然这不是我的问题,但我在想...如果我已经尝试按照这本书做到了......

这些方法到底有哪些错误

cuo*_*gle 6

将Connection保持为静态不是使用数据库连接的常用方法.当您在Web或多线程环境中处理应用程序时,它可能会导致异常.

执行命令1的线程1与执行命令2的线程2的连接相同.您的例子:TblintCMD和TblStrCMD.当线程1完成时,它关闭连接,同时线程2仍然在关闭连接时执行命令

你的两个选择不是问题.

最好的方法是using在需要时使用关键字并创建连接:

using (var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open();
    ...
}
Run Code Online (Sandbox Code Playgroud)

using 类似于:

var connection =  new SqlConnection("connectionString");
try
{
    connection.Open();
    ....
}
finally
{
    connection.Close();
}
Run Code Online (Sandbox Code Playgroud)

因此,您不需要知道何时关闭Connection.

在幕后,ADO.NET使用连接池自动管理连接,因此您不应该关心打开多少个连接.