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

本文关键字:格式 不正确 字符串 输入 错误 | 更新日期: 2023-09-27 18:35:00

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

这是我的代码:

    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));
    }

我想计算等于 txtQtyOrdered 减去数量的 newbal,但我收到此错误,请帮助我解决这个问题。谢谢。

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

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

在尝试执行查询之前,应尝试使用 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;
}

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

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

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

  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();

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

您需要

在"AND"之前放置一个空格,并且您正在尝试将字符串转换为不是整数的整数。

我建议根据以下基于代码的代码审查建议进行更改(按价值顺序列出("修复"的成本/收益((:

  1. 此方法访问数据库不应读取控件以获取其值。 相反,应该有一个事件处理程序,例如按钮单击,它使用 TryParse 解析其他控件的值,正如 gregjer 所回答的那样。 通过隔离 UI 和数据代码,数据访问层更易于测试,并且通过在表面(UI 层(进行分析,将尽快捕获处理错误用户输入的异常。
  2. 动态 SQL 通过数据库或数据访问层中的字符串(w/i .NET (对 SQL 注入开放。 您正在通过解析文本来解决这个问题,您的工作很棒。 但是,这已经由 .NET 团队通过提供参数化命令来处理。 请参阅 MSDN SqlCommand.Parameters 或参阅此处了解简介,包括使用开发人员如何理解本主题:添加 SqlCommand 参数时应何时使用"SqlDbType"和"size"?
  3. 可变命名。 标准 .NET 命名约定将调用 number 而不是 Qty,因为它是一个参数和完整的人类语言名称,而不是速记或缩写,尤其是对于公开可见的位。 智能感知使长变量名不是问题。 由于仅使用记事本即可使用.NET笨拙,因此应假定其他开发人员正在使用诸如VisualStudio或SharpDevelop之类的IDE,因此请使用有意义的名称。
  4. 应使用存储过程。 每次执行此 SQL 时,SQL Server 都需要最低限度地检查其命令缓存,但如果命令已从缓存中刷新,则需要解释和缓存 SQL 命令(放入缓存中(。 这一点以及使用存储过程在每次调用数据库时需要"传送"较少的字节这一事实。

该错误意味着您尝试转换的字符串不是整数。尝试使用 int。TryParse

int newbal;
if(int.TryParse(txtQtyOrdered.Text, out newbal))
    newbal = newbal - Qty;

与您尝试转换的其他文本相同

。并在" AND之前添加空格,这将生成下一个错误

我认为你需要调试你的代码。在调试期间,从"com.命令文本"并粘贴到SQL Server中,您会发现错误

只有一个查询错误,没有别的...可能是txtQtyOrder的值不是整数,还需要空格"AND ItemID="到"AND ItemID=">

谢谢

塔哈

首先 - 您在"AND"之前缺少一个空格

  1. 您应该尝试在更新语句之前解析值。
  2. 您应该决定要执行的操作,以防文本框中的输入格式不正确,而不是在尝试更新时出现异常。
  3. 这不是格式化字符串的正确方法,您应该使用string.Format

当您有多个参数并且正在使用 OracleDB2 数据库时,有时会遇到此问题。它们不支持命名参数,或者未打开。

神谕:

    Dim cmd As OracleCommand = DirectCast(connection.CreateCommand, OracleCommand)
    cmd.BindByName = True

确保参数以与 sql 语句相同的顺序添加到命令对象