VB调用存储过程
- 格式:doc
- 大小:50.00 KB
- 文档页数:6
vb调用存储过程的返回值VB调用存储过程的返回值在VB中,调用存储过程是一种非常常见的操作。
存储过程可以用于执行一系列的数据库操作,并返回一个结果集、一个标志值或者两者的组合。
通过调用存储过程,我们可以在VB程序中对数据库进行相应的操作和查询。
本文将详细介绍如何在VB中调用存储过程,并获取存储过程的返回值。
第一步:准备工作在开始调用存储过程之前,我们首先需要在数据库中创建相应的存储过程。
存储过程可以使用SQL Server Management Studio等工具进行创建和修改。
以下是一个简单的存储过程示例:CREATE PROCEDURE GetProductCount@CategoryID INT,@ProductCount INT OUTPUTASBEGINSELECT @ProductCount = COUNT(*)FROM ProductsWHERE CategoryID = @CategoryIDEND上面的存储过程接受一个输入参数@CategoryID,并将符合条件的产品数量赋值给输出参数@ProductCount。
接下来,我们将在VB中调用这个存储过程,并获取返回的产品数量。
第二步:连接数据库首先,我们需要在VB中建立与数据库的连接。
可以使用ADODB库的Connection对象来实现这一功能。
以下是一个建立数据库连接的示例代码:Dim conn As New ADODB.Connectionconn.ConnectionString = "Provider=SQLOLEDB;DataSource=ServerName;Initial Catalog=DatabaseName;UserID=UserName;Password=Password"conn.Open在上面的代码中,需要将ServerName、DatabaseName、UserName 和Password替换为实际的数据库服务器名称、数据库名称、用户名和密码。
数据库编程(06):调用存储过程(带参和不参数情况)先建立一个无参的存储过程,为下面第一个无参调用作准备:[sql]view plaincopyprint?e Sales2.go3.create procedure sp_getGrade4.as5.select * from grade where 数学>606.go注:go是作为前面批处理的结束情况。
因为前面执行是要花时间的,如果后面执行的要依赖前面结果,没有go的话,有可能前面没有执行完,当然后面依赖此结果的语句就会执行错误。
所以go 的作用很大。
再复习的过程:一、连接数据库二、发出指令。
command默认是commandType.text。
因为是存储过程,所以应指明为commandType.StoreProcedure三、填充结果集,显示。
所以代码如下:[vb]view plaincopyprint?1.Imports System.Data.SqlClient2.3.Public Class Form14.Dim cn As SqlConnection5.Dim cm As SqlCommand6.Dim da As SqlDataAdapter7.Dim ds As DataSet8.9.Private Sub Button1_Click(sender As Object, e As EventAr gs) Handles Button1.Click10.Try = New SqlConnection("Data Source=(local);Initial C atalog=Sales;Integrated Security=false;User ID=sa;Password=12 3456;").Open() '此句不省13.cm = New SqlCommand("sp_getGrade", cn)mandType = CommandType.StoredProcedure '指明为存储过程15.da = New SqlDataAdapter(cm)16.ds = New DataSet()17.da.Fill(ds, "grade")18.DataGridView1.DataSource = ds.Tables("grade").Close()20.Catch ex As Exception21.MessageBox.Show("执行失败")22.End Try23.End Sub24.End Class结果如下:====================================== ========================================= =================下面是一个带参数的存储过程的调用。
存储过程spREA TE PROCEDURE sp@dept varchar(10) ,@sno varchar(10)ASSELECT s.sno, s.sname, ISNULL(A VG(grade),-1) average FROM s,scWHERE sdept=@dept and s.sno>=@sno and s.sno=sc.sno group by s.sno,s.snameRETURNGODim cnn1 As ADODB.Connection '连接Dim mycommand As mand '命令Dim parm_dept As ADODB.Parameter '参数1Dim parm_sno As ADODB.Parameter '参数2Dim rstByQuery As ADODB.Recordset '结果集Dim strCnn As String '连接字符串Private Sub Command1_Click()Dim i As IntegerDim j As IntegerSet parm_dept = New ADODB.ParameterSet mycommand = New mand' parm_ = "name1"parm_dept.Type = adChar '参数类型parm_dept.Size = 10 '参数长度parm_dept.Direction = adParamInput'参数方向,输入或输出parm_dept.V alue = "计科系" '参数的值mycommand.Parameters.Append parm_dept '加入参数Set parm_sno = New ADODB.Parameter'parm_ = "name2"parm_sno.Type = adIntegerparm_sno.Size = 10parm_sno.Direction = adParamInputparm_sno.V alue = "1501"mycommand.Parameters.Append parm_snomycommand.ActiveConnection = cnn1'指定该command 的当前活动连接mandText = "sp"'myprocedure 是你要调用的存储过程名称mandType = adCmdStoredProc'表明command 为存储过程Set rstByQuery = New ADODB.RecordsetSet rstByQuery = mycommand.Execute()MSFlexGrid1.Rows = 1'动态设置MSFlexGrid的行和列MSFlexGrid1.Cols = rstByQuery.Fields.Count MSFlexGrid1.Row = 0For i = 0 To rstByQuery.Fields.Count - 1MSFlexGrid1.Col = iMSFlexGrid1.Text = rstByQuery.Fields.Item(i).Name Next '设置第一行的标题,用域名填充i = 1Do While Not rstByQuery.EOFMSFlexGrid1.Rows = MSFlexGrid1.Rows + 1MSFlexGrid1.Row = i '确定行For j = 0 To rstByQuery.Fields.Count - 1MSFlexGrid1.Col = jMSFlexGrid1.Text = rstByQuery(j)'添充所有的列NextrstByQuery.MoveNexti = i + 1LoopEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()Set cnn1 = New ADODB.Connection'生成一个连接strCnn = "DRIVER=SQL Server; SERVER=192.168.1.4; UID=sa; PWD=; DA TABASE=sample"cnn1.Open strCnn '打开连接End SubPrivate Sub Form_Unload(Cancel As Integer) cnn1.Close '关闭连接Set cnn1 = Nothing '释放连接End Sub。
关键字:数据库;SQL Server2000;存储过程;应用程序;VB存储过程存储过程是存储在服务器上的一组预编译的Transact-SQL语句,是一种封装重复任务操作的方法,支持用户提供的变量,具有强大的编程功能。
它类似于DOS系统中的BAT文件。
在BAT文件中,可以包含一组经常执行的命令,这组命令通过BAT文件的执行而被执行。
同样的道理,可以把要完成某项任务的许多Transact-SQL语句写在一起,组织成存储过程的形式,通过执行该存储过程就可以完成这项任务。
存储过程与BAT文件又有差别,即存储过程已经进行了预编译。
1、创建存储过程的方法在Transact-SQL语言中,创建存储过程可以使用CREATE PROCEDURE语句,其语法形式如下:CREATE PROC[EDURE] procedure_name[;number][{@parameter data_type}[VARYING][=default][OUTPUT]]],…n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FOR REPLICATION]AS sql_statement[…n]在上面的CREATE PROCEDURE语句中,方括号"[ ]"中的内容是可选的,花括号"{}"中的内容是必须出现的,不能省略,[,…n]表示前面的参数样式,可以重复出现。
竖线"|"表示两边的选项可以任选一个。
下面分析该语句中各种选项的含义。
CREATE PROCEDURE是关键字,也可以写成CREATE PROC。
procedure_name是该存储过程的名称,名称可以是任何符合命名规则的标示符。
名称后的[;number]参数表示可以定义一系列的存储过程名称,这些存储过程的数量由number 指定。
参数名称可以使用@parameter data_type来指定。
VB中访问存储过程的几种办法使用SQL存储过程有什么好处■SQL存储过程执行起来比SQL命令文本快得多。
当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。
■调用存储过程,可以认为是一个三层结构。
这使你的程序易于维护。
如果程序需要做某些改动,你只要改动存储过程即可■你可以在存储过程中利用Transact-SQL的强大功能。
一个SQL存储过程可以包含多个SQL 语句。
你可以使用变量和条件。
这意味着你可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。
■最后,这也许是最重要的,在存储过程中可以使用参数。
你可以传送和返回参数。
你还可以得到一个返回值(从SQL RETURN语句)。
环境:WinXP+VB6+sp6+SqlServer2000数据库:test表:UsersCREATE TABLE [dbo].[users] ([id] [int] IDENTITY (1, 1) NOT NULL ,[truename] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[regname] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[pwd] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[sex] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[email] [text] COLLATE Chinese_PRC_CI_AS NULL ,[jifen] [decimal](18, 2) NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]ALTER TABLE [dbo].[users] WITH NOCHECK ADDCONSTRAINT [PK_users] PRIMARY KEY CLUSTERED([id]) ON [PRIMARY]GO存储过程select_usersCREATE PROCEDURE select_users @regname char(20), @numrows int OUTPUT ASSelect * from usersSELECT @numrows = @@ROWCOUNTif @numrows = 0return 0else return 1GO存储过程insert_usersCREATE PROCEDURE insert_users @truename char(20), @regname char(20),@pwd char(20),@sex char(20),@email char(20),@jifen decimal(19,2)ASinsert into users(truename,regname,pwd,sex,email,jifen) values(@truename,@regname,@pwd,@sex,@email,@jifen)GO在VB环境中,添加DataGrid控件,4个按钮,6个文本框代码简单易懂。
调用存储过程的通用方法[摘要] 在中存储过程的调用模式几乎一样,不同之处是每个存储过程的参数不同,所以每调用一次存储过程重复代码很多,这在做项目时很麻烦。
笔者经过实践实现了在中调用存储过程的简单方法,该方法只需要提供要调用的存储过程名字和提供具体的参数值就可实现任何存储过程的调用。
[关键词] ;存储过程;系统表;信息结构视图笔者在用做项目时,很多时候要调用数据库中的存储过程,因为使用存储过程使得程序在调试、升级、维护方面都变得方便,时间久了,笔者发现存储过程的调用模式几乎一样,差别只是在于调用不同的存储过程的参数不同,所以每调用一次存储过程都要写一大堆几乎一样的代码,这在做项目时很麻烦,所以就想找一种简便的调用存储过程的方法。
笔者通过查找资料和编程实践实现了在中调用存储过程的通用方法。
该方法只需要提供要调用的存储过程名字和提供具体的参数值就可实现任何存储过程的调用。
在中存储过程分为有返回值的和无返回值的,不论哪种存储过程,它的调用方法都可以概括为下面的几步:(1) 声明一个Sql Connection实例。
(2) 声明一个Sql Command实例,并且设置其Connection属性为刚声明的Sql Connection实例,设置CommandName为存储过程名,CommandType为存储过程。
(3) 向声明的Sql Command实例的Parameters集合中添加所有的存储过程调用需要的参数。
(4) 声明Sql DataAdapter和DataSet,设置Sql DataAdapter的SelectCommand 属性为2中声明的Sql Command实例,再调用其Fill方法来把返回的行集填充到DataSet中。
(5) 关闭Sql Connection实例。
(6) 释放声明的各个实例。
调用不同的存储过程,只是第二步的CommandName和第三步中的参数不同。
我们要写一个通用的调用存储过程的方法,该方法只需要提供要调用的存储过程名字和提供具体的参数值就可实现任何存储过程的调用,那么就要自动实现如何根据存储过程名来得到它所有的参数信息,再根据这些参数信息自动创建各个参数。
在ADO中调用存储过程一直是一个困扰大家的问题。
其实,关于ADO调用存储过程的方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行:1、生成并初始化一个_CommandPtr对象;2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数);4、为_CommandPtr对象指定需要使用的ADO连接;5、使用_CommandPtr的Execute方法调用存储过程;6、从结果中获取返回参数的值(如果有的话)。
具体的过程在此我不详细描述,我想看看本文附带的代码就应该很明白了。
在这里我想就我使用ADO调用存储过程时的一些体会说明一下。
1、关于CreateParameter函数该函数的原型为:CreateParameter (Name, Type, Direction, Size, Value)其中Name是参数的名称,可以指定也可以不指定;Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar(字符/字符串型)等;Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、adParamOutput、adParamReturnValue、adParamUnknown;Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int),对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度;Value是一个variant类型的值,是该参数的取值。
在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,例如,如果有下面一个存储过程CREATE PROCEDURE SMS_Proc_Handle_All(@UserID Integer,@SourAddr Varchar(15),@DestAddr varchar(5000),@AvValue Single output,@ReturnInfo varchar(100) output)则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar;Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut;对于输入参数,Size的值可以根据实际数值来定,对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的Size值可以取为100)。
vb调用存储过程实例嘿,朋友们!今天咱就来聊聊 VB 调用存储过程实例这档子事儿。
你看啊,这 VB 就像是一个聪明的小工匠,而存储过程呢,就像是一个装满了各种奇妙工具和技巧的百宝箱。
当 VB 这个小工匠想要完成一些复杂又厉害的任务时,它就得去打开那个存储过程的百宝箱,从中挑选出合适的工具来用。
比如说吧,我们要处理一堆数据,就好像要把一堆杂乱无章的积木搭建成一个漂亮的城堡。
VB 自己一个人可能会手忙脚乱,但有了存储过程,就像是有了一套详细的搭建指南。
它可以告诉 VB 该怎么一步一步地去做,先拿哪块积木,怎么摆放,怎样才能让城堡更稳固。
那怎么让 VB 顺利地调用存储过程呢?这可得有点小窍门啦!就好像你要打开一把复杂的锁,得知道怎么摆弄钥匙一样。
首先,你得告诉 VB 那个存储过程在哪里,就像是给它指明宝藏的位置。
然后呢,VB 得知道怎么和存储过程“对话”,怎么把自己的需求传达过去,又怎么接收存储过程给它的反馈。
这就好像你和朋友之间的交流,你得把你的想法清楚地说出来,朋友才能明白,然后朋友给你回应,你才能知道接下来该怎么做。
如果VB 没和存储过程“沟通”好,那可就乱套啦,就像你和朋友说话互相听不懂一样,那还怎么合作完成任务呢?在这个过程中,可不能粗心大意哦!一个小细节没注意到,可能就会导致整个程序出问题。
这就像盖房子,一块砖没放好,说不定整面墙都会倒掉呢!而且啊,不同的存储过程就像不同的百宝箱,里面的工具和方法都不一样,VB 可得好好研究,才能找到最适合的那个。
你说这 VB 调用存储过程实例是不是很有意思?它让我们能更高效地处理数据,更轻松地完成各种复杂的任务。
想想看,如果没有这种方式,我们得写多少繁琐的代码啊!现在有了它,就像是有了一个得力的助手,帮我们把那些麻烦事儿都搞定了。
所以啊,朋友们,好好去探索 VB 调用存储过程实例吧!让它为我们的程序带来更多的精彩和便利。
别害怕遇到问题,就像走路会摔跤一样,那都是成长的过程。
存储过程sp
REA TE PROCEDURE sp
@dept varchar(10) ,
@sno varchar(10)
AS
SELECT s.sno, s.sname, ISNULL(A VG(grade),-1) average FROM s,sc
WHERE sdept=@dept and s.sno>=@sno and s.sno=sc.sno group by s.sno,s.sname
RETURN
GO
Dim cnn1 As ADODB.Connection '连接
Dim mycommand As mand '命令
Dim parm_dept As ADODB.Parameter '参数1
Dim parm_sno As ADODB.Parameter '参数2
Dim rstByQuery As ADODB.Recordset '结果集
Dim strCnn As String '连接字符串
Private Sub Command1_Click()
Dim i As Integer
Dim j As Integer
Set parm_dept = New ADODB.Parameter
Set mycommand = New mand
' parm_ = "name1"
parm_dept.Type = adChar '参数类型
parm_dept.Size = 10 '参数长度
parm_dept.Direction = adParamInput
'参数方向,输入或输出
parm_dept.V alue = "计科系" '参数的值
mycommand.Parameters.Append parm_dept '加入参数Set parm_sno = New ADODB.Parameter
'parm_ = "name2"
parm_sno.Type = adInteger
parm_sno.Size = 10
parm_sno.Direction = adParamInput
parm_sno.V alue = "1501"
mycommand.Parameters.Append parm_sno
mycommand.ActiveConnection = cnn1
'指定该command 的当前活动连接
mandText = "sp"
'myprocedure 是你要调用的存储过程名称mandType = adCmdStoredProc
'表明command 为存储过程
Set rstByQuery = New ADODB.Recordset
Set rstByQuery = mycommand.Execute()
MSFlexGrid1.Rows = 1
'动态设置MSFlexGrid的行和列
MSFlexGrid1.Cols = rstByQuery.Fields.Count MSFlexGrid1.Row = 0
For i = 0 To rstByQuery.Fields.Count - 1
MSFlexGrid1.Col = i
MSFlexGrid1.Text = rstByQuery.Fields.Item(i).Name Next '设置第一行的标题,用域名填充
i = 1
Do While Not rstByQuery.EOF
MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
MSFlexGrid1.Row = i '确定行
For j = 0 To rstByQuery.Fields.Count - 1
MSFlexGrid1.Col = j
MSFlexGrid1.Text = rstByQuery(j)
'添充所有的列
Next
rstByQuery.MoveNext
i = i + 1
Loop
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_Load()
Set cnn1 = New ADODB.Connection
'生成一个连接
strCnn = "DRIVER=SQL Server; SERVER=192.168.1.4; UID=sa; PWD=; DA TABASE=sample"
cnn1.Open strCnn '打开连接
End Sub
Private Sub Form_Unload(Cancel As Integer) cnn1.Close '关闭连接
Set cnn1 = Nothing '释放连接
End Sub。