2012-09-24 74 views
0

的问题是,我用我的SqlConnection作为公共静态连接,想这可能是导致形式不时出错的问题:正确的SqlConnection声明

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

因此,在静态类中使用SqlConnection的一条语句是可以的吗?

,这样我可以声明它只有一次,我知道我可以在web.config

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

使用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:我通过尝试catch执行命令

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

Using说法更合适呢?虽然这不是我的问题,我在想...如果我已经试图按照'本书'来做...

这里的任何方法实际上是错误其中?

+1

为什么你有一个内部类 –

回答

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

所以,你不需要知道什么时候关闭连接。

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

+0

所以你actuatlly说,在一些不知名的方式,可能会导致错误的命令对象(我想我被那偏执思维的话) ,一个公共静态连接的使用是不同的,类似于声明一次使用许多与其他变量一样... – LoneXcoder

+0

显式定义数据类型,在这种情况下不需要'var'。 – JonH

+0

那我提到的那两个选项呢。对不起,如果我的问题实际上是一些,但我试图在SqlConnection声明中询问关于字符串(“”)的两个不同选项,是否有任何错误?你在我的文章中看到我指的是什么? – LoneXcoder

0
using(var conn=new. SqlConnection("server=(local);Initial Catalog=dbName;Integrated Security=True")) 
{ 
    conn.Open(); 
} 
+0

@TheIndianProgrammer,所以如果你们两个都没有继续使用''using'的代码示例,那么我可能会猜测它是(Conn.Close())“被关注了” - 由ADO.NET?你能继续你的样品吗?你们任何一个合适的选择都会做 – LoneXcoder

+1

conn。关闭由使用的处理...作为使用完成它的工作..它配置它已初始化的对象... –

+0

多一件事..怎么可以你在一个静态类中声明了一个非静态成员... –

-1
public SqlConnection GetSqlConnection() 
{ 
    SqlConnection sql = new SqlConnection(); 
    sql.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["SchoolContext"].ToString(); 
    return sql; 
}