0

这个问题源于一篇网络文章在弹出窗口中插入和更新一行 GridView。在这里

单击 GridView 中的编辑按钮,您会看到一个弹出窗口进行编辑。您编辑窗口并单击“保存”将其保存在数据库中。保存方法是:

protected void Save(object sender, EventArgs e)
{

    
    
    using (SqlCommand cmd = new SqlCommand())

    {
        cmd.CommandType = CommandType.StoredProcedure;
        //cmd.CommandText = "AddUpdateCustomer";

        cmd.CommandText = "UPDATE [Customers] SET [CompanyName] = @CompanyName ,[ContactName] = @ContactName WHERE CustomerID = @CustomerID";


        cmd.Parameters.AddWithValue("@CustomerID", txtCustomerID.Text);
        cmd.Parameters.AddWithValue("@ContactName", txtContactName.Text);
        cmd.Parameters.AddWithValue("@CompanyName", txtCompany.Text);
        
        GridView1.DataSource =  this.GetData(cmd);
        GridView1.DataBind();

        

        cmd.ExecuteNonQuery();

        
    }
}

在线文章使用了cmd.CommandText我更改的注释行,因为它不起作用,也没有找到它的实用性。我还添加了最后一行 cmd.ExecuteNonQuery();来执行查询但实际上数据库没有变化。

该方法可能有什么问题Save以及如何处理该错误?

4

2 回答 2

0

您已请求调用存储过程,但您注释掉的行是包含存储过程名称的行。

看起来您实际上是在执行原始 SQL,因此您应该尝试:

cmd.CommandType = CommandType.Text;

但是您的 CommandText 行也不起作用,因为它不是真正的 SQL。它需要包含变量的内容而不是变量名。而且您应该执行查询而不是非查询。

protected void Save(object sender, EventArgs e)
{
    using (SqlCommand cmd = new SqlCommand())
    {
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = String.Concat("UPDATE [Customers] SET [CompanyName] = ", txtCompany.Text, ", [ContactName] = ", txtContactName.Text, " WHERE CustomerID = ", txtCustomerId.Text, ";");

etc
于 2013-01-10T16:11:09.873 回答
0

您需要编写代码以在页面加载时填充文本框,如下所示:

public page_load()
{
   if(!ispostBack)
   {
     // Write code to fill controls first time
    }
}

这是因为在每次回发时,asp.net 都会将控件值保存在视图状态中,并且当从服务器控件返回的页面填充有旧值并且数据库表将使用旧值而不是新值进行更新时

于 2013-12-30T06:31:00.127 回答