代码之家  ›  专栏  ›  技术社区  ›  dandan78 Tom Cool

OdbcDataReader存在奇怪的问题。GetBoolean()引发的强制转换对于bool列无效

  •  0
  • dandan78 Tom Cool  · 技术社区  · 15 年前

    好吧,这件事让我发疯了。我在PostgreSQL数据库中有一个表,我正在尝试使用OdbcDataReader.GetBoolean(int col)为特定记录获取布尔列的值。

    问题是GetBoolean()不断抛出 强制转换无效

    从我的应用程序的上一个工作版本所做的唯一更改是向表中添加一列。也就是说,我需要的列的索引没有更改。哦,是的,使用GetValue()获取值,然后对结果调用GetType(),将返回System.String和true/false值转换为1/0。

    我完全没有主意了。

    3 回复  |  直到 15 年前
        1
  •  1
  •   dandan78 Tom Cool    15 年前

    val1 = reader.GetInt32(0);
    val2 = reader.GetBoolean(4);
    val3 = reader.GetBoolean(8);
    

    然而,这并不意味着:

    val3 = reader.GetBoolean(8);
    val1 = reader.GetInt32(0); // causes invalid cast exception
    val2 = reader.GetBoolean(4);
    

    显然,列顺序与此有关。

        2
  •  0
  •   tomfanning    15 年前

    我不认为将System.String传递给GetBoolean()会对您起作用-您可以从异常中看到,您得到的是一个InvalidCastException,这意味着它在内部某处尝试执行以下操作:

    string s = "true";
    bool b = (bool)s;
    

    这显然行不通。

    我们使用此模式从OdbcDataReader中获取布尔数据:

    data.Gender = reader["Gender"] == DBNull.Value ? 
        false : Convert.ToBoolean(reader["Gender"]);
    

        3
  •  0
  •   Sanjay Uttam    14 年前

    我遇到了同样的问题,实际上是因为我调用的SP中有无效的强制转换。。。

    declare @colA INT -- should have been a float!!!
    set @colA = select someValue from someTable
    
    select @someVar, someColumn
    from someOtherTable
    
     //the line below works, even though it should have the SQL datatype is FLOAT
     _someVar = reader[2] != DBNull.Value ? reader.GetDouble[2] : 0;
      //the following line blows up w/invalid cast exception, even though it is correct
     _someColumn = reader[3] != DBNull.Value ? reader.GetBoolean[3] : false;