C# 正确的SqlConnection声明

C# 正确的SqlConnection声明,c#,sql-server-2008,sqlconnection,C#,Sql Server 2008,Sqlconnection,问题是我将我的SqlConnection用作公共静态连接,认为这可能是导致表单不时出错的问题: *连接未打开或连接已打开 那么,在静态类中使用一条SqlConnection语句可以吗 所以我只能声明一次,我知道我可以在web.config ConfigurationManager.ConnectionStrings["conn"].ConnectionString ... 但我喜欢它与web.config设置或服务器名称保持无关 重新编辑: 实际上,同一个类中有两个方法,所以该主类中还有另

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

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

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

所以我只能声明一次,我知道我可以在
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");
这是不稳定的还是容易出错的

p、 s:我正在通过try-catch执行命令

            try
            {
                Conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                throw new Exception("No Can Do: " + ex.Message);
            }
            finally
            {
                Conn.Close();
            }
使用
语句是否更合适?虽然这不是我的问题,但我在想。。。如果我已经在“按部就班地”做这件事


这里有什么方法是错误的吗

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

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

你的两个选择不是问题所在

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

using (var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open();
    ...
}
使用类似于:

var connection =  new SqlConnection("connectionString");
try
{
    connection.Open();
    ....
}
finally
{
    connection.Close();
}
所以,您不需要知道何时关闭连接


在后台,ADO.NET用于自动管理连接,因此您不应该太在意打开了多少连接。

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

using(var conn=new. SqlConnection( "server=(local);Initial Catalog=dbName;Integrated Security=True"))
{
    conn.Open();
}
执行命令1的线程1与执行命令2的线程2的连接相同。你的前任:TblintCMD和TblStrCMD。当线程1完成时,它关闭了连接,同时线程2仍在执行关闭连接的命令

你的两个选择不是问题所在

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

using (var connection = new SqlConnection("yourConnectionString"))
{
    connection.Open();
    ...
}
使用类似于:

var connection =  new SqlConnection("connectionString");
try
{
    connection.Open();
    ....
}
finally
{
    connection.Close();
}
所以,您不需要知道何时关闭连接



在幕后,ADO.NET用于自动管理连接,因此您不应该太在意打开了多少连接。

为什么在内部类上有命令对象?为什么在内部类上有命令对象?实际上,您是在说,以某种未知的方式,它可能会导致错误(我想我一想到这一点就有点偏执了),一个公共静态连接的使用与声明一次使用多个与任何其他变量不同…明确定义数据类型,在本例中不需要
var
。我提到的这两个选项如何。如果我的问题实际上是几个,那么很抱歉,但我试图询问字符串(“”)的两个不同选项在SqlConnection声明中,是否有错误的连接?你看到我在文章中提到的内容了吗?你不应该重复使用这样的连接,因为它们已经被ADO.NET池化了。而且,正如所提到的,这种方法不是线程安全的。至于连接字符串,请检查语法:。注意。所以你实际上是这样说的我不知道它会以什么方式导致错误(我想我根本就是在妄想),一个公共静态连接的使用与声明一次使用多个与任何其他变量不同…明确定义数据类型,在本例中不需要
var
。我提到的这两个选项如何。如果我的问题实际上是几个,那么很抱歉,但我试图询问字符串(“”)的两个不同选项在SqlConnection声明中,是否有错误的连接?你看到我在文章中提到的内容了吗?你不应该重复使用这样的连接,因为它们已经被ADO.NET池化了。此外,这种方法也不是线程安全的,如前所述。至于连接字符串,请检查这里的语法:。注意。@theIndian程序员,如果你和没有继续使用
代码示例,那么我可能猜它是(Conn.Close())“已处理完毕”-通过ADO.NET?您能继续您的示例吗?您可以选择一个合适的示例吗?关闭由使用…的处置负责,因为使用完成了它的工作..它处置了它已初始化的对象..@TheinidianPro感谢您对以下问题的澄清:使用<代码>使用<代码>语句进行处置,…您在中的意思是什么第二个评论“一个非静态成员”,是谁?似乎你已经编辑了你的问题……那太棒了……如果有人真的帮助你,考虑一下投票和接受……因此,如果你两个都没有继续使用<代码>的代码示例。-通过ADO.NET?您能继续您的示例吗?您可以选择一个合适的示例吗?关闭由使用…的处置负责,因为使用完成了它的工作..它处置了它已初始化的对象..@TheinidianPro感谢您对以下问题的澄清:使用<代码>使用<代码>语句进行处置,…您在中的意思是什么第二个评论“一个非静态成员”,是谁?似乎你已经编辑了你的问题……那太棒了……考虑一下投票和接受。
using(var conn=new. SqlConnection( "server=(local);Initial Catalog=dbName;Integrated Security=True"))
{
    conn.Open();
}