首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询和线程处理

SQL查询和线程处理
EN

Stack Overflow用户
提问于 2018-01-12 13:17:26
回答 1查看 1K关注 0票数 1

我必须执行几个SQL查询,我想为此使用线程,因为这个查询必须每1秒执行一次,以更新或获取数据库的一些不同值。

当我试图执行我的代码时,我会得到以下错误:

WindowsApplication1.vshost.exe错误:0:已经有一个与此连接相关的开放DataReader,必须先关闭该连接。

我在堆栈溢出上读到过,如果总是,则连接应该尽可能晚打开,并尽可能快地关闭。

这个问题有什么解决办法吗?

这是我的代码:

代码语言:javascript
复制
Imports MySql.Data.MySqlClient
Imports System.Threading

Public Class Form1

Private server As String = Nothing
Private pass As String = Nothing
Private user As String = Nothing
Private port As String = Nothing
Private db As String = Nothing

Dim Thread1 As Thread
Dim Thread2 As Thread

Dim con As New MySqlConnection
Dim cmd As New MySqlCommand
Dim reader As MySqlDataReader

Public Sub New()
    Me.server = "localhost"
    Me.user = "root"
    Me.pass = ""
    Me.port = "3306"
    Me.db = "diagnosedb"
    cmd.Connection = con
    con.ConnectionString = "Server = " & Me.server & ";
                            Port = " & Me.port & ";
                            Database = " & Me.db & ";
                            Uid = " & Me.user & ";
                            Pwd = " & Me.pass & ";"
    Thread1 = New Thread(AddressOf Querie1)
    Thread2 = New Thread(AddressOf Querie2)

    Thread1.Start()
    Thread2.Start()
End Sub


Private Sub Querie1()
    cmd.CommandText = "UPDATE teileliste
                       SET verschleis = 500
                       WHERE ID = 1;"
    Try
        con.Open()
        cmd.ExecuteNonQuery()
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        con.Close()
    End Try
End Sub


Private Sub Querie2()
    cmd.CommandText = "UPDATE teileliste
                       SET verschleis = 0
                       WHERE ID = 20;"
    Try
        con.Open()
        cmd.ExecuteNonQuery()
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        con.Close()
    End Try
End Sub

End Class
EN

回答 1

Stack Overflow用户

发布于 2018-01-13 00:58:00

Querie1Querie2方法中创建并关闭一个新连接。不能用一个连接进行多个并发操作。(即使可以,也要在这两种方法中关闭连接。一种方法可能试图关闭它,而另一种方法则使用它。)

.NET框架擅长管理连接。当您在代码中打开和关闭它们时,它实际上会在短时间内保持连接的打开。这称为线程池。当你关闭一个连接时,它实际上是暂时打开的。当您打开一个新连接时,它可能会给您提供相同的连接。

大多数时候,我们不需要注意到这一点。我们所做的就是尽可能接近打开和使用它的时候创建一个新连接,然后尽快关闭(释放)它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48227088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档