Вызов
хранимой процедуры
В следующем примере используется
хранимая процедура с именем 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,
которые должны быть доступны для
обеих форм. Хотя обычно подобное
использование глобальных данных в
окончательных версиях программ не
рекомендуется, в данном случае это
позволяет сосредоточить основное
внимание на выполнении операций с
базой данных.
|