Lon*_*der 0 c# sqlconnection sql-server-2008
问题是我使用了我SqlConnection作为公共静态连接,认为这可能是导致错误时间的问题:
*连接未打开或连接已打开
那么SqlConnection在静态类中使用一个语句是否可以?
所以我只能宣告它一次,我知道我可以使用connectionString它web.config
ConfigurationManager.ConnectionStrings["conn"].ConnectionString ...
Run Code Online (Sandbox Code Playgroud)
但我喜欢它与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;
}
}
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语句比较合适?虽然这不是我的问题,但我在想...如果我已经尝试按照这本书做到了......
这些方法到底有哪些错误?
将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使用连接池自动管理连接,因此您不应该关心打开多少个连接.