0

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

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

select * from information_schema.columns

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

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

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

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

4

5 回答 5

2

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

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易于使用并且显然很有意义,但它对空值或格式不正确的值非常敏感,并且在找到时抛出异常。

于 2013-03-20T12:54:44.530 回答
1

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

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

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

您还可以要求 Convert 类为您处理转换:

precision = Convert.ToInt32(row["NUMERIC_PRECISION"]);
于 2013-03-20T12:45:31.650 回答
0

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

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

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

[编辑2]

看来数据不是字符串;它是一个 Int16。所以这样做:

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

于 2013-03-20T12:45:30.277 回答
0

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

于 2013-03-20T12:45:45.230 回答
0

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

precision= Convert.ToInt32(row["NUMERIC_PRECISION"]);
于 2013-03-20T12:49:15.310 回答