0

如果我尝试更新表中的 2 个不同的 ID,我会收到此错误“必须声明标量变量“Post_ID”。换句话说,我可以根据需要进行多次更新,例如 ID #25,但如果我尝试更新 ID # 26 然后我收到上面的错误。我的插入功能只有我的更新功能才能正常工作。请帮助,我感谢您的时间。注意,DateKeyNames = ID。这是我仅用于更新的代码:

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "UPDATE MyTable SET Post_ID=@Post_ID, Date=@Date, Description=@Description WHERE ID=@ID";

            TextBox myTextBox11 = GV_InlineEditing.Rows[0].FindControl("GV_Post_ID") as TextBox;
            TextBox myTextBox22 = GV_InlineEditing.Rows[0].FindControl("TextBox2") as TextBox;
            TextBox myTextBox33 = GV_InlineEditing.Rows[0].FindControl("TextBox3") as TextBox;

            if (myTextBox11 != null)
            {
                cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = myTextBox11.Text;
            }
            else
            {
                TextBox GV_Post_ID = GV_InlineEditing.Rows[0].Cells[0].FindControl("GV_Post_ID") as TextBox;

            }


            if (myTextBox22 != null)
            {
                cmd.Parameters.Add("@Date", SqlDbType.VarChar).Value = myTextBox22.Text;
            }
            else
            {
                TextBox GV_Post_ID = GV_InlineEditing.Rows[0].Cells[0].FindControl("Date") as TextBox;

            }


            if (myTextBox33 != null)
            {
                cmd.Parameters.Add("@Description", SqlDbType.VarChar).Value = myTextBox33.Text;
            }
            else
            {
                TextBox GV_Post_ID = GV_InlineEditing.Rows[0].Cells[0].FindControl("Description") as TextBox;

            }
            cmd.Parameters.Add("@ID", SqlDbType.Int).Value = Convert.ToInt32(GV_InlineEditing.Rows[e.RowIndex].Cells[1].Text);


            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();

        }


        GV_InlineEditing.EditIndex = -1;
        BindData();
4

2 回答 2

1

您的逻辑有些错误:

if (myTextBox11 != null)
{
    //add paramter
    cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = myTextBox11.Text;
}
else
{
    //declare a different textbox and do not add the SQL parameter
    TextBox GV_Post_ID = GV_InlineEditing.Rows[0].Cells[0].FindControl("GV_Post_ID") as TextBox;
}

对于myTextBox22和重复这种模式myTextBox33

我会建议这个逻辑:

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString);
SqlCommand cmd = new SqlCommand();

cmd.CommandText = "UPDATE MyTable SET Post_ID=@Post_ID, Date=@Date, Description=@Description WHERE ID=@ID";

TextBox myTextBox11 = GV_InlineEditing.Rows(0).FindControl("GV_Post_ID") as TextBox;
TextBox myTextBox22 = GV_InlineEditing.Rows(0).FindControl("Date") as TextBox;
TextBox myTextBox33 = GV_InlineEditing.Rows(0).FindControl("Description") as TextBox;

if (myTextBox11 == null) {
    //try an alternate control for myTextBox11
    myTextBox11 = GV_InlineEditing.Rows(0).Cells(0).FindControl("GV_Post_ID") as TextBox;
}

if (myTextBox22 == null) {
    //try an alternate control for myTextBox22
    myTextBox22 = GV_InlineEditing.Rows(0).Cells(0).FindControl("Date") as TextBox;
}

if (myTextBox33 == null) {
    //try an alternate control for myTextBox33
    myTextBox33 = GV_InlineEditing.Rows(0).Cells(0).FindControl("Description") as TextBox;
}

if (myTextBox11 != null & myTextBox22 != null & myTextBox33 != null) {
    //all three textbox controls found
    cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = myTextBox11.Text;
    cmd.Parameters.Add("@Date", SqlDbType.VarChar).Value = myTextBox22.Text;
    cmd.Parameters.Add("@Description", SqlDbType.VarChar).Value = myTextBox33.Text;
    cmd.Parameters.Add("@ID", SqlDbType.Int).Value = Convert.ToInt32(GV_InlineEditing.Rows(e.RowIndex).Cells(1).Text);

    cmd.Connection = con;
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
}

更新

为、和添加else条件。Throw New Exception("myTextBox11 is null");myTextBox11myTextBox22myTextBox33

这将允许您查看两者是否:

GV_InlineEditing.Rows(0).FindControl("Date") as TextBox;

和:

GV_InlineEditing.Rows(0).Cells(0).FindControl("GV_Post_ID");

失败了。

于 2012-10-22T22:40:39.713 回答
0

我总是做这样的事情:

 protected void Gridview1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {

            GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
            int id = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString());
            TextBox date = (TextBox)row.FindControl("date");

            SqlCommand cmd = new SqlCommand();
            cmd.CommandText =    "update t_your_table " +
                                 "set " +                                 
                                 "date = @date, " +             
                                 " time = @time  where id = @ID "                             


        cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = id;           
        cmd.Parameters.Add("@date", SqlDbType.VarChar).Value = date.Text;      

您必须将 datakeyname 放入变量中。这样,无论单击哪一行,它都会使用该字段。

于 2012-10-22T23:12:03.817 回答