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

VB.net中怎么访问存储过程和实例教程

[复制链接]
发表于 2017-2-26 17:27:35 | 显示全部楼层 |阅读模式
VB.net中怎么访问存储过程和实例教程


  1.  使用SQL存储过程有什么好处
  2.   ■SQL存储过程执行起来比SQL命令文本快得多。当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。
  3.   ■调用存储过程,可以认为是一个三层结构。这使你的程序易于维护。如果程序需要做某些改动,你只要改动存储过程即可
  4.   ■你可以在存储过程中利用Transact-SQL的强大功能。一个SQL存储过程可以包含多个SQL语句。你可以使用变量和条件。这意味着你可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。
  5.   ■最后,这也许是最重要的,在存储过程中可以使用参数。你可以传送和返回参数。你还可以得到一个返回值(从SQL RETURN语句)。
  6.   环境:WinXP+VB6+sp6+SqlServer2000
  7.   数据库:test
  8.   表:Users
  9.   CREATE TABLE [dbo].[users] (
  10.   [id] [int] IDENTITY (1, 1) NOT NULL ,
  11.   [truename] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
  12.   [regname] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
  13.   [pwd] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
  14.   [sex] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
  15.   [email] [text] COLLATE Chinese_PRC_CI_AS NULL ,
  16.   [jifen] [decimal](18, 2) NULL
  17.   ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
  18.   GO
  19.   ALTER TABLE [dbo].[users] WITH NOCHECK ADD
  20.   CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
  21.   (
  22.   [id]  ) ON [PRIMARY]
  23.   GO
  24.   存储过程select_users
  25.   CREATE PROCEDURE select_users @regname char(20), @numrows int OUTPUT
  26.   AS
  27.   Select * from users
  28.   SELECT @numrows = @@ROWCOUNT
  29.   if @numrows = 0
  30.   return 0
  31.   else return 1
  32.   GO
  33.   存储过程insert_users
  34.   CREATE PROCEDURE insert_users @truename char(20), @regname char(20),@pwd char(20),@sex char(20),@email char(20),@jifen decimal(19,2)
  35.   AS
  36.   insert into users(truename,regname,pwd,sex,email,jifen) values(@truename,@regname,@pwd,@sex,@email,@jifen)
  37.   GO
  38.   在VB环境中,添加DataGrid控件,4个按钮,6个文本框
  39.   代码简单易懂。
  40.   ‘引用microsoft active data object 2.X library
  41.   Option Explicit
  42.   Dim mConn As ADODB.Connection
  43.   Dim rs1 As ADODB.Recordset
  44.   Dim rs2 As ADODB.Recordset
  45.   Dim rs3 As ADODB.Recordset Dim rs4 As ADODB.Recordset
  46.   Dim cmd As ADODB.Command
  47.   Dim param As ADODB.Parameter
  48.   '这里用第一种方法使用存储过程添加数据
  49.   Private Sub Command1_Click()
  50.   Set cmd = New ADODB.Command
  51.   Set rs1 = New ADODB.Recordset
  52.   cmd.ActiveConnection = mConn
  53.   cmd.CommandText = "insert_users"
  54.   cmd.CommandType = adCmdStoredProc
  55.   Set param = cmd.CreateParameter("truename", adChar, adParamInput, 20, Trim(txttruename.Text))
  56.   cmd.Parameters.Append param
  57.   Set param = cmd.CreateParameter("regname", adChar, adParamInput, 20, Trim(txtregname.Text))
  58.   cmd.Parameters.Append param
  59.   Set param = cmd.CreateParameter("pwd", adChar, adParamInput, 20, Trim(txtpwd.Text))
  60.   cmd.Parameters.Append param
  61.   Set param = cmd.CreateParameter("sex", adChar, adParamInput, 20, Trim(txtsex.Text))
  62.   cmd.Parameters.Append param
  63.   Set param = cmd.CreateParameter("email", adChar, adParamInput, 20, Trim(txtemail.Text))
  64.   cmd.Parameters.Append param
  65.   ‘下面的类型需要注意,如果不使用adSingle,会发生一个精度无效的错误
  66.   Set param = cmd.CreateParameter("jifen", adSingle, adParamInput, 50, Val(txtjifen.Text))
  67.   cmd.Parameters.Append param
  68.   Set rs1 = cmd.Execute
  69.   Set cmd = Nothing
  70.   Set rs1 = Nothing
  71.   End Sub
  72.   这里用第二种方法使用存储过程添加数据
  73.   Private Sub Command2_Click()
  74.   Set rs2 = New ADODB.Recordset
  75.   Set cmd = New ADODB.Command
  76.   cmd.ActiveConnection = mConn
  77.   cmd.CommandText = "insert_users"
  78.   cmd.CommandType = adCmdStoredProc
  79.   cmd.Parameters("@truename") = Trim(txttruename.Text)
  80.   cmd.Parameters("@regname") = Trim(txtregname.Text)
  81.   cmd.Parameters("@pwd") = Trim(txtpwd.Text)
  82.   cmd.Parameters("@sex") = Trim(txtsex.Text)
  83.   cmd.Parameters("@email") = Trim(txtemail.Text)
  84.   cmd.Parameters("@jifen") = Val(txtjifen.Text)
  85.   Set rs2 = cmd.Execute
  86.   Set cmd = Nothing
  87.   Set rs1 = Nothing
  88.   End Sub
  89.   '这里用第三种方法使用连接对象来插入数据
  90.   Private Sub Command4_Click()
  91.   Dim strsql As String
  92.   strsql = "insert_users '" amp; Trim(txttruename.Text) amp; "','" amp; Trim(txtregname.Text) amp; "','" amp; Trim(txtpwd.Text) amp; "','" amp; Trim(txtsex.Text) amp; "','" amp; Trim(txtemail.Text) amp; "','" amp; Val(txtjifen.Text) amp; "'"
  93.   Set rs3 = New ADODB.Recordset Set rs3 = mConn.Execute(strsql)
  94.   Set rs3 = Nothing
  95.   End Sub
  96.   '利用存储过程显示数据
  97.   ‘要处理多种参数,输入参数,输出参数以及一个直接返回值
  98.   Private Sub Command3_Click()
  99.   Set rs4 = New ADODB.Recordset
  100.   Set cmd = New ADODB.Command
  101.   cmd.ActiveConnection = mConn
  102.   cmd.CommandText = "select_users"
  103.   cmd.CommandType = adCmdStoredProc
  104.   '返回值
  105.   Set param = cmd.CreateParameter("RetVal", adInteger, adParamReturnValue, 4)
  106.   cmd.Parameters.Append param
  107.   '输入参数
  108.   Set param = cmd.CreateParameter("regname", adChar, adParamInput, 20, Trim(txtregname.Text))
  109.   cmd.Parameters.Append param
  110.   '输出参数
  111.   Set param = cmd.CreateParameter("numrows", adInteger, adParamOutput)
  112.   cmd.Parameters.Append param
  113.   Set rs4 = cmd.Execute()
  114.   If cmd.Parameters("RetVal")。Value = 1 Then
  115.   MsgBox cmd.Parameters("numrows")。Value
  116.   Else
  117.   MsgBox "没有记录"
  118.   End If
  119.   MsgBox rs4.RecordCount
  120.   Set DataGrid1.DataSource = rs4
  121.   DataGrid1.Refresh
  122.   End Sub
  123.   '连接数据库
  124.   Private Sub Form_Load()
  125.   Set mConn = New Connection
  126.   mConn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Test;Data Source=yang"
  127.   mConn.CursorLocation = adUseClient '设置为客户端
  128.   mConn.Open
  129.   End Sub
  130.   '关闭数据连接
  131.   Private Sub Form_Unload(Cancel As Integer)
  132.   mConn.Close
  133.   Set mConn = Nothing
  134.   End Sub
复制代码


qq.jpg
 楼主| 发表于 2017-2-26 17:29:05 | 显示全部楼层
  1. 此页涉及到的存储过程的创建,在存储过程的创建中有源码

  2. 1、调用无参数存储过程

  3.         dim conn As New SqlConnection

  4.         dim FBasicDataRecord as new BasicDataRecord()

  5.         conn.ConnectionString = "Data Source=(local);Initial Catalog=LineManager;User ID=sa;Password=1"
  6.         conn.Open()

  7.         Dim cmd As SqlCommand
  8.         cmd = New SqlCommand("GetNewestData", conn)              -------要调用存储过程名称
  9.         cmd.CommandType = CommandType.StoredProcedure                         -----------关键,要想调用存储过程,需将

  10.                                                                                                                       commandtype类型设置为storedprocedure
  11.         Dim myReader As SqlDataReader
  12.         Try

  13.             myReader = cmd.ExecuteReader()       -------------执行存储过程
  14.             If myReader.Read() Then

  15.                 FBasicDataRecord.mySetDateTime = myReader.GetDateTime(0)
  16.                 FBasicDataRecord.myHalfHourCost = myReader.GetDecimal(1)
  17.                 FBasicDataRecord.myUnitTime = myReader.GetInt32(2)
  18.                 FBasicDataRecord.myPrepareTime = myReader.GetInt32(3)
  19.                 FBasicDataRecord.myLeastCurrency = myReader.GetDecimal(4)
  20.                 FBasicDataRecord.myUserName = myReader.GetString(5)
  21.                 Return True
  22.             Else
  23.                 Return False
  24.             End If
  25.         Catch ex As Exception
  26.             Return ex.Message

  27.         Finally
  28.             conn.close()

  29.         End Try

  30. 2、调用有参数存储过程

  31.         Dim cmd As SqlCommand

  32.         dim conn As New SqlConnection

  33.         conn.ConnectionString = "Data Source=(local);Initial Catalog=LineManager;User ID=sa;Password=1"
  34.         conn.Open()


  35.         cmd = New SqlCommand("ProcCharge", conn)          --------存储过程名称
  36.         cmd.CommandType = CommandType.StoredProcedure         ----------改变类型
  37.         Dim a As New SqlParameter("@CardNo", SqlDbType.VarChar)     ------------将存储过程中涉及的参数加入进来,并附

  38.                                                                                                                 值。就像给函数的各个参数赋值一样
  39.         a.Value = myCharge.myCardNo
  40.         cmd.Parameters.Add(a)
  41.         Dim b As New SqlParameter("@ChargeDateTime", SqlDbType.DateTime)
  42.         b.Value = myCharge.myChargeDateTime
  43.         cmd.Parameters.Add(b)
  44.         Dim c As New SqlParameter("@Charge", SqlDbType.Int)
  45.         c.Value = myCharge.myCharge
  46.         cmd.Parameters.Add(c)
  47.         Dim d As New SqlParameter("@UserName", SqlDbType.VarChar)
  48.         d.Value = myCharge.myUserName
  49.         cmd.Parameters.Add(d)
  50.         Dim e As New SqlParameter("@LastBalance", SqlDbType.Float)
  51.         e.Value = myCharge.myLeastBalance
  52.         cmd.Parameters.Add(e)
  53.         Dim f As New SqlParameter("@CurrentBalance", SqlDbType.Decimal)
  54.         f.Value = myCharge.myCurrentBalance
  55.         cmd.Parameters.Add(f)                                 ----------------参数块

  56.         Try
  57.             Return cmd.ExecuteNonQuery() > 0                         ------------------执行存储过程。当存储过程涉及到的是插入删除或

  58.                                                                        更新操作时,用executenonquery(),而如果是查询,则用executereader()
  59.         Catch ex As Exception
  60.             MsgBox(ex.Message)
  61.             Return False
  62.         Finally
  63.             conn.Close()
  64.         End Try

  65. 3、调用有返回值的存储过程

  66.         dim conn As New SqlConnection

  67.         conn.ConnectionString = "Data Source=(local);Initial Catalog=LineManager;User ID=sa;Password=1"
  68.         conn.Open()

  69.         Dim cmd As SqlCommand
  70.         cmd = New SqlCommand("procBalanceUserName", myConn.myConn)         ---------存储过程名称
  71.         cmd.CommandType = CommandType.StoredProcedure                         ----------改变类型
  72.         cmd.Parameters.Add(New SqlParameter("@CardNo", SqlDbType.VarChar))     -------添加参数,此为输入参数

  73.         cmd.Parameters("@CardNo").Value = CardNo
  74.         cmd.Parameters.Add(New SqlParameter("@MachineNo", SqlDbType.VarChar))
  75.         cmd.Parameters("@MachineNo").Value = MachineNo
  76.         cmd.Parameters.Add(New SqlParameter("@Balance", SqlDbType.Float, 20))          ---------定义输出参数
  77.         cmd.Parameters("@Balance").Direction = ParameterDirection.Output            -------输出参数用此标识
  78.         '输出参数必须有指定长度,否则不会成功。
  79.         cmd.Parameters.Add(New SqlParameter("@UserName", SqlDbType.VarChar, 10))        -------输出参数必须是名字,类

  80.                                                                                                                                    型,长度。不可省略。否则,会出错误。
  81.         cmd.Parameters("@UserName").Direction = ParameterDirection.Output
  82.         Try
  83.             cmd.ExecuteReader()                                          ---------------执行存储过程
  84.             myBalance = cmd.Parameters("@Balance").Value.ToString()          ----------将存储过程的返回值赋给定义的变量
  85.             myUserName = cmd.Parameters("@UserName").Value.ToString()

  86.         Catch ex As Exception
  87.             MsgBox(ex.Message)
  88.         Finally
  89.             Conn.Close()
  90.         End Try

  91. 总结一下,调用存储过程,首先,实例化sqlcommand,然后修改commandtype类型,如果参数,则给参数赋值或定义输出参数。然后执行。
复制代码

实例教程2

 楼主| 发表于 2017-2-26 17:30:36 | 显示全部楼层
实例教程3


  1. 首先,在SqlServer中创建存储过程,在调用时分为有参数和没有参数两种情况,
  2.   先就简单的没有参数的情况简要的介绍:


  3.   假设存储过程如下:   CREATE PROC SelectAll



  4.       AS

  5.   SELECT * FROM StudentInf


  6.   则此sp的调用如下:

  7. SqlCommand selectCMD = new SqlCommand(“SelectAll”, conn);

  8.   //conn 为SqlConnection

  9.   selectCMD.CommandType = CommandType.StoredProcedure;


  10.   如果需要将结果集加到某个DataAdapter上,则可如下:

  11. SqlDataAdapter stuDA = new SqlDataAdapter();

  12.   stuDa.SelectCommand = selectCMD;

  13.   如果有参数:create proc andSelect

  14. @StudentId varchar(10),

  15.   @StudentName varchar(10),

  16.   As

  17.   Select * from StudentInf where StudentId = @StudentId and StudentName = @StudentName


  18.   则参数可以如下添加:

  19.  selectCMD.Parameters.Add(“@StudentId”, SqlDbType.NVarChar, 10);

  20.   selectCMD.Parameters.Add(“@StudentName”, SqlDbType.NvarChar, 10);


  21.   如果只有一个参数,也可以这样赋值:

  22.  SqlParameters onePara = selectCMD.Parameters.Add(“@StudentId”,                                         SqlDbType.NVarChar, 10);


  23.   onePara.Value = “ a string ”
复制代码


1

主题

541

回帖

591

积分

软件网站元老会员

积分
591
发表于 2017-2-27 00:49:24 | 显示全部楼层
精湛!没到一分钟就把我这问题解决了!我自己研究了大半天都没弄懂!不错!

0

主题

841

回帖

1018

积分

软件网站中级元老会员

积分
1018
发表于 2017-2-28 17:51:09 | 显示全部楼层
,服务热情,完美解决了问题,非常感谢~

0

主题

539

回帖

576

积分

软件网站元老会员

积分
576
发表于 2017-3-1 10:40:46 | 显示全部楼层
,很有耐心讲解

0

主题

541

回帖

593

积分

软件网站元老会员

积分
593
发表于 2017-3-1 10:43:13 | 显示全部楼层
谢卖家,以后朋友需要会介绍来亲店里的!赞!

0

主题

526

回帖

603

积分

软件网站元老会员

积分
603
发表于 2017-3-2 20:31:47 | 显示全部楼层
了,和卖家描述的一样,操作简单,很实用很方便,店家的服务热情、周到、细心很满意的一次网购

0

主题

829

回帖

1034

积分

软件网站中级元老会员

积分
1034
发表于 2017-3-3 03:16:28 | 显示全部楼层
错满意吧下次需要还会来

0

主题

165

回帖

176

积分

软件网站会员账号

积分
176
发表于 2017-3-3 03:39:06 | 显示全部楼层
位,修改的速度很快。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-11 01:51

安卓脚本软件 · 键鼠盒子 · HID · 机械臂

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

随机推荐 · 热帖 / 新帖 / 随便看看

社区会员(随机展示)