【问题标题】:Input string was not in a correct format in Sales Order销售订单中的输入字符串格式不正确
【发布时间】:2013-09-17 05:56:55
【问题描述】:

我遇到了这个问题

输入字符串的格式不正确。

突出显示的部分:

DisplayOrder(Convert.ToInt16(txtOrderNo.Text)); DisplayOrderDetails(Convert.ToInt16(txtOrderNo.Text));

我很难弄清楚是什么错误,你能帮我吗?非常感谢。

这是我的设置代码:

private void displayNavigate()
{
    DisplayOrder(Convert.ToInt16(txtOrderNo.Text));
    DisplayOrderDetails(Convert.ToInt16(txtOrderNo.Text));

    double dTotal = 0;

    try
    {
        for (int nRow = 0; nRow <= grdDetails.Rows.Count - 1; nRow++)
        {
            dTotal = dTotal + Convert.ToDouble((grdDetails.Rows[nRow].Cells["Amount"].Value.ToString()));
        }
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    lblTotal.Text = string.Format("{0:#,##00.00}", dTotal);
}

//================================================================================
//================================================================================


private void DisplayOrder(int nOrderNo)
{
    try
    {
        OpenConnection();

        SqlCommand cmdSelect = new SqlCommand();

        cmdSelect.Connection = cn;
        cmdSelect.CommandType = CommandType.Text;
        cmdSelect.Transaction = trnOrder;
        cmdSelect.CommandText = "SELECT " +
            "B.OrderNo, B.OrderDate, A.CustomerNo, " +
            "A.CustomerName, A.CustomerAddress, B.PurchaseOrderNo, B.AgentName, B.Status " +
            "FROM Customers AS A, Orders AS B " +
            "WHERE A.CustomerNo = B.CustomerNo " +
            "AND B.OrderNo ='" + nOrderNo + "'";

        SqlDataReader dr = cmdSelect.ExecuteReader(CommandBehavior.CloseConnection);

        while (dr.Read())
        {
            txtOrderNo.Text = dr["OrderNo"].ToString();
            dtpOrderDate.Value = Convert.ToDateTime(dr["OrderDate"].ToString());
            txtCustomerNo.Text = dr["CustomerNo"].ToString();
            txtCustomerName.Text = dr["CustomerName"].ToString();
            txtCustomerAddress.Text = dr["CustomerAddress"].ToString();
            txtPONo.Text = dr["PurchaseOrderNo"].ToString();
            cboAgentName.Text = dr["AgentName"].ToString();
            txtOrderStatus.Text = dr["Status"].ToString();
        }
        dr.Close();
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

//================================================================================
//================================================================================

private void DisplayOrderDetails(int nOrderNo)
{
    OpenConnection();

    SqlCommand cmdSelect = new SqlCommand();
    cmdSelect.Connection = cn;
    cmdSelect.CommandType = CommandType.Text;
    cmdSelect.Transaction = trnOrder;
    cmdSelect.CommandText =
        "SELECT PackagingOutside, Quantity, Unit, ProductNo, ProductName, ProductSize, PackagingInside, " +
        "SellingDiscount, SellingPrice, Amount FROM OrderDetails WHERE OrderNo = '"
        + nOrderNo + "'";

    SqlDataAdapter daDetail = new SqlDataAdapter();
    daDetail.SelectCommand = cmdSelect;

    DataSet ds = new DataSet();
    daDetail.Fill(ds, "OrderDetails");

    grdDetails.DataSource = null;
    grdDetails.DataSource = ds.Tables["OrderDetails"];
}

【问题讨论】:

  • txtOrderNo.Text 很可能包含非数字字符。我建议 Int32.TryParse 进行更安全的转换。
  • “输入字符串格式不正确”表示输入字符串不是有效数字。txtOrderNo.Text的值是多少?
  • 另外,养成使用参数化查询的习惯 - 否则你将把 SQL 注入的大门敞开。
  • txtOrderNo.Text 尝试转换时的值是多少?确保它不为空 - 在提问之前应该刷新页面:p
  • 首先验证文本框,确保它不为空

标签: c#


【解决方案1】:

当您使用Convert.ToInt16 时,如果值不包含可选符号后跟数字序列(0 到 9),则会出现此异常

在继续之前对输入进行验证,如下所示。

int orderNo;
if (int.TryParse(txtOrderNo.Text, out orderNo))
{
    DisplayOrder(orderNo);
    DisplayOrderDetails(orderNo);
}

旁注:

不要分享 SqlConnection 在需要时创建新的即时信息,并使用下面的 using 块包装它

using (SqlConnection con = new SqlConnection(connectionString))
{

}

使用 SQL 参数

cmdSelect.CommandText = "SELECT * FROM Orders WHERE OrderNo = @OrderNo";
cmdSelect.Parameters.AddWithValue("@OrderNo", nOrderNo);

【讨论】:

  • 如果转换为Int16成功,框架不会自动隐式转换为Int32,因为这是一个扩大的转换?
  • 但是你知道Int16 Int32的范围不同,不是这个异常但是如果超出Int16 的范围值会得到另一个异常
  • 同意,您的回答在技术上是正确的,但可能有点误导 - 如果在 txtOrderNo.Text 中输入的值成功转换为 Int16,系统将执行从Int16Int32 的隐式转换,因为Int32 的最大值将容纳Int16 的最大值。
  • @Tim 我已删除该声明。 int.TryParse 将给 int 值,最后不需要强制转换
  • 绝对是更好的选择。 +1
【解决方案2】:

这意味着 txtOrderNo.Text 中的值不被视为整数。如果您的文本框为空,您将收到此错误。

要么检查文本框是否包含数据,要么使用 TryParse (http://msdn.microsoft.com/en-us/library/f02979c7.aspx) 方法

【讨论】:

    【解决方案3】:

    有两点需要考虑,

    1. 在文本框中输入的值应该是16位范围内的整数,如果可以是更大的值,那就得考虑到long、int32等。

    2. 使用TryParse() 验证文本框,它会告诉您输入的值是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2013-08-22
      相关资源
      最近更新 更多