2012-10-22 60 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 

如果你正在做的更新或插入,那么你可以使用SqlCommand类的ExecuteNonQuery()方法。

的SqlCommand有添加参数的简写:

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

这可能对你有用。

是的,您应该在每次需要与数据库交互时打开和关闭数据库连接。阅读Using语句,这将有助于您做到这一点很好,很整齐。

+0

只是为了补充这个答案,一个SqlDataAdapter也很棒。但更复杂。您可以选择,更新或插入只有一个主题。只需配置与所需参数关联的命令并将它们映射到数据库中的dataField。 – Minus

1

对于每个调用,您不需要单独的数据库连接,只需打开一次并将其发送到每个使用它的方法,然后关闭它。

但是,关闭或处理您使用的连接和命令非常重要。如果你不这样做,连接将保持打开状态一段时间,直到数据库自己杀死它为止。如果你留下足够的连接,你将会耗尽资源。

A SqlDataAdapterDataSet只有在存储过程返回结果时才需要,并且仅当您希望得到DataSet对象中的结果时才需要。您可以使用SqlCommand.ExecuteNoQuery方法来运行不返回任何结果的存储过程。如果您不想使用DataSet,您也可以在SqlDataReader中得到结果并从中读取数据。

注意:您必须为每个参数创建一个SqlParameter。现在您创建一个参数并反复更改,因此参数集合最终将拥有十个对同一参数的引用。

+0

然后,我应该在追加参数和完成后添加cmd.ExecuteNonQuery(),它是一个插入值的过程。还将为每个参数创建一个SqlParameter并放弃代码的sqlAdapter和数据集部分。 – Diego

+0

@Diego:是的,确切的。 – Guffa