2016-03-12 174 views
1

我使用的GridView选择多条记录,然后播放循环在它的每个记录ID分别发送到数据库和更新,但我并不觉得实现,因为它打开非常好的方式和密切的联系,每次有啥好方法?这段代码会浪费资源吗?

foreach (GridViewRow r in grdViewLastHearingDates.Rows) 
    { 
     int CaseHearingID = Convert.ToInt32(r.Cells[0].Text); 
     CheckBox chkBox = r.FindControl("chkBoxIsConveyed") as CheckBox; 

     TextBox txtboxConvenienceRemarks = r.FindControl("txtBoxConvenienceRemarks") as TextBox; 
     string ConvenienceRemarks = txtboxConvenienceRemarks.Text; 

     MngCaseHearings.UpdateCasesIsConveyed(CaseHearingID, ConvenienceRemarks, chkBox.Checked); 
    } 

MngCaseHearings.UpdateCasesIsConveyed每次发送并执行此代码以更新每个ID。请检查并给出建议

public Boolean UpdateCasesIsConveyed(int CaseHearingID, string ConvenienceRemarks, bool IsConveyed) 
    { 

     try 
     { 
      SqlCommand SqlCom = new SqlCommand("UpdateCasesIsConveyed", DatabaseConnection.OpenConnection()); 
      SqlCom.CommandType = CommandType.StoredProcedure; 
      SqlCom.Parameters.AddWithValue("@pk_CaseHearings_ID ", CaseHearingID); 
      SqlCom.Parameters.AddWithValue("@IsConveyed", IsConveyed); 
      SqlCom.Parameters.AddWithValue("@ConvenienceRemarks", ConvenienceRemarks); 

      SqlParameter SqlParamReturnStatus = new SqlParameter("@ReturnStatus", SqlDbType.Bit); 
      SqlCom.Parameters.Add(SqlParamReturnStatus); 
      SqlParamReturnStatus.Direction = ParameterDirection.Output; 

      SqlParameter SqlParamReturnStatusMessage = new SqlParameter("@ReturnStatusMessage", SqlDbType.VarChar, -1); 
      SqlCom.Parameters.Add(SqlParamReturnStatusMessage); 
      SqlParamReturnStatusMessage.Direction = ParameterDirection.Output; 

      SqlCom.ExecuteNonQuery(); 

      string ReturnStatusMessage = Convert.ToString(SqlParamReturnStatusMessage); 
      Boolean ReturnStatus = Convert.ToBoolean(SqlParamReturnStatus.Value); 

      return ReturnStatus; 
     } 
catch (Exception) 
      { 

       throw; 
      } 

      finally 
      { 
       DatabaseConnection.CloseConnection(); 
      } 

这会浪费资源,所以如果有什么好的解决办法?

+0

什么是'DatabaseConnection'? – spender

+0

类对象调用一个静态方法来打开连接到数据库 – Stacky

回答

0

由于SqlConnectionSqlCommand对象都实现了IDisposable,所以您应该在完成后处理它们。最简单的方法是通过using声明:

using (var conn = DatabaseConnection.OpenConnection()) 
using (var SqlCom = new SqlCommand("UpdateCasesIsConveyed", conn)) 
{ 
    // setup and execute the SP, can return from in here 
} 

这将确保对象使用的资源是否正确,只要你完成关闭。虽然这不是绝对必要的 - 当垃圾回收销毁对象Dispose方法将被调用 - 这将确保你没有举行公开的数据库对象超过必要下去了。根据这种调用的频率,最终可能导致SQL服务器资源短缺,手柄使用过多等。

一般而言,实现IDisposable的任何内容应尽快处理。


(对不起,错过了问题的环部)

这种类型的创建/销毁周期是罚款单操作,而是用来更新大量的记录时变得浪费。我会把循环放在代码的中间,而不是从外面反复调用这些代码。

我会创建包含SP参数记录类或结构,并通过该记录类的IEnumerable你的更新方法。这样,您就可以做一次安装,过程中的所有更新,然后推倒数据库对象全部进行了更改后。抛出一个事务,如果其中一条记录失败,您可以将其全部撤销。

喜欢的东西:

public struct UpdateCaseConveyanceRec 
{ 
    public int CaseHearingID; 
    public string ConvenienceRemarks; 
    public bool IsConveyed; 
} 

public bool UpdateCasesIsConveyed(IEnumerable<UpdateCaseConveyanceRec> uopdates) 
{ 
    using (SqlConnection conn = DatabaseConnection.OpenConnection()) 
    using (SqlCommand cmd = new SqlCommand("UpdateCasesIsConveyed", conn)) 
    using (SqlTransaction trans = conn.BeginTransaction("UpdateCasesIsConveyed")) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     var pID = cmd.Parameters.Add("@pk_CaseHearings_ID", SqlDbType.Int); 
     var pConveyed = cmd.Parameters.Add("@IsConveyed", SqlDbType.Bit); 
     var pRemarks = cmd.Parameters.Add("@ConvenienceRemarks", SqlDbType.VarChar, -1); 

     var retStatus = cmd.Parameters.Add("@ReturnStatus", SqlDbType.Bit); 
     retStatus.Direction = ParameterDirection.Output; 

     var retStatusMsg = cmd.Parameters.Add("@ReturnStatusMessage", SqlDbType.VarChar, -1); 
     retStatusMsg.Direction = ParameterDirection.Output; 

     try 
     { 
      foreach (var row in updates) 
      { 
       pID.Value = row.CaseHearingID; 
       pConveyed.Value = row.IsConveyed; 
       pRemarks.Value = row.ConvenienceRemarks; 

       cmd.ExecuteNonQuery(); 

       if (!Convert.ToBoolean(retStatus)) 
       { 
        trans.Rollback(); 
        return false; 
       } 
      } 

      trans.Commit(); 
     } 
     catch() 
     { 
      trans.Rollback(); 
      throw; 
     } 

     return true; 
    } 
} 

可以再喂与一个LINQ到对象查询:

var source = 
    from r in grdViewLastHearingDates.Rows.OfType<GridViewRow>() 
    select new UpdateCaseConveyanceRec 
    { 
     CaseHearingID = Convert.ToInt32(r.Cells[0].Text), 
     ConvenienceRemarks = (r.FindControl("txtBoxConvenienceRemarks") as TextBox).Text; 
     IsConveyed = (r.FindControl("chkBoxIsConveyed") as CheckBox).Checked 
    }; 

bool updated = UpdateCasesIsConveyed(source); 
+0

见我的代码去投GridView和发送每个行,然后针对更新query.so在这种情况下,我应该怎么去与数据库? – Stacky

+0

@JamesZ谢谢 - 错别字是代码的祸根:P – Corey

相关问题