C#错误:输入字符串的格式不正确

use*_*217 1 c# sql format visual-studio

我收到此错误:“输入字符串的格式不正确。”

这是我的代码:

    private void UpdatePOdetailBalance(int Qty)
    {
        int newbal;

        SqlCommand com = new SqlCommand();

        com.Connection = cn;

        newbal = Convert.ToInt16(txtQtyOrdered.Text) - Qty;
        com.CommandText =
            "UPDATE PODetail SET BalanceQty="+ newbal +" WHERE OrderID=" +
             Convert.ToInt16(txtPONumber.Text) + "AND ItemID=" +
             Convert.ToInt16(txtItemNo.Text);


        com.ExecuteNonQuery();

    }

    private void btnOK_Click(object sender, EventArgs e)
    {

            UpdatePOdetailBalance(Convert.ToInt16(txtQuantity.Text));

    }
Run Code Online (Sandbox Code Playgroud)

我想计算等于txtQtyOrdered减去数量的newbal,但我收到此错误,请为此提供帮助。谢谢。

Ste*_*eve 5

您的错误消息指出的问题可能在试图将文本框中的值转换为短整数的其中一行上。如果不进行任何检查,则用户键入的值可以是数字以外的任何值,并且会收到此错误消息(例如,如果用户将文本框留空)。

您应在尝试执行查询之前尝试检查是否可以使用TryParse将文本框内容转换为有效的短整数。

int ordered;
if(!int16.TryParse(txtQtyOrdered.Text, out ordered))
{
    MessageBox.Show("Invalid number for Ordered quantity");
    return;
}
int orderID;
if(!int16.TryParse(txtPONumber.Text, out orderID))
{
    MessageBox.Show("Invalid number for OrderId");
    return;
}
int itemID;
if(!int16.TryParse(txtItemNo.Text, out itemID))
{
    MessageBox.Show("Invalid number for ItemID");
    return;
}
Run Code Online (Sandbox Code Playgroud)

此时,您可以使用转换后的短整数执行计算,然后以这种方式编写查询(在AND之前添加一个空格)

  com.CommandText =
        "UPDATE PODetail SET BalanceQty="+ newbal.ToString() +
        " WHERE OrderID=" + orderID.ToString() + 
        " AND ItemID=" + itemID.ToString();
Run Code Online (Sandbox Code Playgroud)

但是,绝不建议将查询文本和用户输入的字符串串联作为一种好习惯(在您的情况下,这是无害的,因为如果转换成功,则不必担心Sql Injection,但是不要养成这样做的习惯) )。
因此,编写此查询的理想方法是使用参数化查询

  com.CommandText =
        "UPDATE PODetail SET BalanceQty=@newbal " +
        " WHERE OrderID=@orderID " + 
        " AND ItemID= @itemID"

  com.Parameters.AddWithValue("@newbal", newBal);
  com.Parameters.AddWithValue("@orderID", orderID);
  com.Parameters.AddWithValue("@itemID", itemID);
  com.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

作为一篇关于参数化查询以及为什么要使用它们的好文章,我建议阅读 Jeff Atwood的这些旧词