2012-12-30 121 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行中。我相信它不应该在它们之间混合,因为我使用数组提交给数据库。 –