2012-10-22 2 views
3

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

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 и Dataset? В vb 6 вы можете сделать что-то вроде «command execute inserta» после добавления параметров и вы, где это делается.

+0

Вы открываете _connection_ не базу данных, и да, это должно быть сделано. Что касается 'DataSet' и' DataAdepter' - зависит от того, что вы делаете. – Oded

ответ

5

Если вы только чтение данных, то проверка на 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, которая поможет вам сделать это красиво и аккуратно.

+0

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

1

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

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

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

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

+0

Затем я должен просто добавить cmd.ExecuteNonQuery() после добавления параметров и im done, это процедура, которая просто вставляет значения. Также будет создан один SqlParameter для каждого параметра и отбросить части sqlAdapter и части набора данных кода. – Diego

+0

@ Дьего: Да, точно. – Guffa