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