VB.NET调用SQL Sever存储过程

概要:

本文介绍VB.NET使用创建并调用带有输入参数和输出参数的sql Sever存储过程

本文代码首先检查要创建的存储过程再数据库中是否存在在。如果不存在,则代码创建一个存储过程,该过程一个参数来搜索用户的密码,并在输出参数中返回匹配的行及行数。

步骤:

1.创建基本的用户界面


2.创建GetUserID存储过程

create Procedure GetUserID (@username varchar(40),@RowCount int output)  
as 
select * from userlogin where adminUser = @username; 
/* @@ROWCOUNT 返回最后一个受影响的行数 */ 
select @RowCount=@@ROWCOUNT

代码包括两个参数:@username和@RowCount。@username是输入参数,用于获取搜索字符串比便在userlogin中执行搜索功能。@RowCount是输出参数,用于使用@@ROWCOUNT变量获取受影响的行。

3.编写窗体代码

3.1添加“声明”部分

Imports System.Data
Imports System.Data.sqlClient

3.2若要确保存储过程并创建存储过程,结合使用sqlCommand对象和sqlDataReader对象。可以使用sqlCommand针对数据库运行任何 sql命令。然后调用sqlCommandExecuteReader方法以返回sqlDataReader,它包含查询的匹配行。

 Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles MyBase.Load

        Dim MyConnection As sqlConnection
        Dim MyCommand As sqlCommand
        Dim MyDataReader As sqlDataReader

        '设置连接语句
        MyConnection = New sqlConnection("Data Source=192.168.24.75;Initial Catalog=P_charge;User ID=sa;Pwd=123456")
        MyCommand = New sqlCommand

        '检查存储过程是否存在
        MyCommand = New sqlCommand("if object_id('pubs..GetUserID') is not null " + "begin" + " if objectproperty(object_id('pubs..GetUserID'),'IsProcedure')= 1" + " select object_id('pubs..GetUserID')" + " else" + " return " + "end" + " else" + " return",MyConnection)
        '设置command命令按钮的属性
        With MyCommand
            .Connection = MyConnection
            .CommandType = CommandType.Text
            .Connection.open()

            '执行sql语句
            MyDataReader = .ExecuteReader()
            '如果不存在那么就创建一个新的存储过程,如果存在就关闭数据库
            If MyDataReader.Read() Then
                .CommandText = "create procedure GetUserID (@username varchar(40)," & "@RowCount int output) " & " as select * from userlogin where adminUser = @username; select @RowCount=@@ROWCOUNT"
                MyDataReader.Close()
                .ExecuteNonQuery()
            Else
                MyDataReader.Close()
            End If
            '关闭数据库
            .dispose()  'dispose of the Command object.
            MyConnection.Close() 'Close the connection.
        End With
    End Sub

3.3按钮的Click事件中调用存储过程,然后使用sqlDataAdapter对象运行存储过程。必须为该存储过程创建参数,并将它附加到sqlDataAdapter对象的Parameters集合中。

 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim DS As DataSet
        Dim MyConnection As sqlConnection
        Dim MyDataAdapter As sqlDataAdapter

        '连接数据库语句
        MyConnection = New sqlConnection("Data Source=192.168.24.75;Initial Catalog=userlogin;User ID=sa;Pwd=123456")

        '创建一个dataapater,然后给出存储过程的名字
        MyDataAdapter = New sqlDataAdapter("GetUserID",MyConnection)

        '设置命令类型是存储过程
        MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure


        '设置存储过程参数
        MyDataAdapter.SelectCommand.Parameters.Add(New sqlParameter("@username",sqlDbType.VarChar,40))
        '指定存储过程过程参数
        MyDataAdapter.SelectCommand.Parameters("@username").Value = Trim(TxtLastName.Text)

        '设置存储过程参数 
        MyDataAdapter.SelectCommand.Parameters.Add(New sqlParameter("@RowCount",sqlDbType.Int,4))
        '设置参数是输出参数
        MyDataAdapter.SelectCommand.Parameters("@RowCount").Direction = ParameterDirection.Output


        '创建一个新的记录集来保存数据
        DS = New DataSet()
        MyDataAdapter.Fill(DS,"userid") '返回的行填充到数据集

        '得到返回行数,赋给lblRowCount
        'lblRowCount.Text = DS.Tables(0).Rows.Count().ToString() & " Rows Found!"
        lblRowCount.Text = MyDataAdapter.SelectCommand.Parameters(1).Value & " Rows Found!"

        '设定DataGrid控件的数据源
        Grdauthors.DataSource = DS.Tables("userid").defaultview

        '关闭dataapater和数据库
        MyDataAdapter.dispose() 'dispose of the DataAdapter.
        MyConnection.Close() 'Close the connection.
    End Sub

4. 运行结果

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...