0

问题是我将我的SqlConnection用作公共静态连接,认为这可能是导致表单不时出现错误的问题:

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

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

这样我就可以只声明一次,我知道我可以connectionString使用web.config

ConfigurationManager.ConnectionStrings["conn"].ConnectionString ...

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

  • 重新编辑:

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

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;
        }


}

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

SqlConnection Conn = new SqlConnection("Data Source=(local);Integrated Security=True;database=dbName")

在我的DBhelper课堂上,我使用了这个声明

SqlConnection Conn = new SqlConnection("server=(local);Initial Catalog=dbName;Integrated Security=True");

那会不稳定或容易出错吗?

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();
            }

Using陈述更合适吗?虽然这不是我的问题,但我在想……如果我已经在尝试“按部就班”去做……

其中有什么方法实际上是错误的吗?

4

3 回答 3

6

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

执行命令 1 的线程 1 与执行命令 2 的线程 2 的连接相同。您的前任:TblintCMD 和 TblStrCMD。当线程 1 完成后,它关闭了连接,同时线程 2 仍在执行关闭连接的命令

你的两个选项都不是问题。

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

using (var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open();
    ...
}

using类似于:

var connection =  new SqlConnection("connectionString");
try
{
    connection.Open();
    ....
}
finally
{
    connection.Close();
}

因此,您无需知道何时关闭 Connection。

在幕后,ADO.NET 使用连接池自动为您管理连接,因此您不必太在意打开了多少连接。

于 2012-09-24T17:12:15.783 回答
0
using(var conn=new. SqlConnection( "server=(local);Initial Catalog=dbName;Integrated Security=True"))
{
    conn.Open();
}
于 2012-09-24T17:43:41.463 回答
-1
public SqlConnection GetSqlConnection()
{
    SqlConnection sql = new SqlConnection();
    sql.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["SchoolContext"].ToString();
    return sql;
}
于 2017-08-09T08:58:02.397 回答