执行查询后,我与SQL Server失去连接

时间:2020-01-20 18:05:01

标签: asp.net sql-server

我有一个ASP.NET应用程序,在页面中,我有一个包装到按钮单击的函数,此按钮单击将200行插入到一个数据库表中。

每次单击按钮,插入操作都会成功,但是之后,我将失去与数据库的连接,因此我的Web应用程序处于冻结状态,需要重新启动整个服务器以重新连接到数据库。

我试图从对象资源管理器中查看SQL Server日志,但无济于事;我看了很多邮件,其中重要的错误提示邮件是

  1. .NET Framework运行时已停止
  2. 服务器代理管理器已关闭

这是我的代码:

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

1 个答案:

答案 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;