2012-10-22 2 views
3

안녕하세요, Visual Studio 2010에서 작동하는 vb.net에서이 첫 번째 프로젝트는 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

데이터베이스가 아닌 _ 연결 _을 열고 있습니다. 그렇습니다.이 작업을 수행해야합니다. 'DataSet'과'DataAdepter'는 당신이하는 일에 달려 있습니다. – Oded

답변

5

그냥 다음 SqlDataReader 개체를 체크 아웃 데이터를 읽는 경우

Dim reader As SqlDataReader 
reader = cmd.ExecuteReader() 
While reader.Read 
    //Do stuff with reader 
End While 

이 업데이트 나 당신이하는 SqlCommand 클래스의 ExecuteNonQuery는() 메서드를 사용하여 삽입을 수행하는 경우.

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

당신이 유용하게 사용할 수 :

하는 SqlCommand는 추가 매개 변수에 대한 속기 있습니다.

그리고 네가 데이터베이스와 상호 작용해야 할 때마다 데이터베이스 연결을 열고 닫아야합니다. Using 문을 읽으십시오. 이렇게하면 멋지고 깔끔하게 처리 할 수 ​​있습니다.

+0

이 답변을 보완하기 위해 SqlDataAdapter도 좋습니다. 그러나 더 복잡한. 하나의 객체 만 선택, 업데이트 또는 삽입 할 수 있습니다. 필요한 매개 변수와 관련된 명령을 구성하고 데이터베이스의 dataField에 매핑하면됩니다. – Minus

1

각 통화마다 별도의 데이터베이스 연결이 필요하지 않으므로 한 번 열어서 사용하는 각 방법으로 보내고 닫을 수 있습니다.

그러나 연결 및 명령을 닫거나 처리하는 것이 중요합니다. 그렇지 않으면 연결 자체가 데이터베이스를 죽일 때까지 잠시 동안 열린 상태로 유지됩니다. 걸려있는 연결을 충분히두면 자원이 부족합니다.

SqlDataAdapterDataSet은 저장 프로 시저가 결과를 반환하고 그 결과가 DataSet 개체 인 경우에만 필요합니다. SqlCommand.ExecuteNoQuery 메서드를 사용하여 결과를 반환하지 않는 저장 프로 시저를 실행할 수 있습니다. SqlDataReader의 결과를 가져와 DataSet을 사용하지 않으려는 경우 그 데이터를 읽을 수도 있습니다.

참고 : 각 매개 변수에 대해 SqlParameter을 하나 만들어야합니다. 이제 하나의 매개 변수를 만들고 그 매개 변수를 반복해서 변경하므로 매개 변수 컬렉션은 결국 동일한 매개 변수에 대한 10 개의 참조를 갖게됩니다.

+0

그런 다음 매개 변수를 추가하고 완료 한 후 cmd.ExecuteNonQuery()를 추가해야합니다. 단지 값을 삽입하는 프로 시저입니다. 또한 각 매개 변수에 대해 하나의 SqlParameter를 만들고 코드의 sqlAdapter 및 dataset 부분을 삭제합니다. – Diego

+0

@Diego : 맞습니다. – Guffa

관련 문제