你好这是我在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吗?在第6版中,您可以在附加参数后执行类似“命令执行插入”的操作,并完成操作。
答案 0 :(得分: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)
您可能觉得有用。
是的,每次需要与数据库交互时,都应该打开和关闭数据库连接。阅读使用声明,它将帮助您做得很好,整洁。
答案 1 :(得分:1)
每次调用都不需要单独的数据库连接,可以打开一次并将其发送到使用它的每个方法中,然后关闭它。
然而,关闭或处置您使用的连接和命令非常重要。如果不这样做,连接将保持打开一段时间,直到数据库本身杀死它。如果你留下足够的连接,你将耗尽资源。
只有存储过程返回结果时才需要SqlDataAdapter
和DataSet
,并且仅当您希望将结果存入DataSet
对象时才需要SqlCommand.ExecuteNoQuery
和SqlDataReader
。您可以使用DataSet
方法运行不返回任何结果的存储过程。您还可以在SqlParameter
中获得结果,如果您不想使用{{1}},则可以从中读取数据。
注意:您必须为每个参数创建一个{{1}}。现在您创建一个参数并反复更改,因此参数集合最终将对同一参数进行十次引用。