1

我有一个 GridView,其中有复选框作为项目模板,并且在更改复选框时我正在更新 GridView。这是我的 GridView 代码:

<Columns>
    <telerik:GridTemplateColumn>
    <ItemTemplate>
        <asp:CheckBox ID="chkcelar" runat="server" Text="Clear" OnCheckedChanged="chkclearchng" AutoPostBack="true"/>
    </ItemTemplate>
    </telerik:GridTemplateColumn>
        <telerik:GridBoundColumn DataField="BPV_NUM" DataType="System.Int64"
            DefaultInsertValue="" HeaderText="BPV No" SortExpression="BPV_NUM" 
            UniqueName="BPV_NUM">
        </telerik:GridBoundColumn>
</Columns>

这是我更新网格视图的c#代码

protected void chkclearchng(object sender, EventArgs e)
    {
        OleDbConnection con = new OleDbConnection("Data Source=sml; User ID=sml; Password=sml; provider=OraOLEDB.Oracle");
        OleDbCommand cmd  = new OleDbCommand();
        CheckBox chkcelar = ((CheckBox)(sender));
        GridDataItem  row = ((GridDataItem)(chkcelar.NamingContainer));
        long bpvnum = row.Cells[1].Text;

        if (chkcelar.Checked ) {
            cmd.CommandText = @"update sml.FND_01_11@wbg set CLR_FLG=1, CLR_DTE=sysdate where bpv_num=:bpv_num and bpv_dte=:bpv_dte";
        }
        else {
            cmd.CommandText = @"update sml.FND_01_11@wbg set CLR_FLG=0, CLR_DTE=sysdate where bpv_num=:bpv_num and bpv_dte=:bpv_dte";
        }
        cmd.CommandType = CommandType.Text;
        cmd.Connection  = con;

        cmd.Parameters.Add(":bpv_num",OleDbType.BigInt).Value = bpvnum;
        cmd.Parameters.Add(":bpv_dte",OleDbType.Date).Value   = RadComboBox1.SelectedValue;

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

    }

问题是当我更改复选框时出现此错误:

输入字符串的格式不正确。

谁能告诉我可能是什么问题,我该如何解决?

4

4 回答 4

1

可能是你应该使用

long bpvnum = long.Parse(row.Cells[1].Text);

如果不起作用,那么在这条线上

cmd.Parameters.Add(":bpv_dte",OleDbType.Date).Value   = RadComboBox1.SelectedValue

您需要参数类型OleDbType.Date,但您正在分配RadComboBox1.SelectedValue

所以你需要转换你的

RadComboBox1.SelectedValue to OleDbType.Date

或者你应该简单地使用 DateTimePicker 而不是 ComboBox

于 2012-12-22T11:09:48.337 回答
1

像这样更改您的代码:

    protected void chkclearchng(object sender, EventArgs e)
    {
        using (OleDbConnection con = new OleDbConnection("Data Source=sml; User ID=sml; Password=sml; provider=OraOLEDB.Oracle"))
        {
            con.Open();
            using (OleDbCommand cmd = new OleDbCommand(null, con))
            {
                CheckBox chkcelar = ((CheckBox)(sender));
                GridDataItem row = ((GridDataItem)(chkcelar.NamingContainer));
                long bpvnum = Convert.ToInt64(row.Cells[1].Text);
                if (chkcelar.Checked)
                {
                    cmd.CommandText = @"update sml.FND_01_11@wbg set CLR_FLG=1, CLR_DTE=sysdate where bpv_num=@bpv_num and bpv_dte=@bpv_dte";
                }
                else
                {
                    cmd.CommandText = @"update sml.FND_01_11@wbg set CLR_FLG=0, CLR_DTE=sysdate where bpv_num=@bpv_num and bpv_dte=@bpv_dte";
                }
                cmd.Parameters.Add(new OleDbParameter("@bpv_num", bpvnum));
                cmd.Parameters.Add(new OleDbParameter("@bpv_dte", Convert.ToDateTime(RadComboBox1.SelectedValue)));
                cmd.ExecuteNonQuery();
            }
        }
    }
于 2012-12-22T11:14:33.463 回答
0

使用快速窗口检查“row.Cells[1].Text”上的值是什么。

于 2012-12-24T07:05:11.740 回答
0

您的代码中的问题是由于从“string”到“OleDbType.Date”的错误类型转换。所以替换下面的代码

cmd.Parameters.Add(":bpv_dte",OleDbType.Date).Value   = RadComboBox1.SelectedValue;

使用以下代码

cmd.Parameters.Add(New OleDb.OleDbParameter("@bpv_dte", OleDb.OleDbType.Date));
cmd.Parameters("@bpv_dte").Value = RadComboBox1.SelectedValue.ToString("d");

如果有更多行用于插入,请确保将所有类型正确转换为 OleDbType。

于 2012-12-24T10:57:57.553 回答