1

Я хочу, чтобы получить результат моей хранимой процедуры (с SQL Server 2008) в VB.net 2012VB.net получение SQL Server приводит к

Вот моя хранимая процедура:

CREATE PROCEDURE [dbo].[csp_LoginAuthentication] 
    @employeeid VARCHAR (20), 
    @password VARCHAR (20), 
    @accountstatus INT OUT, 
    @logincount INT OUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     @accountstatus = account_status, 
     @logincount = logincount 
    FROM 
     strato_blueapplesmis.dbo.app_login 
    WHERE 
     1 = 1 
     AND employee_id = @employeeid 
     AND password = @password   
END 

Когда я выполнение моей хранимой процедуры, я получаю результаты, которые я хочу:

enter image description here

Редакция: Вот мой текущий код, благодаря Steve's предложение ниже:

Dim sqlConnct As New classSQLConnection 

    If sqlConnct.MSSQLConn.State = ConnectionState.Open Then sqlConnct.MSSQLConn.Close() 

    With sqlConnct.MSSQLConn 

     .Open() 

     Dim msSQLComm As SqlCommand = New SqlCommand("csp_LoginAuthentication", sqlConnct.MSSQLConn) 
     msSQLComm.CommandType = CommandType.StoredProcedure 

     msSQLComm.Parameters.Add("@employeeid", SqlDbType.VarChar).Value = txtEmployeeID.Text 
     msSQLComm.Parameters.Add("@password", SqlDbType.VarChar).Value = txtPassword.Text 

     Dim accntStat As Integer 
     Dim loginCnt As Integer 

     accntStat = Convert.ToInt32(msSQLComm.Parameters("@accountstatus").Value) 
     loginCnt = Convert.ToInt32(msSQLComm.Parameters("@logincount").Value) 

     msSQLComm.ExecuteNonQuery() 

     MsgBox(accntStat) 

    End With 

И я даже пытался Joel Coehoorn «s предложение:

Dim accntStat As Integer 
    Dim loginCnt As Integer 
    Dim sqlConnct As New classSQLConnection 

    If sqlConnct.MSSQLConn.State = ConnectionState.Open Then sqlConnct.MSSQLConn.Close() 

    With sqlConnct.MSSQLConn 

     Dim msSQLComm As SqlCommand = New SqlCommand("csp_LoginAuthentication", sqlConnct.MSSQLConn) 
     msSQLComm.CommandType = CommandType.StoredProcedure 

     msSQLComm.Parameters.Add("@employeeid", SqlDbType.NVarChar, 20).Value = txtEmployeeID.Text 
     msSQLComm.Parameters.Add("@password", SqlDbType.NVarChar, 20).Value = txtPassword.Text 

     msSQLComm.Parameters.Add("@accountstatus", SqlDbType.Int).Direction = ParameterDirection.InputOutput 
     msSQLComm.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.InputOutput 

     sqlConnct.MSSQLConn.Open() 
     msSQLComm.ExecuteNonQuery() 

     accntStat = CInt(msSQLComm.Parameters("@accountstatus").Value) 
     loginCnt = CInt(msSQLComm.Parameters("@logincount").Value) 

    End With 

    MsgBox(accntStat) 

Оба кода дают мне необработанную ошибку для msSQLComm.ExecuteNonQuery():

Необработанное исключение из type 'System.Data.SqlClient.SqlException' произошел в System.Data.dll

Дополнительная информация rmation: Процедура или функция 'csp_LoginAuthentication' ожидает параметра '@accountstatus', который не был предоставлен.

Я действительно ценю помощь каждого здесь.

+0

Замечание: вы не должны ** использовать префикс 'sp_' для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+1

сделано, спасибо, что просветили меня –

+0

Дорогой Бог, это простой текстовый пароль !? 0_0 –

ответ

2
Dim accntStat As Integer 
Dim loginCnt As Integer 
Dim sqlConnct As New classSQLConnection 
Using sqlConnct.MSSQLConn, _ 
     cmd As New SqlCommand("csp_LoginAuthentication", sqlConnct.MSSQLConn)   

    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.Add("@employeeid", SqlDbType.Int).Value = txtEmployeeID.Text 
    cmd.Parameters.Add("@password", SqlDbType.NVarChar, 40).Value = txtPassword.Text 

    cmd.Parameters.Add("@accountstatus", SqlDbType.Int).Direction = ParameterDirection.InputOutput 
    cmd.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.InputOutput 

    sqlConnct.MSSQLConn.Open() 
    cmd.ExecuteNonQuery() 

    accntStat = CInt(cmd.Parameters("@accountstatus").Value) 
    loginCnt = CInt(cmd.Parameters("@logincount").Value) 

End Using 
MsgBox(accntStat) 

Я думаю, что устраняет несколько проблем, в том числе: выходные параметры и настройки их направление, параметр пароля установлен как целое число, очевидно строка какой-то , и не удается закрыть соединение в случае исключения.


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

+0

Спасибо за ответ, я попробовал ваш код, но он дает мне ошибку «Необработанное исключение типа» System.Data .SqlClient.SqlException 'произошел в System.Data.dll' 'Дополнительная информация: Процедура или функция' csp_LoginAuthentication 'ожидает параметра' @accountstatus ', который не был отправлен' –

+0

Странно, потому что этот параметр явно включен в код. –

+0

Я только что опубликовал свой обновленный код выше. Мне тоже кажется странным, так как я проверил некоторые статьи, и код должен (или должен) работать сейчас, но это не так. Я думаю, что буду плакать (> _ <) –

2

Вы должны также добавить параметры вывода для сбора параметров

msSQLComm.Parameters.Add("@accountstatus", SqlDbType.TinyInt).Direction = ParameterDirection.InputOutput 
msSQLComm.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.InputOutput 

Я предлагаю также изменить AddWithValue подход. Это ярлык с многочисленными недостатками, как вы можете прочитать в: Can We stop using AddWithValue already?

Посмотрев на свое редактирование, я заметил, что вы не выполняете команду.
После подготовки текста команды, параметры и настройки соединения, вы должны выполнить команду с

msSqlComm.ExecuteNonQuery() 

после этого ваши выходные параметры должны быть готовы, и вы можете получить их с

accntStat = Convert.ToInt16(msSQLComm.Parameters("@accountstatus").Value) 
loginCnt = Convert.ToInt32(msSQLComm.Parameters("@logincount").Value) 

Notice что я положил значение Value параметра внутри вызова Convert.ToXXXX. Это не требуется, если вы компилируете с помощью Option Strict Off, но, тем не менее, если у вас есть эта опция, установите значение «Выкл.», Тогда лучше включить ее. Это поможет многим избежать тонких ошибок, когда компилятор испускает автоматическое преобразование из DataType в другой DataType

Наконец, SqlCommand должен знать, какое соединение используется для доступа к базе данных. Если вы создадите свою команду, не назначая объект соединения, тогда нет возможности выполнить команду хранимой процедуры.Вы можете изменить строку, которая инициализирует команду

Dim msSQLComm As SqlCommand = New SqlCommand("csp_LoginAuthentication", sqlConnct.MSSQLConn) 
+0

Привет, спасибо за ответ, я попробовал оба ваших предложения. Это больше не дает мне ошибку, но теперь это дает мне «0» в результате вместо «1». Я пересмотрю свой вопрос, чтобы показать свой код. –

+0

Кроме того, я попытался отобразить результат через окно сообщения (msSQLComm.Parameters.Add («@ accountstatus», SqlDbType.Int) .Direction = ParameterDirection.InputOutput), и это дает мне «False в результате. –

+0

Привет, спасибо снова за ваше терпение, помогая мне. Я попробовал ваше предложение, но это дает мне ошибку для msSqlComm.ExecuteNonQuery(). Я только что пересмотрел код выше. Я забыл упомянуть, что я изменил TINYINT из INT в моем хранимую процедуру и правильно выполнил то, что я хотел. Я также воспользовался предложением @marc_s при переименовании своего SP –

0

Спасибо всем за то, что помогли мне решить эту проблему, я могу выяснить проблему кода. Я проверил Procedure or function “” expects parameter “”, which was not supplied и попытался заменить

msSQLComm.Parameters.Add("@accountstatus", SqlDbType.Int).Direction = ParameterDirection.InputOutput 
    msSQLComm.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.InputOutput 

TO:

msSQLComm.Parameters.Add("@accountstatus", SqlDbType.Int).Direction = ParameterDirection.Output 
    msSQLComm.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.Output 

И теперь это дает мне результаты, которые я хочу! Еще раз спасибо за помощь, особенно Steve и Joel Coehoorn. Вот весь код на всякий случай, если кто-то может столкнуться с одной и той же проблемой:

Dim accntStat As Integer 
    Dim loginCnt As Integer 
    Dim sqlConnct As New classSQLConnection 

    If sqlConnct.MSSQLConn.State = ConnectionState.Open Then sqlConnct.MSSQLConn.Close() 

    With sqlConnct.MSSQLConn 

     Dim msSQLComm As SqlCommand = New SqlCommand("csp_LoginAuthentication", sqlConnct.MSSQLConn) 
     msSQLComm.CommandType = CommandType.StoredProcedure 

     msSQLComm.Parameters.Add("@employeeid", SqlDbType.NVarChar).Value = txtEmployeeID.Text 
     msSQLComm.Parameters.Add("@password", SqlDbType.NVarChar).Value = txtPassword.Text 

     msSQLComm.Parameters.Add("@accountstatus", SqlDbType.Int).Direction = ParameterDirection.Output 
     msSQLComm.Parameters.Add("@logincount", SqlDbType.Int).Direction = ParameterDirection.Output 

     sqlConnct.MSSQLConn.Open() 
     msSQLComm.ExecuteNonQuery() 

     accntStat = CInt(msSQLComm.Parameters("@accountstatus").Value) 
     loginCnt = CInt(msSQLComm.Parameters("@logincount").Value) 

    End With 

    MsgBox(loginCnt) 
Смежные вопросы