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

本文关键字:转换 无效 访问 | 更新日期: 2023-09-27 18:21:11

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

        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)

然后雷沙佩尔建议我选布尔。所以我把上面的线路改成

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

但当我运行该项目时,我会在上面的行中得到运行时错误,即"指定的强制转换无效"。在即时窗口中,当我键入时,我得到的值为1

(match[0]["bClosed"] 

我应该怎么做才能消除这个错误?

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

根据此:

不,不会有空。该字段不存在

您的代码应该是这样的(AFAIR,SQL server中的tinyint与CLR中的byte匹配):

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

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

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

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

但是,如果列中包含一个无法强制转换的值,则会出现错误。

一个更好的途径是:

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

试试这个:

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

如果值为null或不是有效的int,它不会引起异常,但无论如何都应该进行处理。