指定的强制转换无效:数字单元格为int?

时间:2013-03-20 12:43:29

标签: c#

通常“指定演员表无效”错误很容易解决。但是这个让我头疼。

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

select * from information_schema.columns

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

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

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

我的问题是为什么这个操作无效?单元格是一个数值,我试图将它转换为整数 - 理论上这应该有用吗?

5 个答案:

答案 0 :(得分:2)

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

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或格式不正确的值非常敏感,并在找到时抛出异常。

答案 1 :(得分:1)

row [“NUMERIC_PRECISION”]返回在其中装有数字的数字对象。您只能将其强制转换为此盒装对象的确切类型。

首先尝试转换为(十进制)或(长),然后转换为(int)。

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

您也可以要求Convert class为您处理转换:

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

答案 2 :(得分:0)

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

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

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

[EDIT2]

似乎数据不是字符串;这是一个Int16。所以这样做:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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