我有一小段代码要运行,首先检查值是否存在,如果不存在,则更新数据库。我的问题是我可以运行一个或另一个查询,但不能同时运行这两个查询,因为这样它就表示数据库已打开,无法访问。我肯定我能写进数据库。它不受读取保护,位于我无法访问的位置等。如果我只是尝试更新而不检查,则例程将运行。这张支票肯定没有记录。我尝试过使用完全不同的变量来进行连接的不同例程。我被难倒了。我试过关闭,使用,处理,但我需要一个比我聪明得多的人来告诉我我做错了什么。。。
For Each strfile As String In flist
Dim pth As String = Path.GetDirectoryName(strfile)
Dim objReader As New System.IO.StreamReader(strfile)
Dim dVal As String = String.Empty
TextLine = objReader.ReadLine()
SplitLine = Split(TextLine, ",")
dVal = SplitLine(1)
Using Dcon As New OleDbConnection
Dcon.ConnectionString = dbProvider
Dcon.Open()
Dim q1 As String = "SELECT Shares.[_Date] FROM Shares WHERE (((Shares.[_Date])=" & dVal & "))"
Dim comd As OleDbCommand = New OleDbCommand(q1, Dcon)
comd.ExecuteReader()
Dim q2 As String = "INSERT INTO Shares (Code, _Date, _Open, _High, _Low, _Close, _Volume) " &
"SELECT F1, F2, F3, F4, F5, F6, F7 FROM [Text;HDR=NO;DATABASE=" & pth & "].[" & Path.GetFileName(strfile) & "];"
Dim cmd As OleDbCommand = New OleDbCommand(q2, Dcon)
cmd.ExecuteNonQuery()
Dcon.Close()
End Using
Next
我尝试过不同的程序,我尝试过打开,关闭,然后重新打开。我试过一个连接,我试过两个。有人知道我做错了什么吗?为什么它总是告诉我数据库是以独占方式打开的,为什么它不让我写入它?
提前感谢那些帮助过你的人。
3条答案
按热度按时间yizd12fk1#
我在尝试执行多个sql语句时使用以下代码:
jgzswidk2#
实际的错误消息会告诉您连接上已经有一个打开的读卡器。显而易见的解决方案是关闭打开的数据读取器。
你的代码有一些严重的问题。你打电话来
ExecuteReader
这就是打开数据读取器的原因,它阻止了您的第二个命令,但您实际上从未对该数据读取器执行任何操作。您没有将它赋给变量,因此无法从中获取数据,也无法关闭它。你可以这样做:正确的方法是使用
Using
尽管如此:也就是说,如果您所要做的只是确定数据是否存在,而不是实际使用该数据,那么您根本不需要数据读取器。只需使用返回
Boolean
打电话给我ExecuteScalar
,例如。根据数据库的不同,您可以使用更高效的查询。
w7t8yxp53#
谢谢大家的帮助,但凌晨2点我突然醒悟过来,意识到不是数据库出了问题。
我让streamreader开着,这就是问题的原因。
我已经接受了你的意见,但感谢在开发更好的代码的帮助。