VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 805|回复: 7

请教连接sql错误时的侦错方法,多谢

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-2 15:10:01 | 显示全部楼层 |阅读模式
我使用vb连接sqlserver,连接函数如下:

Public Function ExecuteSQL(ByVal sql As String) As ADODB.Recordset
Dim mycon As New ADODB.Connection
Dim rst As New ADODB.Recordset
Set mycon = New ADODB.Connection
'On Error GoTo err
mycon.ConnectionString = connstring
mycon.CursorLocation = adUseClient
mycon.CommandTimeout = 5
mycon.Open

'    Exit Function
'    err.Clear
Dim stokens() As String
'On Error GoTo exectuesql_error
stokens = Split(sql)
If InStr("INSER,DELETE,UPDATE", UCase(stokens(0))) Then
      mycon.Execute sql
Else
  Set rst = New ADODB.Recordset
  rst.Open Trim(sql), mycon, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
End If

End Function

Public Function connstring(serverip) As String
connstring = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=e;Initial Catalog=tt;Data Source=(local)"
End Function

调用的时候使用
............
txtsql1 = "select * from person where username='ixcw'"
    Set mrc = ExecuteSQL(txtsql1, serverip)

    If mrc.EOF = False Then
        sss = MsgBox("存在!")
    Else
        sss = MsgBox("不存在!")
    End If
..............
当提供的sqlserver信息正确时,没有问题,但当sql权限有误时就会出现错误,提示sql不存在或连接错误,点确定后,程序就关闭了,想知道如何加上检查sql是否连接成功的代码,并正确中止查询事件,多谢!
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-2 15:12:01 | 显示全部楼层
说实在话,我觉得你上面的代码非常的多余

ado和ado.net不一样的,在ado中一般采用的是持续打开,也就是打开一次就OK,尽量不去关闭connection,不停开关connection实际消耗是更大的

你的很多代码是没有任何用途的。修改一部分,看注释部分
Option Explicit

'将Connection和recordset定义成全局,除非有小范围的必要才用局部
Public mycon As New ADODB.Connection
Public rst As New ADODB.Recordset

Public Function ExecuteSQL(ByVal sql As String) As ADODB.Recordset

    Dim strConn As String  '定义连接参数

    'Connetcion是赋值
    strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=e;Initial Catalog=tt;Data Source=(local)"

    '加入判断Connection是否正常连接的function

   ' Set mycon = New ADODB.Connection'这句话完全没有任何必要,因为你上面已经实例化了Connection了
  '用function来判断sql是否已正常打开
  If LoadConn = False Then Exit Function
  
   
    Dim stokens() As String

    stokens = Split(sql)
    If InStr("INSER,DELETE,UPDATE", UCase(stokens(0))) Then
        Debug.Print sql '先把你的sql debug.print出来看是否正确,另外建议用strsql这样的声明,而不是sql。上面判断代码不知道你写了些什么条件,感觉很乱
        mycon.Execute sql
    Else
       ' Set rst = New ADODB.Recordset  依旧是多余的代码
        rst.Open Trim(sql), mycon, adOpenKeyset, adLockOptimistic
        Set ExecuteSQL = rst
    End If

End Function

'设置boolen来判断是否正常连接
Public Function LoadConn(strConn As String) As Boolean
  On Error GoTo err:
  mycon.CursorLocation = adUseClient
  mycon.Open strConn
  mycon.CommandTimeout = 5
  
  mycon.Open
  LoadConn = True
  Debug.Print "正常打开"
err:
  LoadConn = False
  Debug.Print "无法打开sql"
  err.Clear
  
End Function

回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-2 15:15:01 | 显示全部楼层
我看过很多人写代码写得五花八们,用个词就叫做自以为是。

实际上我觉得你连什么是function和sub都分不清楚,用得一塌糊涂
包括你这个Public Function ExecuteSQL(ByVal sql As String) As ADODB.Recordset我不知道是用来干什么的,所以没有办法去彻底修改。

你最好把ado的帮助读读,仔细看几个思路清楚的代码,你上面的代码一塌糊涂。Connection和recordset怎么用,什么时候用,怎么声明,声明范围完全都没弄清楚。

当然最简单的变量与err判断你也不会。。。
回复

使用道具 举报

0

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-5 18:06:02 | 显示全部楼层
声明和定义的概念还没搞清
Dim mycon As New ADODB.Connection 声明+定义
Set mycon = New ADODB.Connection 定义
虽说不会出错,但会混乱

'比较合理的写法

Dim mycon As ADODB.Connection 声明
...
on error goto errHander
Set mycon = New ADODB.Connection 定义
...
errHandler:
'出错处理


回复

使用道具 举报

0

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-5 18:09:01 | 显示全部楼层
声明和定义的概念还没搞清
Dim mycon As New ADODB.Connection 声明+定义
Set mycon = New ADODB.Connection 定义
虽说不会出错,但会混乱

'比较合理的写法

Dim mycon As ADODB.Connection 声明
...
on error goto errHander
Set mycon = New ADODB.Connection 定义
...
errHandler:
'出错处理


回复

使用道具 举报

0

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-5 18:12:01 | 显示全部楼层
概念有些混乱哦
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-6 07:48:01 | 显示全部楼层
mycon.Open  
   LoadConn  =  True  
   Debug.Print    "正常打开  "  
'加一句
exit function

补充上面的,我只是忘记写,看来你自己也是连err我写错了也没发现-_-
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-6 11:33:01 | 显示全部楼层
连接打开后不用最好关闭,如果什么程序都反复使用这一个连接,有可能会死机,我就遇到过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表