【问题标题】:Specified cast is not valid with datareader指定的强制转换对数据读取器无效
【发布时间】:2014-10-08 08:20:34
【问题描述】:

stackoverflow 的朋友们,

我在这里写了一个问题,因为我无法检测为什么有时读取数据读取器的字段会返回无效的强制转换异常。 我会提供所有可能的信息来了解我的情况。我正在使用 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 函数。
  • 不要担心编写不好的代码,这些只是示例,但它们具有理解场景的必要性。
  • 抱歉我的英语不好

真的提前谢谢了。

【问题讨论】:

    标签: sql asp.net module datareader .net


    【解决方案1】:

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

    解决它的一种方法是在function get_dr 之外声明连接并将其作为参数传递到那里。但也看到您返回的是单个值,如果您不打算将读取器用于多个值,我建议您改用 ExecuteScalar - 它会为您省去很多麻烦。

    【讨论】:

    • 感谢 Yuriy 的帮助,这里的学校不教这样的东西 :( 你的回答对我来说似乎很清楚,但是你知道一些文件可以解释更多这种情况吗?可悲的是,在我正在工作的项目中,它使用了很多 get_dr 函数来读取多个值。
    • @FernandoAndrsSepulvedaSilva 不幸的是,有些东西学校不能给你——它们必须来自经验。我遇到了一个非常相似的问题,并花了很多时间试图弄清楚,这就是我发现发生了什么的方式。我整理了一篇小博文,所以如果有人遇到同样的问题,他们可以找到解决方案:codecorner.galanter.net/2013/08/30/… 但一般来说,请查看关于 .NET 的“可变范围”和“垃圾收集”
    • 我很高兴我的解决方案很有用。对于不同的问题,请创建一个新的 Stack Overflow 问题,以便您获得更多帮助。
    • 再次感谢 Yuriy,我将阅读您提到的有关变量范围的一些信息。有一次我也看到了一些奇怪的东西,当我们的应用程序使用 get_dr 函数读取“nvarchar”字段时,它完成了返回带有 dataReader.Item 属性的“日期”值(即使该字段不存在)任何日期值!)。我在考虑使用返回 dataReader 的函数不是一个好主意...我会将您的答案标记为已接受,因为它对我有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2012-05-22
    • 1970-01-01
    • 2018-05-27
    • 2014-07-30
    • 2012-06-12
    相关资源
    最近更新 更多