【问题标题】:Specified cast is not valid: numeric cell to int?指定的强制转换无效:将数字单元格转换为 int?
【发布时间】:2013-03-20 21:10:12
【问题描述】:

通常“指定的强制转换无效”错误很容易解决。但是这个让我头疼。

我的C# 应用程序中集成了一个SQL compact 数据库。目前我正在获取当前的数据库结构并将其放入数据表中。我使用的 SQL 命令是:

select * from information_schema.columns

其中一列是NUMERIC_PRECISION,它是一个数值。

我尝试将此信息存储在一个整数变量中,但它告诉我指定的转换无效。代码是:

int precision;
if (row["NUMERIC_PRECISION"] != DBNull.Value)
    precision = (int)row["NUMERIC_PRECISION"];

我的问题是为什么这个操作无效?单元格是一个数值,我正在尝试将其转换为整数 - 理论上这应该可行吗?

【问题讨论】:

  • 当您使用调试器检查值时,row["NUMERIC_PRECISION"] 的类型是什么?
  • 它是一个字符串。但它总是为 null 或具有数值。
  • 你在row["NUMERIC_PRECISION"]得到了什么??

标签: c#


【解决方案1】:

既然你说值可以为空,我实际上会使用一个可以为空的整数来存储它。

int? precision = null;

if(row["NUMERIC_PRECISION"] != DBNull.Value) //or whatever you want to do to make sure it actually has a value
{
    //I usually use Convert.ToInt32 since its easier, but it is also more sensative
    precision = Convert.ToInt32(row["NUMERIC_PRECISION"]);
}

Convert 类易于使用,并且显然很有意义,但它对 null 或格式不正确的值非常敏感,并在找到时抛出异常。

【讨论】:

  • 附带说明:尝试转换为字符串绝不是一个好主意,每个类都从 object 类本身继承 .ToString() 方法,无论何时您需要一个字符串,从任何东西,用那个。如果需要,在您自己的类中覆盖它。
【解决方案2】:

row["NUMERIC_PRECISION"] 返回包含数字类型的对象。您只能将其转换为该装箱对象的确切类型。

先尝试转换为 (decimal) 或 (long),然后再转换为 (int)。

您可以使用调试器监视检查行的类型["NUMERIC_PRECISION"]。

您也可以让 Convert 类为您处理转换:

precision = Convert.ToInt32(row["NUMERIC_PRECISION"]);

【讨论】:

    【解决方案3】:

    尝试使用 int.parse 而不是简单地转换为 int - http://msdn.microsoft.com/en-us/library/system.int32.parse.aspx

    【讨论】:

      【解决方案4】:

      [编辑] 现在你说它是一个字符串:你必须解析它。

      试试:precision = int.Parse((string)row["NUMERIC_PRECISION"]);

      如果格式不正确,则会引发异常,因此您必须准备好捕获异常,或者使用 int.TryParse() 的重载来检查其有效性。

      [编辑2]

      好像数据不是字符串;它是一个 Int16。这样做:

      precision = (Int16)row["NUMERIC_PRECISION"];

      【讨论】:

      • 此解决方案返回错误:Unable to cast object of type 'System.Int16' to type 'System.String'.
      • 在这种情况下,您在行中没有字符串!查看我编辑的回复。
      【解决方案5】:

      最佳做法是:int.Parse(string s)

      precision= Convert.ToInt32(row["NUMERIC_PRECISION"]);
      

      【讨论】:

      • 恐怕这在这种情况下不起作用。 Unable to cast object of type 'System.Int16' to type 'System.String'.
      猜你喜欢
      • 2022-06-30
      • 2014-05-03
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2018-05-27
      • 2014-07-30
      相关资源
      最近更新 更多