2012-12-30 90 views
-1

enter image description here更新,插入到SQL ..有已經與

string[] stringList2 = new string[10]; 
if (VaildDataRow == true) 
{       
//Response.Write("<script>alert('2valid data row" + TbRow + "')</script>"); 
TbCol = 0; 
TcCol = 1; 
foreach (TableCell tc in tr.Cells) 
{ 
#region //Load array with valid row text boxes' value 
foreach (Control c1 in tc.Controls) 
{ 
if (c1 is TextBox) 
{ 
if (c1.ID.StartsWith("DataTbFld_")) 
{ 
TextBox txt = (TextBox)t11.FindControl(c1.ID); 
if (string.IsNullOrEmpty(txt.Text)) 
{ 
//Response.Write("<script>alert('txt#id ..not hidden..: " + txt.ID + " found data in textbox, rec is valid , will break')</script>"); 
txt.Text="Null"; 
} 
stringList2[TbCol] = txt.Text.ToString(); 
//Response.Write("<script>alert('TbRow : " + TbRow + " TcCol : " + TcCol + " TbCol : " + TbCol + " txt.Text.ToString() : " + txt.Text.ToString() + "')</script>"); 
} 
TbCol += 1; 
}       
} 
#endregion//=== 
TcCol += 1; 
} 
Response.Write("<script>alert('TbRow : " + TbRow + "')</script>"); 
#region //if exist update else insert 
Response.Write("<script>alert('InputDate = " + stringList2[6] + 
" and Dept= " + stringList2[7] + " and DeptType= " + stringList2[8] + 
" and DeptSubType= " + stringList2[9] + "')</script>"); 
con.Open(); 
cmd = new SqlCommand("SELECT * FROM MainDailyData WHERE Dept= '" + stringList2[7] + "' and DeptType = '" + stringList2[8] + "' and DeptSubType= '" + stringList2[9] + "'", con); 

dr = cmd.ExecuteReader(); 
if (dr != null && dr.HasRows) 
{ 
Response.Write("<script>alert('Found,Update')</script>"); 
SqlDataAdapter myda = new SqlDataAdapter(); 
myda.UpdateCommand = new SqlCommand("UPDATE MainDailyData SET Product1 = @Prod1, Product2 = @Prod2, Product3 = @Prod3, Product4 = @Prod4, Product5 = @Prod5, Product6 = @Prod6, InputDate = @InDate, Dept = @Dpt, DeptType = @DptType, DeptSubType = @DptSubType", con); 
myda.UpdateCommand.Parameters.Add("@Prod1", SqlDbType.VarChar).Value = stringList2[0]; 
myda.UpdateCommand.Parameters.Add("@Prod2", SqlDbType.VarChar).Value = stringList2[1]; 
myda.UpdateCommand.Parameters.Add("@Prod3", SqlDbType.VarChar).Value = stringList2[2]; 
myda.UpdateCommand.Parameters.Add("@Prod4", SqlDbType.VarChar).Value = stringList2[3]; 
myda.UpdateCommand.Parameters.Add("@Prod5", SqlDbType.VarChar).Value = stringList2[4]; 
myda.UpdateCommand.Parameters.Add("@Prod6", SqlDbType.VarChar).Value = stringList2[5]; 
myda.UpdateCommand.Parameters.Add("@InDate", SqlDbType.VarChar).Value = stringList2[6]; 
myda.UpdateCommand.Parameters.Add("@Dpt", SqlDbType.VarChar).Value = stringList2[7]; 
myda.UpdateCommand.Parameters.Add("@DptType", SqlDbType.VarChar).Value = stringList2[8]; 
myda.UpdateCommand.Parameters.Add("@DptSubType", SqlDbType.VarChar).Value = stringList2[9]; 
//dr.Close(); 
//con.Open(); 
myda.UpdateCommand.ExecuteNonQuery(); 
} 
else 
{ 
Response.Write("<script>alert('not Found,Insert')</script>"); 
SqlDataAdapter myda = new SqlDataAdapter(); 
myda.InsertCommand = new SqlCommand("INSERT INTO MainDailyData (Product1,Product2,Product3,Product4,Product5,Product6,InputDate,Dept,DeptType,DeptSubType) VALUES(@Prod1,@Prod2,@Prod3,@Prod4,@Prod5,@Prod6,@InDate,@Dpt,@DptType,@DptSubType)", con); 
myda.InsertCommand.Parameters.Add("@Prod1", SqlDbType.VarChar).Value = stringList2[0]; 
myda.InsertCommand.Parameters.Add("@Prod2", SqlDbType.VarChar).Value = stringList2[1]; 
myda.InsertCommand.Parameters.Add("@Prod3", SqlDbType.VarChar).Value = stringList2[2]; 
myda.InsertCommand.Parameters.Add("@Prod4", SqlDbType.VarChar).Value = stringList2[3]; 
myda.InsertCommand.Parameters.Add("@Prod5", SqlDbType.VarChar).Value = stringList2[4]; 
myda.InsertCommand.Parameters.Add("@Prod6", SqlDbType.VarChar).Value = stringList2[5]; 
myda.InsertCommand.Parameters.Add("@InDate", SqlDbType.VarChar).Value = stringList2[6]; 
myda.InsertCommand.Parameters.Add("@Dpt", SqlDbType.VarChar).Value = stringList2[7]; 
myda.InsertCommand.Parameters.Add("@DptType", SqlDbType.VarChar).Value = stringList2[8]; 
myda.InsertCommand.Parameters.Add("@DptSubType", SqlDbType.VarChar).Value = stringList2[9]; 
//dr.Close(); 
//con.Open(); 
myda.InsertCommand.ExecuteNonQuery(); 
} 
con.Close(); 
#endregion 
} 
#endregion 
TbRow += 1; 
} 

相關聯的打開的DataReader excauting

myda.InsertCommand.ExecuteNonQuery(); 

myda.UpdateCommand.ExecuteNonQuery(); 

我有錯誤味精 有當已經有一個與此命令關聯的打開DataReader,必須先關閉

如果我關閉博士結果將是混亂。如果它在表的第2行中找到記錄,它將從表中將第1行的記錄插入到數據庫中 我試圖啓用MultipleActiveResultSets =「true」,但我得到了一個問題屬性是不允許的!

我想檢查記錄是否存在,更新else,插入。如何實現這個或如何糾正我的代碼?版後

#region //if exist update else insert inserting code 
//Response.Write("<script>alert('InputDate = " + stringList2[6] + 
//" and Dept= " + stringList2[7] + " and DeptType= " + stringList2[8] + 
//" and DeptSubType= " + stringList2[9] + "')</script>"); 
con.Open(); 
//cmd = new SqlCommand("SELECT 1 FROM MainDailyData WHERE Dept= '" + stringList2[7] + 
// "' and DeptType = '" + stringList2[8] + "' and DeptSubType= '" + stringList2[9] + "'", con); 
cmd = new SqlCommand("SELECT 1 FROM MainDailyData WHERE Dept= @dpt and DeptType = @dptType and DeptSubType= @DptSbType", con); 
cmd.Parameters.AddWithValue("@dpt", stringList2[7]); 
cmd.Parameters.AddWithValue("@dptType", stringList2[8]); 
cmd.Parameters.AddWithValue("@DptSbType", stringList2[9]); 

bool fRecordExists = false; 
SqlDataReader dr = cmd.ExecuteReader(); 
//SqlDataReader dr = cmd.ExecuteScalar(); 
if (dr != null && dr.HasRows) 
{ 
fRecordExists = true; 
} 
dr.Close(); 
dr.Dispose(); 
if (fRecordExists) 
{ 
Response.Write("<script>alert('Found,Update')</script>"); 
SqlDataAdapter myda = new SqlDataAdapter(); 
myda.UpdateCommand = new SqlCommand("UPDATE MainDailyData SET Product1 = @Prod1, Product2 = @Prod2, Product3 = @Prod3, Product4 = @Prod4, Product5 = @Prod5, Product6 = @Prod6, InputDate = @InDate, Dept = @Dpt, DeptType = @DptType, DeptSubType = @DptSubType", con); 
myda.UpdateCommand.Parameters.Add("@Prod1", SqlDbType.VarChar).Value = stringList2[0]; 
myda.UpdateCommand.Parameters.Add("@Prod2", SqlDbType.VarChar).Value = stringList2[1]; 
myda.UpdateCommand.Parameters.Add("@Prod3", SqlDbType.VarChar).Value = stringList2[2]; 
myda.UpdateCommand.Parameters.Add("@Prod4", SqlDbType.VarChar).Value = stringList2[3]; 
myda.UpdateCommand.Parameters.Add("@Prod5", SqlDbType.VarChar).Value = stringList2[4]; 
myda.UpdateCommand.Parameters.Add("@Prod6", SqlDbType.VarChar).Value = stringList2[5]; 
myda.UpdateCommand.Parameters.Add("@InDate", SqlDbType.VarChar).Value = stringList2[6]; 
myda.UpdateCommand.Parameters.Add("@Dpt", SqlDbType.VarChar).Value = stringList2[7]; 
myda.UpdateCommand.Parameters.Add("@DptType", SqlDbType.VarChar).Value = stringList2[8]; 
myda.UpdateCommand.Parameters.Add("@DptSubType", SqlDbType.VarChar).Value = stringList2[9]; 
myda.UpdateCommand.ExecuteNonQuery(); 
} 
else 
{ 
Response.Write("<script>alert('not Found,Insert')</script>"); 
SqlDataAdapter myda = new SqlDataAdapter(); 
myda.InsertCommand = new SqlCommand("INSERT INTO MainDailyData (Product1,Product2,Product3,Product4,Product5,Product6,InputDate,Dept,DeptType,DeptSubType) VALUES(@Prod1,@Prod2,@Prod3,@Prod4,@Prod5,@Prod6,@InDate,@Dpt,@DptType,@DptSubType)", con); 
myda.InsertCommand.Parameters.Add("@Prod1", SqlDbType.VarChar).Value = stringList2[0]; 
myda.InsertCommand.Parameters.Add("@Prod2", SqlDbType.VarChar).Value = stringList2[1]; 
myda.InsertCommand.Parameters.Add("@Prod3", SqlDbType.VarChar).Value = stringList2[2]; 
myda.InsertCommand.Parameters.Add("@Prod4", SqlDbType.VarChar).Value = stringList2[3]; 
myda.InsertCommand.Parameters.Add("@Prod5", SqlDbType.VarChar).Value = stringList2[4]; 
myda.InsertCommand.Parameters.Add("@Prod6", SqlDbType.VarChar).Value = stringList2[5]; 
myda.InsertCommand.Parameters.Add("@InDate", SqlDbType.VarChar).Value = stringList2[6]; 
myda.InsertCommand.Parameters.Add("@Dpt", SqlDbType.VarChar).Value = stringList2[7]; 
myda.InsertCommand.Parameters.Add("@DptType", SqlDbType.VarChar).Value = stringList2[8]; 
myda.InsertCommand.Parameters.Add("@DptSubType", SqlDbType.VarChar).Value = stringList2[9]; 
myda.InsertCommand.ExecuteNonQuery(); 
} 
con.Close(); 
#endregion 

仍然問題存在更新或插入第二行,如果我填的第一個第一記錄,並留下第二空後,將其插入到數據庫,但不會eccept任何稍後插入到第二行,它會複製第一行記錄。相互之間,因爲如果我先填滿第二排。如果我填寫兩個,如果他們@開始時它會插入他們兩個,但不會識別第二條記錄,並會複製第一條記錄?

+0

在使用相同連接執行任何其他命令之前,您必須創建新連接或關閉現有閱讀器。 – Matthew

回答

0

在您確定是否有任何結果後立即關閉dr;除了確定記錄是否存在之外,您並未將其用於確定是否存在該記錄,因此這完全不會影響您的邏輯。

替換:

dr = cmd.ExecuteReader(); 
if (dr != null && dr.HasRows) 

有:

 bool fRecordExists = false; 
     dr = cmd.ExecuteReader(); 
     if (dr != null && dr.HasRows) 
     { 
      fRecordExists = true; 
     } 
     dr.Close(); 
     if (fRecordExists) 

你也應該改變select語句的參數化查詢防止SQL注入攻擊,由於數據意外字符的異常。

此外,select語句如果不用於存儲驗證以外的任何其他操作,應該只執行SELECT 1而不是SELECT *,以防止在數據庫和應用程序中進行不必要的處理。

最後,如果您的應用程序數據支持它(即選擇標準將只選擇最多1條記錄),我會建議使用ExecuteScalar而不是ExecuteReader,這將完全消除您的問題。

+0

感謝真正解決它的兄弟,但正如我在遇到奇怪的情況之前遇到的情況,當我試圖編輯這兩個記錄它告訴我,表中第3行的記錄被找到,併成功更新它,但在第4行記錄它告訴我,它沒有被發現,雖然它在那裏,並且它進一步插入記錄在記錄的第3行中。我相信它不應該在它們之間混合,因爲我使用數組提交給數據庫。 –