指定的强制转换对于datareader无效

时间:2014-08-14 15:41:53

标签: sql asp.net module datareader .net

喜欢stackoverflow的朋友,

我在这里写一个问题是因为我有问题要检测为什么有时读取到datareader的字段会返回无效的强制转换异常。 我会尽可能地了解我的情况。我正在使用ASP.NET 3.5

  • 我有一个模块,它有一个返回IDataReader并接收sql查询的函数。像这样的东西

    function get_dr(query as String) as IDataReader
    dim connection = new SqlClient.SqlConnection("connection string")
    connection.open()
    dim command = connection.createCommand
    command.commandText = query
    dim reader = command.executeReader(CommandBehavior.CloseConnection)
    return reader
    end function
    
  • 我有一个带有共享功能的类,它可以恢复新的dataReader并返回一个日期。像这样的东西:

    public shared function getDate() as Date    
    using dr = get_dr("SELECT dbo.getDate()")    
    if dr.read() and dr(0) isnot dbnull.value then   
    return dr.GetDateTime(0)   
    end if   
    end using   
    end function   
    

当我在另一个代码中调用getDate()函数时,它会给我一个这样的调用堆栈。

System.InvalidCastException: Specified cast is not valid.
at System.Data.SqlClient.SqlBuffer.get_DateTime()
at System.Data.SqlClient.SqlDataReader.GetDateTime(Int32 i)

为什么有时候我会收到这个错误?我认为这是因为很多用户正在调用此函数与我的应用程序的另一个函数(这些函数最终也使用get_dr),混合dataReader的数据在另一个执行,但我需要知道我是否正在做有些不对劲或者可能做得更好。

注意:

  • dbo.getDate是一个总是返回日期的sql函数。
  • 不要担心编写错误的代码,这些只是示例,但他们有必要了解这种情况。
  • 抱歉我的英文不好

提前非常感谢。

1 个答案:

答案 0 :(得分:0)

一个可能的原因 - 在返回DataReader的函数内声明连接。当您没有连接超出范围的功能时。这意味着在某些不可预测的点(取决于内存使用等)垃圾收集器将收集它。如果您在此时尝试使用DataReader - 所有投注均已关闭。

解决此问题的一种方法是在function get_dr之外声明连接并将其作为参数传递给它。但是也看到你正在返回单个值,如果你不打算将阅读器用于多个值,我建议使用ExecuteScalar代替它 - 它会为你节省很多麻烦。