Проблема с вызовом хранимой процедуры из VB.NET

#asp.net #database #vb.net #visual-studio

#asp.net #База данных #vb.net #visual-studio

Вопрос:

Я довольно новичок в VB, и я не уверен, почему это не работает, в основном я пытаюсь запустить хранимую процедуру из моего веб-кода. sp отлично работает в SQL, я пробовал это несколько раз, поэтому я уверен, что проблема не в этом. Я не хочу возвращать никаких результатов, я просто хочу увидеть инструкцию «ok», если она выполняется, и сообщение об ошибке, если этого не происходит. Код, который я использую для ярлыков (предупреждения и подтверждения), повторно используется ранее на той же странице, то же самое касается проверок (valuepload). Я уверен, что решение простое…

 Protected Sub RunValidation_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RunValidation.Click
    Try
        Dim bl As New BL.ORG
        Dim db As Database = DatabaseFactory.CreateDatabase("MyConnection")
        Dim dbCommand As DbCommand

        db = DatabaseFactory.CreateDatabase("MyConnection")
        dbCommand = db.GetStoredProcCommand("Company.dbo.uspMyStoredProcedure")
        dbCommand.CommandTimeout = 300
        db.AddInParameter(dbCommand, "ClientID", DbType.String, ddlCompany.SelectedValue)
        db.AddInParameter(dbCommand, "startPeriod", DbType.String, ddlStartPeriod.SelectedValue)
        db.ExecuteDataSet(dbCommand)

        lblWarning.Text = "Please confirm that the <strong>ClientID and startPeriod </strong> are populated in the dropdown list."
        lblWarning.Visible = True
        lblConfirmation.Visible = False

    Catch ex As Exception
        valUpload.ErrorMessage = "There has been an unexpected error generating the page<br>("   Err.Description   ")"
        valUpload.IsValid = False
    End Try
End Sub
  

Комментарии:

1. Решение будет еще проще, если вы скажете нам, в каком смысле это не работает. Вы получаете сообщения об ошибках? Какой номер строки? О чем говорится в ошибке? Что такое трассировка стека? Правильна ли ваша строка подключения?

2. Разве вы не должны использовать SqlCommand вместо DbCommand?

3. Надеюсь, это ответит на некоторые вопросы: 1, насколько я могу видеть, хранимая процедура не запускается. Никакие результаты не попадают в мои таблицы, даже когда должны (когда я позже запускаю sp в SQL, он заполняется нормально) 2, Сообщений об ошибках вообще нет, кажется, что все работает нормально, и именно поэтому это так расстраивает меня, я действительно не знаю, с чего начать, когда я даже не получаю сообщение об ошибке. Я могу загрузить страницы, и все это работает нормально, или, по крайней мере, кажется, что работает просто отлично. Любая другая информация, которую я пропустил?

4. Вы проверили, все ли параметры установлены правильно? Полагается ли ваша процедура на них в выполнении того, что она должна?

Ответ №1:

Я думаю, что проблема здесь в строке

 db.ExecuteDataSet(dbCommand)
  

Из того, что я вижу, команда, которую вы хотите запустить, это

 db.ExecuteNonQuery(dbCommand)
  

Вот пример сайта. Код написан на C #, но я думаю, вы сможете получить базовое представление о нем. Вы также могли бы использовать переводчик для нее, если вам действительно нужно.

http://msdn.microsoft.com/en-us/magazine/cc188702.aspx#S2

Ответ №2:

Я бы переписал ее на что-то похожее на это:

 Protected Sub RunValidation_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RunValidation.Click
  Using cnn As New SqlClient.SqlConnection("MyConnection")
    cnn.Open()

    Using cmd As New SqlClient.SqlCommand("Company.dbo.uspMyStoredProcedure", cnn)
      cmd.CommandTimeout = 30
      cmd.Parameters.Add(New SqlClient.SqlParameter("ClientID", SqlDbType.NVarChar, 50) With {.Value = ddlCompany.SelectedValue})
      cmd.Parameters.Add(New SqlClient.SqlParameter("startPeriod", SqlDbType.NVarChar, 50) With {.Value = ddlStartPeriod.SelectedValue})

      Try
        cmd.ExecuteNonQuery()
      Catch ex As Exception
        valUpload.ErrorMessage = "There has been an unexpected error generating the page<br>("   Err.Description   ")"
        valUpload.IsValid = False
      End Try

      lblWarning.Text = "Please confirm that the <strong>ClientID and startPeriod </strong> are populated in the dropdown list."
      lblWarning.Visible = True
      lblConfirmation.Visible = False

    End Using
  End Using
End Sub
  

Несколько замечаний:

  • Оберните как можно меньше кода в try-catch. В этом случае только база данных должна вызывать беспокойство (при условии, что вы проверили входные данные).
  • Оператор using очень аккуратно удаляет ваши объекты connection и command в случае возникновения проблем.
  • Вероятно, вы захотите провести дальнейший рефакторинг кода, сохранив раздел вызова базы данных в отдельной функции / подразделе и установив метки и сообщения пользовательского интерфейса где-нибудь в другом месте.