更新查询时出错[使用String.Format]

时间:2011-09-30 08:04:18

标签: sql-update string.format

我正在尝试编写一个更新语句,用于将数据从asp.net gridview插入到sql server 2005数据库。但是它显示错误,请告诉我如何解决。

cmdUpdate.CommandText = String.Format("Update Products SET ProductName=
{0},UnitsInStock={1},UnitsOnOrder={2},ReorderLevel={3} WHERE ProductID={4} AND 
SupplierID={5}", "productname.Text, unitsinstock.Text, unitsonorder.Text,  
recorderlevel.Text, employeeid.Text, supplierid.Text");

错误是 - 索引(从零开始)必须大于或等于零且小于参数列表的大小。

2 个答案:

答案 0 :(得分:2)

您对string.Format的语法不正确 - 字符串模板后面的每个参数都应该是自己的,没有围绕它们的双引号...

这会有效(请注意我已经从'productname.Text'之前和'supplierid.Text'之后删除了双引号):

String.Format("Update Products SET ProductName={0}, UnitsInStock={1}, UnitsOnOrder={2}, ReorderLevel={3} WHERE ProductID={4} AND SupplierID={5}", 
    productname.Text, unitsinstock.Text, unitsonorder.Text, 
    recorderlevel.Text, employeeid.Text, supplierid.Text);

答案 1 :(得分:0)

你错过了争论,

例如,

str=String.Format("{0} {1}",arg1,arg2);

不要使用hard-coded sql字符串。尝试学习/使用参数化查询。

编辑:

string ConnectionString = "put_connection_string";
using (SqlConnection con = new SqlConnection(ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand())
    {
        string sql = "Update Products SET 
                ProductName=@ProductName,
                UnitsInStock=@UnitsInStock,
                UnitsOnOrder=@UnitsOnOrder,
                ReorderLevel=ReorderLevel 
                WHERE ProductID=ProductID AND SupplierID=@SupplierID";
        cmd.CommandText = sql;
        cmd.Connection = con;
        cmd.Parameters.Add("@ProductName", System.Data.SqlDbType.VarChar, 50).Value =productname.Text;
        cmd.Parameters.Add("@UnitsInStock", System.Data.SqlDbType.Int).Value =unitsinstock.Text;
        cmd.Parameters.Add("@UnitsOnOrder", System.Data.SqlDbType.Int).Value =unitsonorder.Text;
        cmd.Parameters.Add("@ReorderLevel ", System.Data.SqlDbType.Int).Value =recorderlevel.Text;
        cmd.Parameters.Add("@ProductID", System.Data.SqlDbType.Int).Value =producteid.Text;
        cmd.Parameters.Add("@SupplierID", System.Data.SqlDbType.Int).Value =supplierid.Text;

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

编辑:什么是C#using block?

  1. If the type implements IDisposable, it automatically disposes it
  2. Provides a convenient syntax that ensures the correct use of IDisposable objects.
  3. Avoiding Problems with the Using Statement