Вызов хранимой процедуры


В следующем примере используется хранимая процедура с именем getalbumname. Процедура вызывается с одним параметром и выбирает из базы данных albums запись альбома с заданным именем:
create procedure getalbumbyname
@albumname varchar(255) As
select *from albums where albumname = @albumname

Выборка данных с использованием хранимой процедуры организована аналогично простому запросу к базе данных Northwind:
Dim dbCmd As SqlCommand = New SqlCommand(

"execute getalbumbyname 'Operation Mindcrime'")

Try
mySQLConn =New SqlConnection(
"user id=sa:password=password;" & _

"database=albums;server=i-ri3")
mySQLConn.Open()
dbCmd.Connection = mySQLConn


dbReader = dbCmd.ExecuteReader(CommandBehavior.SingleResult)


' И т.д.

End Try
Как видите, программа почти не изменилась, разве что команда SQL, использовавшаяся для создания объекта Sql Command, превратилась в команду вызова хранимой процедуры getalbumbyname, которой в качестве параметра передается имя интересующего нас альбома. Конечно, после вызова ExecuteReader цикл перебора записей не нужен, поскольку мы точно знаем, что хранимая процедура возвращает всего одну запись.

Вместо того чтобы передавать параметр хранимой процедуры в строке вызова, можно воспользоваться коллекцией Parameters объекта SQLCommand. Мы решили, что вариант с непосредственной передачей параметров в команде SQL проще. Конечно, это возможно лишь в том случае, если значение параметра известно во время написания программы, в противном случае приходится использовать коллекцию Parameters.

 

Нетривиальный пример работы с базами данных в VB .NET (часть 1)


В этом разделе представлено графическое приложение, при помощи которого пользователь может подключиться к выбранной базе данных SQL, выполнить запрос и получить его результаты в виде списка. Простоты ради мы отказались от проверки пользовательского ввода. Программа состоит из трех файлов: двух форм (frmMain и frmResults, см. рис. 11.2 и 11.3 соответственно) и стандартного модуля Modulel.
Несмотря на свою длину, программа не содержит ничего принципиально нового. На главной форме размещены четыре текстовых гюля для ввода имени сервера, имени базы данных, идентификатора пользователя и пароля. При нажатии кнопки Connect программа динамически выполняет введенную команду во фрагменте, выделенном жирным шрифтом.

Рис. 11.2. Главная форма приложения

Рис. 11.3. Форма результатов приложения

'frmMain.vb

Imports System.Data.SqlClient

Public Class frmMain

Inherits System.Windows.Forms.Form #Region "Windows Form Designer generated code "

Public Sub New()

MyBase.New()

'Вызов необходим для работы дизайнера форм Windows

InitializeComponent()

' Дальнейшая инициализация выполняется

' после вызова InitializeComponent()

End Sub

' Форма переопределяет Dispose для очистки списка компонентов.

Protected Overloads Overrides

Sub Dispose(ByVal disposing As Boolean)

If Disposing Then

If Not (components Is Nothing) Then

components. Dispose()

End If

End If

MyBase.Dispose(Disposing) End Sub

Private WithEvents Label1 As System.Windows.Forms.Label

Private WithEvents Label2 As System.Windows.Forms.Label

Private WithEvents Label3 As System.Windows.Forms.Label

Private WithEvents Label4 As System.Windows.Forms.Label

Private WithEvents btnConnect As System.Windows.Forms.Button

Private WithEvents txtUID As System.Windows.Forms.TextBox

Private WithEvents txtPassword As System.Windows.Forms.TextBox

Private WithEvents txtDatabase As System.Windows.Forms.TextBox

Private WithEvents txtServer As System.Windows.Forms.TextBox

' Необходимо для работы дизайнера форм Windows

Private components As System.ComponentModel.Container

' ВНИМАНИЕ: следующий фрагмент необходим для дизайнера форм Windows

' Для его модификации следует использовать дизайнер форм.

' Не изменяйте его в редакторе!

<System.Diagnostics.DebuggerStepThrough()>

Private Sub _ Initial izeComponent()

Me.Label4 = New System.Windows.Forms.Label ()

Me.txtPassword = New System.Windows.Forms.TextBox()

Me.Label 1 = New System.Windows.Forms.Label ()

Me.txtServer = New System.Windows.Forms.TextBox()

Me.Label2 = New System.Windows.Forms.Label ()

Me.Labels = New System.Windows.Forms.Label ()

Me.txtUID - New System.Windows.Forms.TextBox()

Me.txtDatabase = New System.Windows.Forms.TextBox()

Me.btnConnect = New System.Windows.forms.Button()

Me.SuspendLayout()

'Label4

Me.Label4.Location = New System.Drawing.Point(24.176)

Me.Label 4.Name = "Label4"

Me.Label4.Size = New System.Drawing.Size(82.19)

Me.Label4.TabIndex = 0

Me.Label4.Text = "Password:"

Me.Label4.TextAlign = System.Drawi ng.ContentAlignment.MiddleRight

'txtPassword

Me.txtPassword.Location = New System.Drawing.Point(168.168)

Me ..txtPassword. Name = "txtPassword"

Me.txtPassword.PasswordChar = ChrW(42)

Me.txtPassword.Size = New System.Drawing.Size(205.22)

Me.txtPassword.Tablndex = 3

Me.txtPassword.Text = ""

'Label 1

Me.Label 1.Location = New System.Drawing.Point(24. 32)

Me.Label 1.Name = "Label1"

Me.Label 1.Size = New System.Drawing.SizeC82. 20)

Me.Label 1.Tablndex =0

Me.Label 1.Text = "Server:"

Me.Label 1.TextAli gn = System.Drawi ng.ContentAlignment.Mi ddleRight

'txtServer

Me.txtServer.Location - New System.Drawing.Point(168, 24}

Me.txtServer.Name = "txtServer"

Me.txtServer.Size = New System.Drawing.Size(205. 22)

Me.txtServer.Tablndex = 0

Me.txtServer.Text = ""

'Label 2

Me.Label2.Location = New System.Drawing.Point(24. 80)

Me.Label 2.Name = "Label 2"

Me.Label2.Size = New System.Drawing.Size(82, 20)

Me.Label2.Tablndex = 0

Me.Label 2.Text = "Database:"

Me.Label 2.TextAlign = System.Drawi ng.ContentAlignment.Mi ddleRight

'Label3

Me. Labels.Anchor = System.Windows.Forms.AnchorStyles.None

Me.Label3.Location = New System.Drawing.Point(24. 128)

Me.Labels.Name = "Label 3"

Me.Labels.Size = New System.Drawing.Size(82. 20)

Me.Labels.Tablndex = 0

Me.Labels.Text = "User ID:"

Me.Label 3.TextAli gn = System.Drawi ng.ContentAlignment.Mi ddleRi ght

'txtUID

Me.txtUID.Location = New System.Drawing.Point(168, 120)

Me.txtUID.Name = "txtUID"

Me.txtUID.Size - New System.Drawing.Size(205, 22)

Me.txtUID.Tablndex = 2

Me.txtUID.Text = ""

'txtDatabase

Me.txtDatabase.Location = New System.Drawing.Point(168. 72)

Me.txtDatabase.Name = "txtDatabase"

Me.txtDatabase.Size = New System.Drawing.Size(205. 22)

Me.txtDatabase.Tablndex = 1

Me.txtDatabase.Text = ""

'btnConnect

Me.btnConnect.Location = New System.Drawing.Point(160. 232)

Me.btnConnect.Name = "btnConnect"

Me.btnConnect.Size = New System.Drawing.Size(92, 30)

Me.btnConnect.Tablndex = 4

Me. btnConnect.Text = "SConnect"

'frmMain

Me.AutoScaleBaseSize = New System.Drawing.Size(6. 15)

Me.ClientSize - New System.Drawing.Size(408, 280)

Me.Controls.AddRange(New _

System.Wi ndows.Forms.Control(){Me.btnConnect,_

Me.txtPassword. Me.txtUID. Me.txtDatabase.

Me.txtServer.Me

.Label 4.

Me.Label3.Me

.Label 2.

Me.Label 1})

Me.Name - "frmMain" Me.Text = "DB Connector"

Me.ResumeLayout(False) End Sub

#End Region

Private Sub btnConnect_C1ick(ByVal sender As System.Object,_

ByVal e As System.EventArgs) Handles btnConnect.Click

Try

mySQLConn = New SqlConnectionC'user id=" & txtUID.Text &

";password="&txtPassword.Text & _ ";database="&txtDatabase.Text & _

";server="&txtServer.Text)

mySQLConn.Open() dbCmd.Connect!on = mySQLConn

Dim frmChild As New frmResults() frmChild.Show()

Catch except As Exception MsgBox(_

"Failed to connect for the following reason:<" & _ except.Message & ">")

End Try

End Sub

End Class

Модуль содержит следующий код:

Imports System.Data.SqlClient Module main

' Глобальные определения

Public mySQLConn As SqlConnection

Public dbReader As SqlDataReader

Public dbCmd As SqlCommand = New SqlCommand()

End Module

Модуль Modulel содержит только глобальные определения различных объектов SQL, которые должны быть доступны для обеих форм. Хотя обычно подобное использование глобальных данных в окончательных версиях программ не рекомендуется, в данном случае это позволяет сосредоточить основное внимание на выполнении операций с базой данных.