3

こんにちは、この 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 と Dataset は本当に必要ですか? vb 6では、パラメーターを追加した後に「command execute inserta」のようなことを行うことができます。

4

2 に答える 2

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ステートメントを読んでください。これは、これをうまくきちんと行うのに役立ちます。

于 2012-10-22T14:59:52.893 に答える
1

呼び出しごとに個別のデータベース接続は必要ありません。一度開いて、それを使用する各メソッドに送信してから閉じることができます。

ただし、使用する接続とコマンドを閉じるか破棄することが重要です。そうしないと、データベース自体が切断するまで、接続はしばらく開いたままになります。十分な数の接続をハングしたままにすると、リソースが不足します。

ASqlDataAdapterと aは、ストアド プロシージャが結果を返し、その結果をオブジェクトDataSetで返したい場合にのみ必要です。DataSetメソッドを使用してSqlCommand.ExecuteNoQuery、結果を返さないストアド プロシージャを実行できます。SqlDataReaderを使用したくない場合は、 で結果を取得し、そこからデータを読み取ることもできますDataSet

注:SqlParameterパラメータごとに 1 つ作成する必要があります。ここで、1 つのパラメーターを作成し、それを何度も変更するため、パラメーター コレクションには同じパラメーターへの 10 個の参照が含まれることになります。

于 2012-10-22T15:05:30.737 に答える