1
    <asp:DropDownList ID="DDLStatusChange" runat="server" AppendDataBoundItems="true">
    <asp:ListItem>-Select-</asp:ListItem>
    <asp:ListItem>Just Received</asp:ListItem>
    <asp:ListItem>Post Approval</asp:ListItem>
    </asp:DropDownList>
    <asp:TextBox ID="txtStatusChange" runat="server" Width="200"></asp:TextBox>
    <asp:Button ID="btnStatuschange"
        runat="server" Text="Status Change" onclick="btnStatuschange_Click" />

コード ビハインド C#

protected void btnStatuschange_Click(object sender, EventArgs e)
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["OptimaWebCustomerQueryCon"].ConnectionString))
        {
            conn.Open();
            string str = @"Update TblMasterinfo SET AppLoanStatus=@AppLoanStatus Where appid in (@Statuschange)";
            using (SqlCommand com = new SqlCommand(str, conn))
            {
                com.Parameters.AddWithValue("@Statuschange", Convert.ToInt32(txtStatusChange.Text));
                com.Parameters.AddWithValue("@AppLoanStatus",DDLStatusChange.SelectedValue);
                com.ExecuteNonQuery();
            }

            conn.Close();
        }
    }

問題:

txtStatusChange にこれらの更新レコードの appid を入力します。複数の記録を更新するとエラーが発生する

例外の詳細: System.FormatException: Input string was not in a correct format.

4

2 に答える 2

2

入力からリストを作成してみてください

var ids = (from x in String.Split(',', txtStatusChange.Text)
           select int.Parse(x.Trim())).ToList();

com.Parameters.AddWithValue("@Statuschange", ids);

更新: List パラメーターの使用を避けるには (SQL サーバーでは機能しない可能性があります)、次のアプローチを使用できます。

var ids = (from x in String.Split(',', txtStatusChange.Text)
           select int.Parse(x.Trim())).ToList();    
var idString = String.Join(',', ids);

var str = String.Format(
    @"Update TblMasterinfo SET ... Where appid IN ({0})", idString);

文字列をリストにキャストして新しい文字列を作成しているので、これは SQL インジェクションから救われるので、ここでパラメーターを使用しなくてもかまいません。

于 2013-06-10T05:45:34.040 に答える
0

IN 句に通常の SQL パラメーターを使用することはできませんが、テーブル値パラメーターを使用することはできます。この回答を確認してください。しかし、それは少し複雑です

以下のように、パラメータなしでSQL文字列を作成できます。それは簡単な方法ですが、入力が適切に検証されていることを確認してください

string input ="17110,17147,17524,17736,15906,17268,16440,17241";
string str = string.Format("Update TblMasterinfo SET AppLoanStatus=@AppLoanStatus Where appid in ({0})",input);
using (SqlCommand com = new SqlCommand(str, conn))
{
    com.Parameters.AddWithValue("@Statuschange", Convert.ToInt32(txtStatusChange.Text));
    com.ExecuteNonQuery();
}
于 2013-06-10T05:52:48.693 に答える