有关ADO的使用问题请教!

wenxuech 2003-11-14 11:14:04
我写了一段数据库的程序,考虑了好长时间就是没法子解决问题,请高手帮个忙。第一个解决了我的问题的,100分奉送,绝不食言!
首先是我的公用模块代码,大家看看有没有缺陷:
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
'传递参数SQL传递查询语句,MsgString传递查询信息
'自身以一个数据集对象的形式返回
Dim cnn As ADODB.Connection '定义连接
Dim rst As ADODB.Recordset '定义字符串
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
'用split函数产生一个包含各个子串的数组
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
'打开连接
cnn.Open ConnectString
'判断字符串中是否含有指定内容
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误:" & Err.Description
Resume ExecuteSQL_Exit
Exit Function
End Function
Public Function ConnectString() As String
ConnectString = "FileDSN=GenerSoft.dsn;UID=sa;PWD=wenxuech"
End Function
Public Function Testtxt(txt As String) As Boolean
If Trim(txt) = "" Then
Testtxt = False
Else
Testtxt = True
End If
End Function
Sub main()
Dim fLogin As New frmLogin
fLogin.Show vbModal
If Not fLogin.OK Then
End
End If
Unload fLogin
Set fMainForm = New frmMain
fMainForm.Show
End Sub
然后我做了一个用户登陆的窗体,运行时老是出错,说对象变量或with块变量未设置:
Option Explicit
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdOK_click()
Dim txtSQL As String
Dim mrc As ADODB.Recordset
Dim MsgText As String
If Trim(txtUserName.Text) = "" Then
MsgBox "请输入用户名称!", vbOKOnly + vbExclamation, "警告"
Exit Sub
txtUserName.SetFocus
Else
txtSQL = "select * from userinfo"
Set mrc = ExecuteSQL(txtSQL, MsgText)

While (mrc.EOF = False) //此行出错,请高手看一下怎么办
If Trim(mrc.Fields(0)) = Trim(txtUserName.Text) Then
MsgBox "用户已经存在,请重新输入用户名!", vbOKOnly + vbExclamation, "警告"
txtUserName.SetFocus
txtUserName.Text = ""
txtPassword.Text = ""
txtConfirm.Text = ""
Exit Sub
Else
mrc.MoveNext
End If
Wend
End If
If Trim(txtPassword.Text) <> Trim(txtConfirm.Text) Then
MsgBox "两次输入的密码不一样,请确认!", vbOKOnly + vbExclamation, "警告"
txtPassword.SetFocus
txtPassword.Text = ""
txtConfirm.Text = ""
Exit Sub
Else
If txtPassword.Text = "" Then
MsgBox "密码不能为空!", vbOKOnly + vbExclamation, "警告"
txtPassword.SetFocus
txtPassword.Text = ""
txtConfirm.Text = ""
Else
mrc.AddNew
mrc.Fields(0) = Trim(txtUserName.Text)
mrc.Fields(1) = Trim(txtPassword.Text)
mrc.Update
Me.Hide
MsgBox "添加用户成功!", vbOKOnly + vbExclamation, "添加用户"
End If
End If
End Sub
界面十分简单,没必要描述了。
急等回音,坚决付分!
...全文
15 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xzp1030 2003-11-22
我又看了一遍代码,你改为这样试试,好象是executesql没有定义。
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
'传递参数SQL传递查询语句,MsgString传递查询信息
'自身以一个数据集对象的形式返回
Dim cnn As ADODB.Connection '定义连接
Dim rst As ADODB.Recordset '定义字符串
Dim sTokens() As String
dim ExecuteSQL as new adodb.recordset
On Error GoTo ExecuteSQL_Error
'用split函数产生一个包含各个子串的数组
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
'打开连接
cnn.Open ConnectString
'判断字符串中是否含有指定内容
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误:" & Err.Description
Resume ExecuteSQL_Exit
Exit Function
End Function
回复
guolei0813 2003-11-19
有意思
回复
tanggengfeng 2003-11-19
这个问题和人邮版《VB信息系统开发》一样
回复
wenxuech 2003-11-19
我把返回nothing的语句给删掉了,还是不成功,相同的问题还是出现了,楼上的兄弟,你应该知道我的代码的作用的,能不能给我重写一个?
回复
email0755 2003-11-19
这个我认为应该这样:
去掉这个:
Set rst = Nothing
Set cnn = Nothing
释放了系统资源,过程(Fuction)本身随之释放了,所以为Nothing!
其它地方加入控制就完美了!
以上过程经过调试通过,没有问题!若有其它问题,欢迎与email0755@tom.com 联系!!
回复
xinshou1979330 2003-11-19
在判断前加一个
if rs.eof then
、、、
、、、
else
、、、
、、、
end if

在写前要加个数据库判断
来判断数据库是否为空
回复
yimengxiaoxin 2003-11-19
本来就是的
回复
xzp1030 2003-11-14
公用模块改为
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
'传递参数SQL传递查询语句,MsgString传递查询信息
'自身以一个数据集对象的形式返回
Dim cnn As new ADODB.Connection '定义连接
Dim rst As new ADODB.Recordset '定义字符串
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
'用split函数产生一个包含各个子串的数组
sTokens = Split(SQL)
'打开连接
cnn.Open ConnectString
'判断字符串中是否含有指定内容
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
Set ExecuteSQL = rst
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误:" & Err.Description
Resume ExecuteSQL_Exit
Exit Function
End Function
回复
guoyx 2003-11-14
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
1、如果你执行的是"INSERT,DELETE,UPDATE"操作,没有返回记录集,当然出错
2、else条件时,如果你set rst=nothing,那样你的记录集也是传不出去.
回复
yoki 2003-11-14
Set cnn = New ADODB.Connection
'打开连接
cnn.Open ConnectString
'判断字符串中是否含有指定内容
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
Set rst = New ADODB.Recordset
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
改成:
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
'打开连接
cnn.Open ConnectString
'判断字符串中是否含有指定内容
If InStr("INSERT,DELETE,UPDATE", UCase$(sTokens(0))) Then
cnn.Execute SQL
MsgString = sTokens(0) & "query successful"
Else
rst.Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
MsgString = "查询到" & rst.RecordCount & "条记录"
End If
Set ExecuteSQL = rst
回复
yoki 2003-11-14
将Set rst = New ADODB.Recordset放到if前试试
回复
sogno 2003-11-14
我试了一下,代码本身没有什么问题。
从出错的那一行来看是mrc没有赋值,而mrc是由函数ExecuteSQL返回的,也就是说ExecuteSQL返回了nothing,而ExecuteSQL只有在发生了错误的时候才返回nothing,而你在调用方的代码里没有检查ExecuteSQL返回的消息字符串,所以问题很有可能发生在ExecuteSQL中。你检查一下,是不是连接串写错了,或者数据库文件出了问题,文件名/路径不对,或者要访问的表不存在,等等。
回复
wenxuech 2003-11-14
太可怜了,问题还是没有解决?谁能给我可用的相似的公用模块呢?
回复
相关推荐
发帖

1188

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2003-11-14 11:14
社区公告
暂无公告