2016-12-09 13 views
1

でそれを使用してこれは私のストアドプロシージャがこれですthis questionからフォローアップです。しかし、私はVB.Netソリューションにそれを持ってきて、それを使って、私の "Expressionは価値を生み出さない"と言っています。は、ストアドプロシージャからの戻り値を取得し、プログラム

ボタンクリックの場合:User.vb

Public Sub Check_Previous_Passwords(ByVal User As FoundationLibrary.User) 
    Dim IsSamePassword_ As Integer 
    Dim objCommand As New SqlCommand("Check_Previous_Passwords", DatabaseInterface_.Connection) 
    objCommand.CommandType = CommandType.StoredProcedure 
    objCommand.Parameters.AddWithValue("@ua_pk", ua_pk_) 
    objCommand.Parameters.AddWithValue("@IncomingPassword", ua_Password_) 
    DatabaseInterface_.Open() 
    IsSamePassword_ = objCommand.ExecuteScalar 
    DatabaseInterface_.Close() 
    If IsSamePassword_ = 1 Then 
     User.ua_ResetPassword_ = True 
    Else 
     User.ua_ResetPassword_ = False 
    End If 
End Sub 

私はDim IsSamePassword As Boolean使用している上

If user_.Check_Previous_Passwords(user_) = True Then 
    'throw error and set ResetPassword to true 
End If 

、その後、Trueに等しくなるように、私のIfステートメントを変更するさて、ここで私のVBコードです。それでも同じエラーを投げます。

私はこの気持ちが本当に簡単です。

+0

にストアドプロシージャを使用して、最後にリターンパラメータを含めるようにVBの呼び出しを変更する必要があります代わりにそれを使用してSPでRETURN

. . . . . IF EXISTS (SELECT ...) RETURN 1 ELSE RETURN 0 . . . . . 

を使用することができますあなたの前の質問で不完全です。いずれの場合でも、spは整数またはブール値ではない文字列を返します。ストアドプロシージャの実際のコードを表示してください_Check_Previous_Passwords_ – Steve

+0

はストアドプロシージャを追加しました –

+0

どのように不完全ですか? –

答えて

2

SQLは、それが必要以上に複雑です - あなたは

CREATE Procedure Check_Previous_Passwords 
    @ua_pk uniqueidentifier, 
    @IncomingPassword varchar(25) 
AS 
    SELECT COUNT(*) 
    FROM User_Passwords up 
    WHERE up.ua_fk = @ua_pk 
     AND @IncomingPassword = up.up_Password 

と、それはそれように機能する必要があります使用してVBを使用することができます値を返すことができます:

Option Strict On 
' ...' 
Public Function Check_Previous_Passwords(ByVal User As FoundationLibrary.User) As Boolean 
    Dim isSamePassword As Integer 
    Dim objCommand As New SqlCommand("Check_Previous_Passwords", DatabaseInterface_.Connection) 
    objCommand.CommandType = CommandType.StoredProcedure 
    objCommand.Parameters.Add(New SqlParameter With {.ParameterName"@ua_pk", .SqlDbType = SqlDbType.UniqueIdentifier, .Value = ua_pk_}) 
    objCommand.Parameters.Add(New SqlParameter With {.ParameterName = "@IncomingPassword", .SqlDbType = SqlDbType.VarChar, .Size = 25, .Value = ua_Password_}) 
    DatabaseInterface_.Open() 
    isSamePassword = CInt(objCommand.ExecuteScalar) 
    DatabaseInterface_.Close() 

    User.ua_ResetPassword_ = (isSamePassword = 1) 

    Return User.ua_ResetPassword_ 

End Function 

AddWithValueの部分を、確実に動作するバージョンに変更しました。 AddWithValueは避けてください。最終的には悲惨さしか感じません。Can we stop using AddWithValue() already?

+0

正直なところ、以前のコードをテンプレートとして使用していました。 –

+0

isSamePassword = 0の場合はどうなりますか?それは常に1に設定されているようです。 –

+0

ストアドプロシージャは、 'up.ua_fk = @ua_pkと@IncomingPassword = up.up_Password'を持つレコードの数を数え、その値を返します。ゼロの場合、 'isSamePassword 'はゼロになります。比較 '(isSamePassword = 1)'は 'False'を返します。 –

4

ストアドプロシージャは値を返しません。 SELECT @IsSamePassword = 0 statement only let the value 0〜@IsSamePassword変数。プロシージャの最後にSELECT @IsSamePasswordステートメントを書き込むか、@IsSamePassword変数を削除します。

CREATE Procedure Check_Previous_Passwords 
@ua_pk uniqueidentifier, 
@IncomingPassword varchar(25) 
AS 
DECLARE @Temp VARCHAR(25) 
DECLARE @IsSamePassword bit 

SET @Temp = (SELECT TOP 1 up_Password 
      FROM User_Passwords 
      WHERE ua_fk = @ua_pk 
      ORDER BY up_PasswordDate DESC) 


IF (EXISTS (SELECT 1 
      FROM User_Passwords up 
      WHERE up.ua_fk = @ua_pk 
      AND @IncomingPassword = up.up_Password)) 
    BEGIN 
     SELECT 1 

    END 
ELSE 
    BEGIN 
     SELECT 0 

    END 

それとも

CREATE Procedure Check_Previous_Passwords 
@ua_pk uniqueidentifier, 
@IncomingPassword varchar(25) 
AS 
DECLARE @Temp VARCHAR(25) 
DECLARE @IsSamePassword bit 

SET @Temp = (SELECT TOP 1 up_Password 
      FROM User_Passwords 
      WHERE ua_fk = @ua_pk 
      ORDER BY up_PasswordDate DESC) 


IF (EXISTS (SELECT 1 
      FROM User_Passwords up 
      WHERE up.ua_fk = @ua_pk 
      AND @IncomingPassword = up.up_Password)) 
    BEGIN 
     SELECT @IsSamePassword = 1 

    END 
ELSE 
    BEGIN 
     SELECT @IsSamePassword = 0 

    END 

SELECT @IsSamePassword 
+0

私はあなたが何を意味するか正確には分かりません。 –

+0

両方ともエラーを投げています –

+0

SQL Management StudioからSPを実行するとどうなりますか? –

1

これは、より多くの機能と技術を示すためのものです。実際には、あなたは本当にあなたがパラメータ方向

p.Direction = ParameterDirection.ReturnValue 
関連する問題