更新抛出范围异常的行单元格

时间:2015-07-27 15:46:18

标签: c# asp.net sql-server stored-procedures webforms

我正在尝试在webform应用中更新gridview中的一行,我收到格式异常。我的其他存储过程正在运行,我已根据此代码检查了这些,但无法找到此失败的位置。应用程序中的所有其他内容都在运行

感谢任何帮助,谢谢。

我的存储过程。

CREATE PROCEDURE UpdateProd 
    @pId int, @catId int, 
    @pname varchar(15), 
    @pdesc1 varchar(25), @pdesc2 varchar(50), 
    @pprice dec(8,2)
AS
    UPDATE Prod
    SET CatID = @catId,
        PName = @pname, 
        PDesc1 = @pdesc1, 
        PDesc2 = @pdesc2, 
        Price = @pprice
    WHERE ProdId = @pId;
GO

我的数据绑定等用于更新。

public static void UpdateProduct(string[] param1)
{
    // SqlConnection.
    SqlConnection con = new SqlConnection(conString);

    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "UpdateProd";

    cmd.Parameters.Add("@pId", SqlDbType.Int).Value = param1[0];
    cmd.Parameters.Add("@catId", SqlDbType.Int).Value = param1[1];
    cmd.Parameters.Add("@pname", SqlDbType.VarChar).Value = param1[2];
    cmd.Parameters.Add("@pdesc1", SqlDbType.VarChar).Value = param1[3];
    cmd.Parameters.Add("@pdesc2", SqlDbType.VarChar).Value = param1[4];
    cmd.Parameters.Add("@pprice", SqlDbType.Decimal).Value = param1[5];
    // etc .../

我更新行的方法。

protected void GVProducts_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow row = GVProducts.Rows[e.RowIndex];
    string[] param = { row.Cells[1].Text.ToString(), row.Cells[2].Text.ToString(),
    row.Cells[3].Text.ToString(), row.Cells[4].Text.ToString(), row.Cells[5].Text.ToString(),
    row.Cells[6].Text.ToString() };
    Login.UpdateProduct(param);
}

我对GridView列的标记

<Columns>
    <asp:BoundField DataField="ProdID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
                    SortExpression="ProdID" />
    <asp:BoundField DataField="CatID" HeaderText="Cat" SortExpression="CatID" />
    <asp:BoundField DataField="PName" HeaderText="Product Name" SortExpression="PName" />
    <asp:BoundField DataField="PDesc1" HeaderText="Short Product Description" SortExpression="PDesc1" />
    <asp:BoundField DataField="PDesc2" HeaderText="Long Product Description" SortExpression="PDesc2" />
    <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" />
</Columns>

我得到了

  

System.FormatException

我正在启动行单元格的索引为1,这在选择prodId进行删除时有效。我假设第一列(索引0)被[编辑/选择]占用。我已经测试了在两个方向上改变指数,这没有帮助。

enter image description here

修改

实际行只显示Cells索引= 1.较大的索引会抛出超出范围的异常。所以这很奇怪。在设置gridview时,有什么我需要知道的吗,重新单元?

1 个答案:

答案 0 :(得分:2)

我要做的第一件事就是停止构建并传递一个字符串数组。相反,我会传递每个参数。它更容易编码,更容易调试,消除了很多歧义。您还可以指定数据类型,这可能是此处的问题。你传入字符串,然后希望它们可以隐式地转换为int。非主题但我也建议在USING中包装您的连接。