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

时间:2013-10-12 15:01:52

标签: c# sql visual-studio format

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

这是我的代码:

    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但是我得到这个错误请帮我这个。感谢。

7 个答案:

答案 0 :(得分:4)

您的错误消息所指出的问题可能是尝试将文本框中的值转换为短整数的其中一行。没有任何检查,您的用户键入的值可能只是一个数字,您会收到此错误消息(例如,如果您的用户将文本框保留为空)。

在尝试执行查询之前,您应该尝试使用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的read these old words

答案 1 :(得分:2)

我建议根据以下代码审核建议进行更改(按价值顺序列出(“修复”的成本/收益)):

  1. 此方法访问数据库不应该读取控件以获取其值。相反,应该有一个事件处理程序,例如按钮单击,使用TryParse解析其他控件的值,如gregjer回答的那样。通过隔离UI和数据代码,数据访问层更容易测试,并且通过在表面(UI层)解析,将尽快捕获处理不良用户输入的异常。
  2. 动态SQL通过数据库或数据访问层中的字符串w / i .NET对SQL注入开放。您正在通过解析文本来解决该问题,所以您的工作非常棒。但是,这已经由.NET团队通过提供参数化命令来处理。请参阅MSDN SqlCommand.Parameters或在此处查看简要信息,包括消费开发人员如何理解此主题:When should "SqlDbType" and "size" be used when adding SqlCommand Parameters?
  3. 变量命名。而不是Qty,标准的.NET命名约定将调用数量,camelCased,因为它是一个参数和完整的人类语言名称,而不是简写或缩写,特别是对于公开​​可见位。 IntelliSense使长变量名称不成问题。由于.NET只使用Notepad很笨重,因此应该假设其他开发人员使用的是VisualStudio或SharpDevelop等IDE,因此请使用有意义的名称。
  4. 应使用存储过程。每次执行此SQL时,SQL Server都需要最低限度地检查其命令高速缓存,但如果该命令已从高速缓存中刷新,则需要解释和装入SQL命令(放入高速缓存)。这个以及使用存储过程的事实要求在每次调用数据库时“运送”更少的字节。

答案 2 :(得分:1)

您需要在“AND”之前放置一个空格,并且您尝试将字符串转换为非整数的整数。

答案 3 :(得分:0)

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

int newbal;

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

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

...并在“AND之前添加空格,这将产生下一个错误

答案 4 :(得分:0)

首先 - 在“AND”之前缺少空格

  1. 您应该尝试来解析更新语句之前的值。
  2. 如果文本框中的输入格式不正确,那么您应该决定要做什么,而不是在尝试更新时获得异常。
  3. 这不是格式化字符串的正确方法,您应该使用string.Format

答案 5 :(得分:0)

我认为您需要调试代码。在调试期间从“com.CommandText”复制您的查询并粘贴在SQL Server中,您会发现错误

只有一个查询错误没有其他... 可能是txtQtyOrdered值不是整数,还需要空格“AND ItemID =”到“AND ItemID =”

谢谢,

塔哈

答案 6 :(得分:0)

当您有多个参数并使用 Oracle DB2 数据库时,有时可能会遇到此问题。他们不支持命名参数或该参数未打开。

Oracle:

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

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