-1

在此处输入图像描述

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 与此命令关联,必须先关闭

如果我关闭博士,结果会很混乱。如果它在表的第 2 行找到记录,它将从表中插入第 1 行的记录到我尝试启用 MultipleActiveResultSets="true" 的数据库中,但我遇到了一个问题,属性不允许!

我想检查记录是否存在,更新其他,插入。如何实现这一点或如何更正我的代码?

版后:

#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

更新或插入第二行仍然存在问题,如果我填写第一条记录并将第二条记录留空,它将将其插入数据库,但不会接受稍后插入第二行,而是复制第一行记录。可互换,因为如果我先填充第二行。如果我同时填写它们@开头,它将同时插入它们,但不会识别第二条记录并复制第一条记录?

4

1 回答 1

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

于 2012-12-30T01:37:10.237 回答