【问题标题】:How to convert string to int32 c#? [duplicate]如何将字符串转换为 int32 c#? [复制]
【发布时间】:2016-01-26 16:22:12
【问题描述】:

我正在尝试使用以下代码从特定文本框和 C# Windows 窗体上的一个标签插入 SQL Server 中的事务表:

AppProcess abc = new AppProcess();
SqlConnection sqlconn1 = abc.GetConn();

SqlCommand sqlinsert = new SqlCommand("insert into Payment values
(@TID,@EID,@CustID,@CFName,@CLName,@BID,@BName,@Price,@Qty,@TransDate)",
sqlconn1);

DataTable dtCustomer = new DataTable();
sqlconn1.Open();

sqlinsert.Parameters.Add(new SqlParameter("@TID", SqlDbType.VarChar, 10));
sqlinsert.Parameters.Add(new SqlParameter("@EID", SqlDbType.VarChar, 10));
sqlinsert.Parameters.Add(new SqlParameter("@CustID", SqlDbType.VarChar, 10));
sqlinsert.Parameters.Add(new SqlParameter("@CFName", SqlDbType.VarChar, 100));
sqlinsert.Parameters.Add(new SqlParameter("@CLName", SqlDbType.VarChar, 100));
sqlinsert.Parameters.Add(new SqlParameter("@BID", SqlDbType.VarChar, 10));
sqlinsert.Parameters.Add(new SqlParameter("@BName", SqlDbType.VarChar, 100));
sqlinsert.Parameters.Add(new SqlParameter("@Price", SqlDbType.Int));
sqlinsert.Parameters.Add(new SqlParameter("@Qty", SqlDbType.Int));
sqlinsert.Parameters.Add(new SqlParameter("@Transdate", SqlDbType.Date));

sqlinsert.Parameters["@TID"].Value = tidTxt.Text;
sqlinsert.Parameters["@EID"].Value = eidTxt.Text;
sqlinsert.Parameters["@CustID"].Value = cidTxt.Text;
sqlinsert.Parameters["@CFName"].Value = cfnameTxt.Text;
sqlinsert.Parameters["@CLName"].Value = clnameTxt.Text;
sqlinsert.Parameters["@BID"].Value = bidTxt.Text;
sqlinsert.Parameters["@BName"].Value = bnameTxt.Text;
sqlinsert.Parameters["@Price"].Value = label17.Text;
sqlinsert.Parameters["@Qty"].Value = qtychoiceTxt.Text;
sqlinsert.Parameters["@Transdate"].Value = TransDateTxt.Text;

sqlinsert.ExecuteNonQuery();

但是当我运行该应用程序时,它会生成以下错误:

我很困惑哪一行触发了错误。以及如何将字符串转换为 Int32?

【问题讨论】:

  • 你从label17.TextqtychoiceTxt.Text 得到什么?从异常细节来看,很明显您传入的是字符串而不是整数,这会导致FormatException。请检查这些字段值是否可以转换为整数?
  • 还向您的表单添加验证,以便用户不能在用于数字数据的文本框中输入任意文本
  • label17.Text 是在 qtychoiceTxt.Text 上选择的数量与产品价格计算后的总成本。我正在尝试保存这些值
  • 为什么使用label 来显示结果?标签是用来给事物贴标签的。如果要向用户显示结果,请使用 TextBox 并将其设置为 ReadOnly

标签: c# sql-server winforms ado.net


【解决方案1】:

您必须使用 Convert.ToInt32("string") 将“label17.Text”和“qtychoiceTxt.Text”转换为整数

【讨论】:

  • 如果任何字段的值不是 int,这可能会中断。请改用TryParse
  • 并非如此 - 此时最好抛出异常而不是记录 0 数量或 0 金额的付款。 TryParse 应该用于在存储过程被调用之前验证输入
  • 我们只是在讨论转换,而不是完整的功能
【解决方案2】:

使用应该使用这样的代码进行转换:

command.Parameters.Add("@Qty", SqlDbType.Int).Value = Convert.ToInt32(qtychoiceTxt.Text);

【讨论】:

  • 如果任何字段的值不是 int,这可能会中断。我建议改用TryParse
  • @AmitKumarGhosh 这是简单的转换而不是验证。对于验证,我们应该处理值也可以使用 int.TryParse
  • @AmitKumarGhosh 打破 is 适合这里。最好要求用户修复数据,而不是默认存储 0。一个意外的“支付”为0并不是一个快乐的情况
  • 这个问题是关于转换而不是关于验证。对于验证,我们有很多解决方案。
  • @AmitKumarGhosh 什么是好的,是表单上的验证器,数据绑定代码上的验证(所有这些都是可用的 OOTB),最后,是的,如果之前的验证,抛出异常并警告用户失败。如果我的公司不小心付给我 0 欧元,我会完全高兴
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 2018-03-25
  • 2014-08-24
  • 2010-09-17
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多