Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 指定的强制转换对datareader无效_Sql_Asp.net_Module_Datareader_.net - Fatal编程技术网

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

Sql 指定的强制转换对datareader无效,sql,asp.net,module,datareader,.net,Sql,Asp.net,Module,Datareader,.net,嗨,stackoverflow的朋友们 我在这里写一个问题,因为我在检测为什么有时读取datareader的字段会返回无效的强制转换异常时遇到问题。 我会提供所有可能的信息来了解我的情况。我正在使用ASP.NET3.5 我有一个模块,它有一个返回IDataReader并接收sql查询的函数。像这样的 function get_dr(query as String) as IDataReader dim connection = new SqlClient.SqlConnection("conn

嗨,stackoverflow的朋友们

我在这里写一个问题,因为我在检测为什么有时读取datareader的字段会返回无效的强制转换异常时遇到问题。 我会提供所有可能的信息来了解我的情况。我正在使用ASP.NET3.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的数据,但我需要知道我是做错了还是做得更好

注:

  • getDate是一个始终返回日期的sql函数
  • 不要担心写不好的代码,这些只是示例,但它们有必要理解场景
  • 对不起,我英语不好

非常感谢。一个可能的原因是您在返回DataReader的函数中声明了连接。当您超出该函数时,该连接将超出范围。这意味着在某个不可预测的点(取决于内存使用情况等),垃圾收集器将收集它。如果您在此时尝试使用DataReader,则所有赌注都将失败


解决此问题的一种方法是在函数get\u dr之外声明连接,并将其作为参数传递给该函数。但是,如果您返回的是一个值,如果您不打算将reader用于多个值,我建议您改用它,这将为您省去很多麻烦。

感谢Yuriy的帮助,这里的学校不会教授以下内容:(你的答案对我来说似乎很清楚,但是你知道一些解释这种情况的文件吗?遗憾的是,在我工作的项目中,它使用了很多get_dr函数来读取一个以上的值。@FernandoAndrsSepulvedaSilva不幸的是,学校不能给你一些东西-它们必须来自经验我发现了一个非常类似的问题,并花了很多时间试图解决它,这就是我发现发生了什么的原因。我写了一篇小博文,这样,如果有人有同样的问题,他们可以找到解决方案:但通常查找“变量范围”和“垃圾收集”关于.NETI,我很高兴我的解决方案很有用。对于不同的问题,请创建一个新的堆栈溢出问题,以便获得更多帮助。再次感谢Yuriy,我将阅读一些关于变量范围的信息,正如您所提到的。我也曾看到过一些奇怪的事情,那是当我们的应用程序读取“nvarchar”时使用get_dr函数的字段,它使用dataReader.Item属性返回了一个“date”值(即使在该字段中不存在任何日期值!)。我认为使用返回dataReader的函数不是一个好主意……我会将您的答案标记为已接受,因为它对我帮助很大。