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 中,您可以在附加参数之后执行“命令执行 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 。您可以使用该方法运行不返回任何结果的存储过程。如果您不想使用 a ,也可以在 a 中获得结果并从中读取数据。DataSetDataSetSqlCommand.ExecuteNoQuerySqlDataReaderDataSet

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

于 2012-10-22T15:05:30.737 回答