无法在文本框中插入数字

Posted

技术标签:

【中文标题】无法在文本框中插入数字【英文标题】:Unable to insert Number into a text box 【发布时间】:2016-04-18 07:05:30 【问题描述】:

我有一个使用 Oracle 作为数据库的 Web 应用程序。我有一个查询,它将数字返回到我需要插入到文本框中的前端。

当返回的数字是整数时,文本框会被填充,但当返回的数字是小数时,会抛出错误“指定的转换无效。”

这里是代码。

string isbn=Request.QueryString["code"];
OracleConnection con = new OracleConnection();
con.ConnectionString = connectionString;

con.Open();

string sql = "SELECT distinct B.TITLE,B.BOOK_CATEGORY,B.ISBN,A.AUTHOR_NAME,P.PUBLICATION_HOUSE_NAME,B.YEAR_OF_PUBLICATION,(SELECT AVG(AVERAGE_RATING) FROM RATING_TABLE GROUP BY ISBN HAVING ISBN = '" + isbn + "') AS AVERAGE from BOOK_TABLE B JOIN AUTHOR_TABLE A ON B.AUTHOR_ID = A.AUTHOR_ID JOIN PUBLISHER_TABLE P ON B.PUBLISHER_ID = P.PUBLISHER_ID JOIN RATING_TABLE R ON B.ISBN = R.ISBN WHERE B.ISBN = '" + isbn + "'";
OracleCommand cmd = new OracleCommand(sql, con);

cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();

while (dr.Read())

    txtBook.Text = Convert.ToString(dr["TITLE"]);
    txtGenre.Text = Convert.ToString(dr["BOOK_CATEGORY"]);
    txtISBN.Text = Convert.ToString(dr["ISBN"]);
    txtAuthor.Text = Convert.ToString(dr["AUTHOR_NAME"]);
    txtPublisher.Text = Convert.ToString(dr["PUBLICATION_HOUSE_NAME"]);
    txtyop.Text = Convert.ToString(dr["YEAR_OF_PUBLICATION"]);
    txtRating.Text =dr["AVERAGE"].ToString();


dr.Close();

我错过了什么吗?

【问题讨论】:

哪个文本框会引发此异常? 我怀疑有些数据行是空的。 您能否使用 dr["..."] 语句将项目读入小数?您可以使用 Decimal.ToString() 将此十进制转换为字符串吗?有问题的 dr["..."] 语句返回的真实对象类型是什么? 【参考方案1】:

希望txtRating.Text =dr["AVERAGE"].ToString(); 导致错误,这不是因为您指定的decimalstring 转换。这可能是由于dr["AVERAGE"]null 并因此null.ToString() 在这里给出了错误:所以你可以使用:

  txtRating.Text = dr["AVERAGE"] == null || dr["AVERAGE"] is DBNull ? "" : dr["AVERAGE"].ToString();

【讨论】:

应该是别的东西,因为所有对 DbReader 的访问都不能提供 Invalid Cast。 Convert.ToString(DbNull.Value) 或 DbNull.Value.ToString() 不会引发指定的异常 @Steve 没错,我做出这些改变并没有改变。我在数据库中运行查询并得到结果。我得到 dr["AVERAGE"]=5.363636。那么这是小数的问题吗? 不,应该没问题。如果值为 DbNull.Value,则调用 ToString() 永远不会失败。在这种情况下会返回一个空字符串。此外,如果您在 dr["AVERAGE"] 中有一个值,则调用 ToString() 可能会返回一个在您的语言环境设置中格式化的字符串,但不会给出 Invalid Cast 异常,至少据我所知。您确定该行引发了异常吗?【参考方案2】:

代码没有问题,但dr["AVERAGE"] 不应为空。 否则你会得到Object reference error

【讨论】:

【参考方案3】:

我发现了问题的问题。正在计算的我的平均值在某些情况下最终会成为非经常性值并且不会结束。因此,在投射时曾经出现过错误。

我在查询中使用 TO_CHAR 函数解决了这个问题。

 string sql = "SELECT distinct B.TITLE,B.BOOK_CATEGORY,B.ISBN,A.AUTHOR_NAME,P.PUBLICATION_HOUSE_NAME,B.YEAR_OF_PUBLICATION,(SELECT TO_CHAR((AVG(AVERAGE_RATING)),'99.99') FROM RATING_TABLE GROUP BY ISBN HAVING ISBN = '" + isbn + "') AS AVERAGE from BOOK_TABLE B JOIN AUTHOR_TABLE A ON B.AUTHOR_ID = A.AUTHOR_ID JOIN PUBLISHER_TABLE P ON B.PUBLISHER_ID = P.PUBLISHER_ID JOIN RATING_TABLE R ON B.ISBN = R.ISBN WHERE B.ISBN = '" + isbn + "'";

【讨论】:

【参考方案4】:

在 PLSQL 转换中

 SELECT CAST (null AS DOUBLE PRECISION) From dual; 
 SELECT CAST ('100.233' AS DOUBLE PRECISION) From dual; 
 Select AVG( CAST(AVERAGE_RATING AS DOUBLE PRECISION)) FROM RATING_TABLE;

C# 中的 OR

try

 If(dr["AVERAGE"]!= null)
  

  txtRating.Text = (!String.IsNullOrEmpty(dr["AVERAGE"].ToString()) ?  Convert.ToDecimal(dr["AVERAGE"].ToString()) : 0);
  

 catch

【讨论】:

如果dr["AVERAGE"]= nullConvert.ToDecimal() 在转换失败的情况下抛出格式异常会发生什么 null.ToString() 会抛出异常

以上是关于无法在文本框中插入数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令按钮在文本框中的现有文本中插入新文本?

如何在文本框中输入后编辑十进制数

在文本框中插入整数值

c#如何判断文本框中是不是是数字

Tkinter - 无法理解为什么在两个输入框中同时输入数据。

如何选择文本框中的文本,插入符号位于选择的开头?