gridview에서 2 개 이상의 값을 저장할 때이 오류가 발생합니다.
연결이 닫히지 않았습니다. 연결의 현재 상태가 열려 있습니다.
그러나 프로세스가 진행되고 데이터를 저장하고 업데이트합니다. 이 오류를 어떻게 제거 할 수 있습니까?
내 코드는 다음과 같습니다.
for(int i = 0; i < gvModal.Rows.Count; i++)
{
string dateA = DateTime.Now.ToString("yyyy-MM-dd");
Utility u = new Utility();
string conn = u.connect();
Label type = (Label)gvModal.Rows[i].Cells[1].FindControl("lbltype");
Label model = (Label)gvModal.Rows[i].Cells[2].FindControl("lblModel");
Label quantity = (Label)gvModal.Rows[i].Cells[3].FindControl("lblQuan");
Label unit = (Label)gvModal.Rows[i].Cells[4].FindControl("lblUnit");
int bal = Convert.ToInt32(gvModal.Rows[i].Cells[4].Text);
int forIssue = 0;
int forPO = 0;
if (bal != 0)
{
forIssue = 1;
forPO = 0;
}
else
{
forIssue = 0;
forPO = 1;
}
SqlConnection connUser = new SqlConnection(conn);
SqlCommand read = connUser.CreateCommand();
string query = "INSERT INTO Mosef_Alert values (@Mosef_No, @Branch, @BU, @Dept, @Section, @Requisitioner, @Accepted, @Date_Accepted, @Reason, @MOSEF_Date, @type, @model, @quantity, @unit)";
connUser.Open();
read.CommandText = query;
read.Parameters.Add(new SqlParameter("@Mosef_No", transIDs));
read.Parameters.Add(new SqlParameter("@Branch", branch));
read.Parameters.Add(new SqlParameter("@BU", bu));
read.Parameters.Add(new SqlParameter("@Dept", dept));
read.Parameters.Add(new SqlParameter("@Section", sec));
read.Parameters.Add(new SqlParameter("@Requisitioner", requisitioner));
read.Parameters.Add(new SqlParameter("@Accepted", accept));
read.Parameters.Add(new SqlParameter("@Date_Accepted", dateA));
read.Parameters.Add(new SqlParameter("@Reason", reason));
read.Parameters.Add(new SqlParameter("@MOSEF_Date", lblDateFiled.Text));
read.Parameters.Add(new SqlParameter("@type", type.Text));
read.Parameters.Add(new SqlParameter("@model", model.Text));
read.Parameters.Add(new SqlParameter("@quantity", quantity.Text));
read.Parameters.Add(new SqlParameter("@unit", unit.Text));
read.Parameters.Add(new SqlParameter("@For_PO", forPO));
read.Parameters.Add(new SqlParameter("@For_Issuance", forIssue));
read.ExecuteNonQuery();
read.Parameters.Clear();
}
ExecuteUpdate(accept);
UpdateStatus();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@"<script type ='text/javascript'>");
sb.Append("alert('Records Updated');");
sb.Append("$('#editModal').modal('hide');");
sb.Append(@"</script>");
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "EditHideModalScript", sb.ToString(), false);
}
public void UpdateStatus()
{
Utility u = new Utility();
string conn = u.connect();
SqlConnection connUser = new SqlConnection(conn);
SqlCommand read = connUser.CreateCommand();
for(int i = 0; i < gvModal.Rows.Count; i++)
{
Label ItemID = (Label)gvModal.Rows[i].Cells[1].FindControl("lblID");
Label stat = (Label)gvModal.Rows[i].Cells[8].FindControl("ItemStatus");
int balance = Convert.ToInt32(gvModal.Rows[i].Cells[4].Text);
string status;
if(balance != 0)
{
status = "For Issuance";
}
else
{
status = "For PO";
}
string upd = "UPDATE ItemTransaction SET ItemStatus = '" + status +"' WHERE ID = '"+ ItemID.Text +"'";
connUser.Open();
read.CommandText = upd;
read.Parameters.Clear();
read.ExecuteNonQuery();
}
}
public void ExecuteUpdate(int stat)
{
string upStat = null;
if (stat == 1)
{
upStat = "Accepted";
}
else
{
upStat = "Denied";
}
string id = transID.Text;
Utility u = new Utility();
string conn = u.connect();
SqlConnection connUser = new SqlConnection(conn);
string up = "UPDATE MosefTransaction SET TransStatus = '"+ upStat +"' WHERE TransactionID = '"+ id +"'";
connUser.Open();
SqlCommand cm = new SqlCommand(up, connUser);
//cm.Parameters.AddWithValue("@ID", id);
//cm.Parameters.AddWithValue("@TransStatus", upStat);
cm.Parameters.Clear();
cm.ExecuteNonQuery();
connUser.Close();
}
먼저 일반 텍스트 쿼리가 SqlInjection에 대한 넓은 문을 엽니 다 . 따라서 매개 변수화 된 쿼리를 사용하십시오. 이제 코드를 살펴 보겠습니다. 문제는 UpdateStatus
메서드에 있습니다. 반복하는 동안 연결을 열고 닫지 않고 그대로 두었으므로 다음 반복에서 연결을 다시 열려고하면 오류가 발생합니다. 여러 가지 방법으로이를 피할 수 있습니다.
connUser.Close()
ConnectionState
Enumeration을 사용 하여 새 연결을 열기 전에 연결 상태를 확인할 수 있습니다 . 상태가 열려 있지 않을 때만 엽니 다.다음 코드를 사용하여 수행 할 수 있습니다.
if (connUser.State != ConnectionState.Open)
connUser.Open();
3. 루프 외부에서 연결을 열고 루프 전체에서 동일한 방법을 사용합니다. 쿼리를 실행 한 후 각 반복에서 매개 변수를 지 웁니다.
예를 들어 코드를 고려하십시오.
using (SqlConnection connUser = new SqlConnection(conn))
{
string upd = "UPDATE ItemTransaction SET ItemStatus = @status WHERE ID = @id";
connUser.Open();
SqlCommand commandSQL = connUser.CreateCommand();
for (int i = 0; i < gvModal.Rows.Count; i++)
{
// Get values here using your code
commandSQL.Parameters.Add("@status", SqlDbType.VarChar).Value = status;
commandSQL.Parameters.Add("@id", SqlDbType.VarChar).Value = ItemID.Text;
commandSQL.ExecuteNonQuery();
commandSQL.Parameters.Clear();
}
}
참고 : 가장 좋은 옵션은 세 번째 옵션입니다. 다른 상황에서 도움이 될 나머지 참고 사항은 다음과 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다