VB 执行SQL语句

模块的代码:PublicconnAsNewADODB.ConnectionPublicrsAsNewADODB.RecordsetPubliccmdAsNewADODB.... 模块的代码:
Public conn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public cmd As New ADODB.Command

Const ConStr As String = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=student;Data Source=(local)"

Public Function OpenSQL() As Boolean
On Error GoTo OpenSQLError
conn.Open ConStr
OpenSQL = True
Exit Function
OpenSQLError:
OpenSQL = False
MsgBox ("ERROR!")
Exit Function
End Function

有问题的代码:
Private Sub B_save_Click()
For Index = 0 To 1
If Trim(S_info(Index)) = "" Then
MsgBox (Trim(Label1(Index).Caption) & "必须填写")
S_info(Index).SetFocus
Exit Sub
End If
Next Index

isSave = True

If OpenSQL = True Then

'获取性别
Dim sex As String
For Index = 0 To 1
If (S_sex(Index).Value) Then
sex = S_sex(Index).Caption
Exit For
End If
Next Index
'开始向输入数据
SQL = "insert into 个人信息表 values(" & _
S_info(0).Text & "," & _
sex & "," & _
S_info(1).Text & _
")"
rs.AddNew (SQL)
rs.Update
End If
End Sub

确认控件名没错,就是输入数据库失败,总体提示"rs.addnew"3704错误!
请高手指点!或提供别的代码也行!要求是必须使用SQL语句输入!
我这个是SQL数据库!详细点!我很菜!只要解决了问题!加分!
展开
 我来答
承奇水gt
2010-07-20 · TA获得超过514个赞
知道小有建树答主
回答量:264
采纳率:0%
帮助的人:153万
展开全部
VB中“对象关闭时,不允许操作”解决方案

最近两天在VB里弄一些小程序,好久没接触了,感觉有些陌生了,还算有点基础吧,遇到一些小的难题基本上都能解决。不过,这下真的遇到难题了,琢磨半天硬是没弄出结果来,在网上查资料也没个底,如同大海捞针呀,关键是没一点正经的答案和可行的方案。

问题是这样的,在VB中执行存储过程,想输出返回值并将数据绑定到DataGrid控件中,本来是件小菜的问题,在.NET、ASP里都做通过,但在VB里却是折磨了半天也没弄出来。还是自己动手吧,有问题就得想办法,一步步来吧。

先在SQL 2000中写好存储过程了,(这里不再写出存储过程的具体代码了,也就是一个返回值,一个记录集)然后在VB中引用ADO对象,输入如下代码,以调用存储过程:
Dim lackconn As New ADODB.Connection
lackconn.ConnectionString=Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=boyd;Initial Catalog=mydb;Data Source=(local)
lackconn.CursorLocation = adUseClient '设置为客户端
lackconn.Open

Set lackcmd = New ADODB.Command
lackcmd.ActiveConnection = lackconn
lackcmd.CommandText = myproc '这里为存储过程名称
lackcmd.CommandType = adCmdStoredProc '指定为存储过程
Set param = lackcmd.CreateParameter(@num, adInteger, adParamReturnValue, 4) '@num为返回值
lackcmd.Parameters.Append param
Set lackrs = New ADODB.Recordset
Set lackrs = lackcmd.Execute()
msgbox 站点总数: & lackcmd.Parameters(@num).Value & 个

Set mydatagrid.DataSource = lackrs 'mydatagrid为对象名称
mydatagrid.Refresh '刷新DataGrid
'下面关闭数据库对象等略去

就这样的一个简单的代码,一运行就出错,提示错误在“Set mydatagrid.DataSource = lackrs”,错误就是“对象关闭时,不允许操作”。郁闷ing...,这哪来的错误呢?我根本没关闭数据库连接,其他内容也是没有问题的呀。花了很长时间没能解决,大清早再打开电脑时,灵机一动,搞定了。这里将这种现象作下总结,顺便记录一下本次解决过程。

产生这种现象有几种原因:
1、数据库对象连接被关闭了,这肯定会报错的,当然也不能输出任何结果的,这时只需注意“先使用、后关闭”就行了,解决这样的问题就是暂时先不要关闭数据库连接就行了。

2、返回记录为空时,也会报错。如下面的代码
sql = select * from dbcn where 状态='0'
Set rs = conn.Execute(sql)
If Not rs.EOF Then
For m = 1 To rs.RecordCount
List_status.AddItem rs(1) & ( & rs(2) & ): & rs(4)
rs.MoveNext
Next m
End If
如果没有数据的话,这里也会提示这样的错误,将查询代码放到SQL查询分析器里运行一下,果然没有数据,呵呵。当然这样的错误可以采用一些方法排除或过滤的。

3、这就是我这次所遇到的问题的中心了,我们将目光转向存储过程。的确,在SQL查询分析器里,存储过程是正常运行,而且不会报错,也有数据。但仔细想想,因为在存储过程可能包含了有关SQL语句影响行数的信息,这样一来也就可能会导致这样的情况。
打开存储过程,在begin后面加上一句代码:set nocount on,屏蔽掉这些信息。OK,VB中的程序巳经能够正常运行了,而且数据也是正常的。

顺便解释一下吧,打开查询分析器中的帮助,查找一下有关set nocount on的信息,我们会找到这些东西:
====================================
SET NOCOUNT
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。
语法
SET NOCOUNT { ON | OFF }
注释
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。
即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。
当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示nn rows affected。
如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
权限
SET NOCOUNT 权限默认授予所有用户。
示例
下例在 osql 实用工具或 SQL Server 查询分析器中执行时,可防止显示有关受影响的行数的信息。
USE pubs
GO
-- Display the count message.
SELECT au_lname
FROM authors
GO
USE pubs
GO
-- SET NOCOUNT to ON and no longer display the count message.
SET NOCOUNT ON
GO
SELECT au_lname
FROM authors
GO
-- Reset SET NOCOUNT to OFF.
SET NOCOUNT OFF
GO

这里点到为止吧,具体的解释我想MS的帮助会比我说的更专业更清楚些,参考下吧。
shangfei8
2010-01-17 · 超过10用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:33.6万
展开全部
SQL = "insert into 个人信息表 values(" & _
S_info(0).Text & "," & _
sex & "," & _
S_info(1).Text & _
")"
格式不对,insert格式:
insert into 表名 (字段列表) values(对应字段的值)

另:

执行sql你用conn.execute(SQL)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e4249599c
推荐于2018-03-26 · TA获得超过496个赞
知道小有建树答主
回答量:575
采纳率:0%
帮助的人:638万
展开全部
rs.AddNew (SQL)
不是这样用的,

执行sql你用

rs.AddNew (SQL)
rs.Update
两句话替换为
conn.execute(SQL)
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangddtt
2010-01-17 · TA获得超过266个赞
知道小有建树答主
回答量:380
采纳率:0%
帮助的人:213万
展开全部
解决方法:

方法一:找到ACCESS数据库所在的文件夹--->右击属性-->安全,Everyone-->安全控制-->应用

方法二:找到ACCESS数据库,右击属性--->安全,Everyone---->安全控制--->应用

如果没有安全选项,按下面操作:
先在“工具栏”--“文件夹选项”中,在“查看”中将“使用简单文件共享(推荐)”前面的勾去掉,就出现“安全”了,这个安全是在“属性”里面的

这样就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9260c4507
2010-01-17 · TA获得超过2328个赞
知道大有可为答主
回答量:3736
采纳率:0%
帮助的人:2411万
展开全部
rs.AddNew
rs.fields("列名")=值
rs.Update
是这样用的
指定每列的值
command方式才是运行SQL语句的~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式