访问列值时,指定的强制转换无效

时间:2013-07-05 05:42:25

标签: c# datatable

我在数据表中查找记录。如果记录匹配,那么我想比较数据行中的值并进行一些操作。请参阅下面的代码以获得更好的解释,

        foreach (DataRow row2  in dtTo.Rows)
        {

            DataRow[] match = dtReturn.Select("Id = " + row2["Id"]);

            if (match.Length > 0)
            {
                if (match[0]["boolInt"] == 1) // Getting error on this line
                {
                    match[0]["NewValues"] = "";
                }

            }

        }

我在下面的行中遇到错误

 if (match[0]["boolInt"] == 1)

然后resharper建议我施放给布尔。所以我将上面的行更改为

 if( (bool) (match[0]["bClosed"] = 1))

但是当我运行该项目时,我得到运行时错误,因为“指定的强制转换无效”在上面一行。 在即时窗口中,当我输入时,我得到的值为1,

(match[0]["bClosed"] 

我该怎么做才能摆脱这个错误?

3 个答案:

答案 0 :(得分:1)

您需要将值转换为int。你可以这样做:

if (Convert.ToInt32(match[0]["boolInt"]) == 1)

但是如果列包含无法生成的值,则会出现错误。

更好的方法是:

int number;
bool result = Int32.TryParse(match[0]["boolInt"], out number);
if (result && number == 1)

答案 1 :(得分:1)

试试这个:

 if ((match[0]["boolInt"] as int?) == 1)
 {
     match[0]["NewValues"] = "";
 }

如果value为null或无效,则不会导致异常,但仍应处理。

答案 2 :(得分:1)

据此:

  

不,不会有空。该字段是tinyint

您的代码应该如下所示(SQL Server中的AFAIR,tinyint与CLR中的byte匹配):

if ((byte)(match[0]["boolInt"]) == 1)
{
}

如果您知道字段类型,则无需调用Convert方法。更快的方法是直接转换为已知类型。