我有一个ASP.NET应用程序,在页面中,我有一个包装到按钮单击的函数,此按钮单击将200行插入到一个数据库表中。
每次单击按钮,插入操作都会成功,但是之后,我将失去与数据库的连接,因此我的Web应用程序处于冻结状态,需要重新启动整个服务器以重新连接到数据库。
我试图从对象资源管理器中查看SQL Server日志,但无济于事;我看了很多邮件,其中重要的错误提示邮件是
这是我的代码:
public static string UpdateListWithTrans(DataTable dt, DataTable DtTrans, DataTable DtTrans2, DataTable DtTrans3, int DecisionId, string status, string CurrentUser)
{
Connection con = new Connection();
int UserID = GetUserId(CurrentUser);
con.SetConn();
try
{
using (SqlCommand cm = new SqlCommand("spUpdateListTransAction", con.GetConn()))
{
cm.CommandType = CommandType.StoredProcedure;
con.openConn();
cm.Parameters.AddWithValue("@DecisionId",DecisionId);
cm.Parameters.AddWithValue("@dt", dt);
cm.Parameters.AddWithValue("@DtTrans",DtTrans);
cm.Parameters.AddWithValue("@DtTrans2",DtTrans2);
cm.Parameters.AddWithValue("@DtTrans3",DtTrans3);
cm.Parameters.AddWithValue("@status", status);
cm.Parameters.AddWithValue("@UserID", UserID);
cm.Parameters.AddWithValue("@CreationDate", TimeZone_.GetLocalDate());
cm.Parameters.Add("@IsOk", SqlDbType.NVarChar, 100);
cm.Parameters["@IsOk"].Direction = ParameterDirection.Output;
cm.ExecuteNonQuery();
cm.Dispose();
con.CloseConn();
return cm.Parameters["@IsOk"].Value.ToString();
}
}
catch (Exception ee)
{
con.CloseConn();
con.DisposeConn();
return "f";
}
}
public class Connection
{
private SqlConnection con;
public void SetConn()
{
con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
}
public SqlConnection GetConn()
{
return con;
}
public void DisposeConn()
{
con.Dispose();
}
public void openConn()
{
if (con.State != ConnectionState.Open)
con.Open();
}
public void CloseConn()
{
if (con.State != ConnectionState.Closed)
con.Close();
}
}
答案 0 :(得分:1)
首先,重构代码如下:
public static string UpdateListWithTrans(DataTable dt, DataTable DtTrans, DataTable DtTrans2, DataTable DtTrans3, int DecisionId, string status, string CurrentUser)
{
try
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
using (SqlCommand cm = new SqlCommand("spUpdateListTransAction", con))
{
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@DecisionId",DecisionId);
cm.Parameters.AddWithValue("@dt", dt);
cm.Parameters.AddWithValue("@DtTrans",DtTrans);
cm.Parameters.AddWithValue("@DtTrans2",DtTrans2);
cm.Parameters.AddWithValue("@DtTrans3",DtTrans3);
cm.Parameters.AddWithValue("@status", status);
cm.Parameters.AddWithValue("@UserID", GetUserId(CurrentUser));
cm.Parameters.AddWithValue("@CreationDate", TimeZone_.GetLocalDate());
cm.Parameters.Add("@IsOk", SqlDbType.NVarChar, 100);
cm.Parameters["@IsOk"].Direction = ParameterDirection.Output;
con.openConn();
cm.ExecuteNonQuery();
return cm.Parameters["@IsOk"].Value.ToString();
}
}
}
catch (Exception ee)
{
return "f";
}
}
然后,查看是否可以解决您的问题。您有一些混合的原则,例如在using语句为您执行此操作时显式调用.Dispose()。
您还需要执行其他一些重构。例如,不要使用.AddWithValue。而是以这种方式定义参数。注意:我是VB.NET专家,但我认为参数DB类型也应为C#中的SqlDbType.Int?
cm.Parameters.Add("@DecisionId", SqlDbType.Int).Value = DecisionId;
请确保使用大小定义VarChar和NVarChar类型。例如:
cm.Parameters.Add("@Example", SqlDbType.NVarChar, 32).Value = example;