Вызов хранимой процедуры и получение результатов обратно - PullRequest
0 голосов
/ 04 января 2012

Эй, все это первый раз, когда я вызываю хранимую процедуру через vb.net, и я хотел бы убедиться, что у меня все правильно, прежде чем я ее выполню.

Это мой код:

Dim connectionString As String = GetConnectionString()
Dim intCount As Integer = 0

Using connection As New SqlConnection(connectionString)
   Dim command As SqlCommand = connection.CreateCommand()

   Try
      connection.Open()
      command.CommandType = CommandType.StoredProcedure
      command.CommandText = "Complete_S_H"
      command.Parameters.Add("@J_ID", SqlDbType.Int)
      command.Parameters.Add("@O_Nbr", SqlDbType.VarChar)
      command.Parameters.Add("@R_Nbr", SqlDbType.VarChar)
      command.Parameters("@theOutput").Direction = ParameterDirection.Output

      Dim dataReader As SqlDataReader = command.ExecuteReader()
      Do While dataReader.Read()
         ListView1.Items.Add(Trim(dataReader(0)))
         ListView1.Items(CInt(intCount)).SubItems.Add(Trim(dataReader(1)))
         ListView1.Items(CInt(intCount)).SubItems.Add(Trim(dataReader(2)))
         ListView1.Items(CInt(intCount)).SubItems.Add(Trim(dataReader(3)))
         ListView1.Items(CInt(intCount)).SubItems.Add(Trim(dataReader(4)))
         ListView1.Items(CInt(intCount)).SubItems.Add(Trim(dataReader(5)))
         intCount = intCount + 1
      Loop

      dataReader.Close()
      connection.Close()
   Catch ex As Exception
      Console.WriteLine(ex.Message)
   End Try
End Using

Хранимая процедура возвращает данные на 6 столбцов, и я хотел бы добавить эти данные в просмотр списка.Я не уверен, что у меня есть правильный синтаксис для этого, но это то, что я использовал в моем предыдущем коде sql (выполнение запроса, а не хранимой процедуры).

Кроме того, я не уверен, как получить данные для названий @xxx выше из текстового поля?Как передать значения в имена @xxx из текстового поля пользователя?

Код студии управления MS SQL для хранимой процедуры:

 EXEC [dbo].[Complete_S_H]
@J_ID = 208660,
@O_Nbr = NULL,
@R_Nbr = NULL

Две из переданных переменных могут быть NULL.Нужно заполнить только один, чтобы он мог вернуть данные.

Любая помощь будет отличной!

Дэвид

1 Ответ

3 голосов
/ 04 января 2012

Вы довольно близко.

Пара заметок:

  1. Вы можете получить локальную ссылку на добавленный элемент списка, что ускоряет и очищает код

  2. Если вы не знаете, что значения БД никогда не будут нулевыми, вы должны всегда проверять их на DbNull перед их использованием.

  3. Чтобы использовать значения из текстового поля, вы можете использовать Parameters.AddWithValue . Я изменил код, чтобы показать, как.

Альтернативой является установка свойства .Value параметра после его добавления:

command.Parameters.Add("@J_ID", SqlDbType.Int).Value = CInt(TextBox1.Text)

или

command.Parameters("@J_ID").Value = CInt(TextBox1.Text)

Вот переписать с этими идеями и бонусный цикл для установки подпунктов (не требуется):

    Dim connectionString As String = GetConnectionString()

    Using connection As New SqlConnection(connectionString)
        Dim command As SqlCommand = connection.CreateCommand()

        Try
            connection.Open()
            command.CommandType = CommandType.StoredProcedure
            command.CommandText = "Complete_S_H"
            command.Parameters.AddWithValue("@J_ID", CInt(TextBox1.Text))
            command.Parameters.AddWithValue("@O_Nbr", TextBox2.Text)
            command.Parameters.AddWithValue("@R_Nbr", TextBox3.Text)
            command.Parameters("@theOutput").Direction = ParameterDirection.Output
            'command.ExecuteNonQuery()

            Dim dataReader As SqlDataReader = command.ExecuteReader()
            Do While dataReader.Read()
                Dim oItem As ListViewItem

                oItem = ListView1.Items.Add(Trim(dataReader(0)))

                For nI As Integer = 1 To dataReader.FieldCount - 1
                    If Not dataReader.IsDBNull(nI) Then
                        oItem.SubItems.Add(Trim(dataReader(nI)))
                    Else
                        oItem.SubItems.Add(String.Empty)
                    End If
                Next
            Loop

            dataReader.Close()
            connection.Close()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...