Отправка параметров в хранимые процедуры vb.net

Привет, это мой первый проект в vb.net, работающий с MS Visual Studio 2010, я хочу создать класс, который может отправлять параметры хранимым процедурам в базе данных Transact-SQL, я знаю, как это сделать в vb 6, но я не конечно, если это правильный способ сделать это здесь.

Imports System.Data.SqlClient

Public Class ClsLineas

Public Sub Inserta(ByVal GridLineas As DataGrid, _
                   ByVal numero As String, _
                   ByVal tipo As String, _
                   ByVal estado As String, _
                   ByVal anexo As Integer, _
                   ByVal fechaInicio As String, _
                   ByVal fechaFin As String, _
                   ByVal pcReg As String, _
                   ByVal observaciones As String, _
                   ByVal usuReg As String)

    Dim cnx As SqlConnection = New SqlConnection(ClsCon.connectionString)
    'ClsCon.connectionString is a class that contains the connection string 
    Dim cmd As SqlCommand = New SqlCommand()

    If cnx.State = ConnectionState.Closed Then cnx.Open()

    cmd.Connection = cnx
    cmd.CommandText = "SP_INSERTA_LINEA"
    cmd.CommandType = CommandType.StoredProcedure

    Dim prm As New SqlParameter

    prm.ParameterName = "@TIPO"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 30
    prm.Direction = ParameterDirection.Input
    prm.Value = tipo
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@FECHA_INICIO"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 30
    prm.Direction = ParameterDirection.Input
    prm.Value = fechaInicio
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@FECHA_FIN"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 30
    prm.Direction = ParameterDirection.Input
    prm.Value = fechaFin
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@ESTADO"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 30
    prm.Direction = ParameterDirection.Input
    prm.Value = estado
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@NUMERO"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 15
    prm.Direction = ParameterDirection.Input
    prm.Value = numero
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@ANEXO"
    prm.SqlDbType = SqlDbType.Int
    prm.Direction = ParameterDirection.Input
    prm.Value = anexo
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@PC_REG"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 50
    prm.Direction = ParameterDirection.Input
    prm.Value = pcReg
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@USU_REG"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 50
    prm.Direction = ParameterDirection.Input
    prm.Value = usuReg
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@OBSERVACIONES"
    prm.SqlDbType = SqlDbType.NVarChar
    prm.Size = 1000
    prm.Direction = ParameterDirection.Input
    prm.Value = observaciones
    cmd.Parameters.Add(prm)

    prm.ParameterName = "@ID"
    prm.SqlDbType = SqlDbType.Int
    prm.Direction = ParameterDirection.Output
    cmd.Parameters.Add(prm)

    Dim adp As SqlDataAdapter = New SqlDataAdapter(cmd)

    Dim DataSet As DataSet = New DataSet("Lineas")

    adp.Fill(DataSet)
    GridLineas.DataSource = DataSet.Tables(0)

End Sub
End class

Некоторые из моих сомнений:

Мне действительно нужно открывать базу данных каждый раз, когда я вызываю методы своего класса?

Действительно ли нужны sqlAdapter и набор данных? В vb 6 вы могли сделать что-то вроде «команда выполнить вставку» после добавления параметров, и все готово.


person Diego    schedule 22.10.2012    source источник
comment
Вы открываете соединение, а не базу данных, и да, это необходимо сделать. Что касается DataSet и DataAdepter - зависит от того, что вы делаете.   -  person Oded    schedule 22.10.2012


Ответы (2)


Если вы просто читаете данные, проверьте SqlDataReader:

Dim reader As SqlDataReader
reader = cmd.ExecuteReader()
While reader.Read
    //Do stuff with reader
End While

Если вы выполняете обновление или вставку, вы можете использовать метод ExecuteNonQuery() класса SqlCommand.

В SqlCommand есть сокращение для добавления параметров:

cmd.Parameters.AddWithValue("@MyParamName", myParamValue)

Что может оказаться полезным.

И да, вы должны открывать и закрывать соединение с базой данных каждый раз, когда вам нужно взаимодействовать с базой данных. Прочтите оператор Using, который поможет вам сделать это красиво и аккуратно.

person AGB    schedule 22.10.2012
comment
Просто для дополнения этого ответа также отлично подходит SqlDataAdapter. Но более сложный. Вы можете выбрать, обновить или вставить только один объект. Просто настройте команду, связанную с нужным параметром, и сопоставьте их с полем данных из базы данных. - person Minus; 22.10.2012

Вам не нужно отдельное подключение к базе данных для каждого вызова, вы можете открыть его один раз и отправить в каждый метод, который его использует, а затем закрыть его.

Однако важно, чтобы вы закрывали или удаляли соединения и команды, которые вы используете. Если вы этого не сделаете, соединение будет оставаться открытым некоторое время, пока сама база данных не уничтожит его. Если вы оставите достаточно подключений зависшими, у вас закончатся ресурсы.

SqlDataAdapter и DataSet необходимы только в том случае, если хранимая процедура возвращает результат, и только если вы хотите, чтобы этот результат был объектом DataSet. Вы можете использовать метод SqlCommand.ExecuteNoQuery для запуска хранимой процедуры, которая не возвращает никакого результата. Вы также можете получить результат в SqlDataReader и прочитать данные из него, если не хотите использовать DataSet.

Примечание. Вы должны создать один SqlParameter для каждого параметра. Теперь вы создаете один параметр и изменяете его снова и снова, поэтому в коллекции параметров будет десять ссылок на один и тот же параметр.

person Guffa    schedule 22.10.2012
comment
Тогда я должен просто добавить cmd.ExecuteNonQuery() после добавления параметров, и я готов, это процедура, которая просто вставляет значения. Также будет создан один SqlParameter для каждого параметра и отброшены части кода sqlAdapter и набора данных. - person Diego; 22.10.2012