更新,插入到sql ..已经有一个打开的DataReader关联

时间:2012-12-30 01:01:31

标签: c# asp.net sql

enter image description here

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

何时进行演绎

myda.InsertCommand.ExecuteNonQuery();

myda.UpdateCommand.ExecuteNonQuery();

我收到了错误信息 已经有一个与此命令关联的开放DataReader必须先关闭

如果我关闭dr,结果会很混乱。如果它在表的第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

仍然存在更新或插入第二行的问题,如果我填充第一个第一个记录并将第二个记录留空,它会将其插入到数据库但不会再次插入到第二行,而是会重复第一行记录。 interchangablly,因为我先填写第二行。如果我填写两个如果他们@开始它将插入他们两个但不会识别第二个记录并将复制第一个记录?

1 个答案:

答案 0 :(得分:0)

在确定是否有任何结果后立即关闭博士;除了确定记录是否存在之外,你没有使用它,所以这根本不会影响你的逻辑。

替换:

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,这样可以完全消除您的问题。