我收到此错误:“输入字符串的格式不正确。”
这是我的代码:
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但是我得到这个错误请帮我这个。感谢。
答案 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)
我建议根据以下代码审核建议进行更改(按价值顺序列出(“修复”的成本/收益)):
答案 2 :(得分:1)
您需要在“AND”之前放置一个空格,并且您尝试将字符串转换为非整数的整数。
答案 3 :(得分:0)
该错误意味着您尝试转换的字符串不是整数。 尝试使用int.TryParse
int newbal;
if(int.TryParse(txtQtyOrdered.Text, out newbal))
newbal = newbal - Qty;
与您尝试转换的其他文本相同
...并在“AND之前添加空格,这将产生下一个错误
答案 4 :(得分:0)
首先 - 在“AND”之前缺少空格
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语句相同的顺序添加到命令对象中