con.close与con=nothing的区别

本文讨论了在使用ADO进行数据库操作时如何正确管理连接。通过具体的代码示例解释了何时使用con.close()来关闭连接,以及何时避免设置con为Nothing以保持连接的可用性。

con.close()只是关闭了连接,并没有清除con,要想再使用它需要con.open()再重新开启就可以了。

ADO中用的是传址,所以如果con=nothing就表示清除了con,外部函数就用不了了。如果想还使用连接,就必须再创建一个con对象,然后再打开使用。

今日做系统的时候遇到了这个问题:

首先,先执行了下面的代码

Sub AddQuitRecord(ByVal backcard As Entry.BackCard) Dim sql As String = "Insert into backcard values('" & backcard.CardID & "','" & backcard.BackDate & "','" & backcard.BackTime & "','" & backcard.BackCash & "','" & backcard.Actor & "')" Dim sqlcmd As SqlCommand = New SqlCommand(sql, con) Try con.Open() sqlcmd.ExecuteReader() con.Close() Catch ex As Exception End Try If Not IsNothing(con) Then con.Close() con = Nothing End If End Sub

由于上面代码中已经执行了con=Nothing,导致下面的运行到con.open()的时候,就会报错。

在这里,我们没有必要清楚con,所以我们需要关闭连接就可以了,所以正解是将上面的con=nothing删去。在执行到下面代码是就不会报错了。

Public Function QuitCard(ByVal quitcardd As Entry.BackCard) As Boolean Dim sql As String = "Update card set static='" & False & "' where cardnumber='" & quitcardd.CardID & "'" Dim sqlcmdd As SqlCommand = New SqlCommand(sql, con) Try con.Open() Return sqlcmdd.ExecuteNonQuery > 0 Catch ex As Exception Return False End Try If Not IsNothing(con) Then con.Close() End If End Function



Public ConnectionString As String Public SysChange As Boolean Sub 定额查询及维护() UserForm1.Show End Sub Sub 日志查询() UserForm2.Show 0 Call 清除 End Sub Public Function Address_ConnectionString() Dim FS Dim conAddress As String On Error Resume Next conAddress = "D:\定额库\dek.xls" Set FS = CreateObject("Scripting.FileSystemObject") CONNECT_DB: If FS.FileExists(Trim(conAddress)) Then ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & conAddress & ";User ID=;Password=;Extended Properties=Excel 8.0" Else MsgBox "无法连接到数据库数据库已被破坏!", vbInformation, "警告!" End If Set FS = Nothing End Function Public Function ExecuteSQL(sql As String, RecordCount As Integer, TxtString As String) As ADODB.Recordset Dim Rst As ADODB.Recordset Dim Con As ADODB.Connection Dim Stokens() As String On Error Resume Next If ConnectionString = "" Then Address_ConnectionString On Error GoTo Execute_Error Stokens = Split(sql) Set Con = New ADODB.Connection Con.Open ConnectionString If InStr("INSERT,DELETE,UPDATE", UCase$(Stokens(0))) Then Con.Execute sql TxtString = "" Else Set Rst = New ADODB.Recordset Rst.Open sql, Con, adOpenKeyset, adLockOptimistic Set ExecuteSQL = Rst RecordCount = CLng(Rst.RecordCount) TxtString = "" End If Execute_Exit: Set Rst = Nothing Set Con = Nothing Exit Function Execute_Error: RecordCount = 0 TxtString = "Inquiry Error: " & Err.Description & "!" Con.Close Resume Execute_Exit End Function Public Function GetData(ByVal curNumber As String, ByVal curTarget As Range) As ADODB.Recordset Dim TxtString As String Dim sql As String Dim RecordCount As Integer Dim Rst As ADODB.Recordset Dim WS As Worksheet On Error Resume Next Set WS = Sheet2 sql = "select 编号,名称,单位,技工,普工 from [rg$] where [编号]='" & curNumber & "'" Set Rst = ExecuteSQL(sql, RecordCount, TxtString) If TxtString <> "" Then MsgBox TxtString If Rst.RecordCount = 1 Then While Rst.EOF = False SysChange = True If WS.Cells(curTarget.Row, 30) <> 1 Then WS.Cells(curTarget.Row, 32) = Rst.Fields("名称").Value & "(工日×" & Format(Trim(WS.Cells(curTarget.Row, 30)), "0.00") & ")" Else WS.Cells(curTarget.Row, 32) = Rst.Fields("名称").Value End If WS.Cells(curTarget.Row, 33) = Rst.Fields("单位").Value WS.Cells(curTarget.Row, 34) = Rst.Fields("技工").Value WS.Cells(curTarget.Row, 35) = Rst.Fields("普工").Value SysChange = False If Trim(WS.Cells(curTarget.Row, 29)) <> "" And WS.Cells(curTarget.Row, 29) > 0 Then WS.Cells(curTarget.Row, 36) = "=AC" & curTarget.Row & "*AD" & curTarget.Row & "*AH" & curTarget.Row WS.Cells(curTarget.Row, 37) = "=AC" & curTarget.Row & "*AD" & curTarget.Row & "*AI" & curTarget.Row End If Rst.MoveNext Wend End If Set Rst = Nothing End Function
最新发布
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值