2011-06-22 22 views
0

前回の質問に基づいてSQL Serverストアドプロシージャを作成しました。これはどの質問に答えられたのですか?これは新しい質問を作成する理由です。VBでSQL Serverストアドプロシージャを呼び出す

私が午前トラブルがVBでそれを呼び出す方法をあまりにも確認されていません

ALTER Procedure [dbo].[usp_validatecard](
@CLUBCARD1 nvarchar(50), 
@STATUS nvarchar(50)) 
As 

BEGIN 
IF EXISTS(Select CLUBCARD1, STATUS 
from dbo.clubmembers 
where CLUBCARD1 = @CLUBCARD1 and STATUS = 'ACTIVE') 
Print 'Card is GOOD' 
ELSE 
IF EXISTS(SELECT CLUBCARD1, STATUS 
FROM dbo.clubmembers 
where CLUBCARD1 = @CLUBCARD1 and STATUS = 'INACTIVE') 
PRINT 'Card is good but not active' 
ELSE 
PRINT 'CARD NOT IN SYSTEM' 
END 

ストアドプロシージャ。 clubcardパラメータがある場合、私はこれまでのところ、私がやろうとしていますこれは何

Imports System.Data.SqlClient 
Imports System.Web.Configuration 
Imports System.Data 

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Protected Sub cmdclick_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdclick.Click 
     Dim strConnString As String = WebConfigurationManager.ConnectionStrings("orca").ConnectionString 
     Dim con As New SqlConnection(strConnString) 
     Dim cmd As New SqlCommand("usp_validatecard", con) 
     cmd.CommandType = Data.CommandType.StoredProcedure 

     cmd.Parameters.Add("@CLUBCARD1", Data.SqlDbType.NVarChar).Value = txtvalidate.Text 

     Try 
      con.Open() 
      Dim Result As Integer = cmd.ExecuteNonQuery() 
     Catch ex As SqlException 
      lblmessage.Text = "Error" 
     Finally 
      con.Close() 
     End Try 
    End Sub 
End Class 

ですがclubcardパラメータが見つかり、ステータスがアクティブである場合、私はラベルが読みたいです持っているコードも「カードが良いです」しかし、アクティブではないことが判明した場合、ラベルには「カードは正常ですが有効ではありません」と表示されます。ストアドプロシージャを呼び出してexecを実行するだけで、エラーを出しているものに応じてステートメントが出力されます。

私はそれをデバッグするときに私が手にエラーがインデックス 財産を評価するために

項目で、プロパティは 資格と引数を明示的に でなければなりませんcmd.parameters.addの下にありますユーザによって供給される。

+0

ストアドプロシージャから '@STATUS nvarchar(50)'パラメータを削除できますか?それが使用されているように見えないし、あなたのvb.netコードで設定されていません。 –

答えて

1

あなたは

BEGIN 
IF EXISTS(Select CLUBCARD1, STATUS 
from dbo.clubmembers 
where CLUBCARD1 = @CLUBCARD1 and STATUS = 'ACTIVE') 
Print 'Card is GOOD' 
Select 'Card is GOOD'; 
ELSE 
IF EXISTS(SELECT CLUBCARD1, STATUS 
FROM dbo.clubmembers 
where CLUBCARD1 = @CLUBCARD1 and STATUS = 'INACTIVE') 
PRINT 'Card is good but not active' 
Select 'Card is good but not active'; 
ELSE 
PRINT 'CARD NOT IN SYSTEM' 
Select 'CARD NOT IN SYSTEM'; 
END 

にあなたのSPを変更することができますし、vb.net側には、

Dim reader as SqlDataReader = command.ExecuteReader() 
If reader.Read() Then 
    lblmessage.Text = Convert.ToString(reader(0)) 
End If 
+0

Hello bala私は@statusを削除しましたが、lblmessage.text = convert.tostring(reader [0])のコンパイルエラーが発生しました。 "識別子が期待されています"あなたが私に与えたvb.netコードは、それが正しければ、キャッチしようとしてください。ありがとう – Tim

+0

@Jawaidそれは 'reader(0)'ではなく、 'reader [0]'でなければなりません。私は初めてC#からそれをとてもうまく翻訳しなかった。 –

+0

あなたは素晴らしい仕事をしてくれてありがとう、なぜそれを修正したのか説明してくれてありがとう。読者(0)は実際に何をしていますか? – Tim

1

結果をストアドプロシージャから取得する必要があります。

印刷は何も返しません。SQL Server内で印刷されます(管理スタジオ内のストアドプロシージャを実行する場合に便利です)。

コード内に@STATUSパラメータを出力パラメータとして定義する必要があります(空の文字列でパラメータを定義し、次にparameter.Direction = ParameterDirection.Outputを設定します)。

次に、印刷ではなくストアドプロシージャでSET @ STATUS = stringと言う必要があります。

0

は、データベースにこのSPを試してみてください。そして、

ALTER Procedure [dbo].[usp_validatecard](
@strCLUBCARD1 nvarchar(50) 
) 
As 
SELECT 
    CASE 
     WHEN EXISTS(SELECT CLUBCARD1, [STATUS] FROM dbo.clubmembers WHERE CLUBCARD1 = @strCLUBCARD1 AND [STATUS] = 'ACTIVE') THEN 'CARD IS GOOD' 
     WHEN EXISTS(SELECT CLUBCARD1, [STATUS] FROM dbo.clubmembers WHERE CLUBCARD1 = @strCLUBCARD1 AND [STATUS] = 'INACTIVE') THEN 'CARD IS GOOD BUT NOT ACTIVE' 
     ELSE 'CARD NOT IN SYSTEM' 
    END 

...とこれはデータファクトリにあります:

''' <summary> 
''' Validates a card in the database 
''' </summary> 
''' <param name="clubCard">The card to validate</param> 
Public Shared Function ValidateCard(ByVal clubCard As String) As String 

    'create connection 
    Using cnSQL As SqlConnection = New SqlConnection("MyConnectionString") 
     Using cmdSP As New SqlCommand("usp_validatecard", cnSQL) 
      cmdSP.CommandType = System.Data.CommandType.StoredProcedure 

      'declare and add parameter 
      cmdSP.Parameters.Add("@strCLUBCARD1", System.Data.SqlDbType.NVarChar, 50).Value = clubCard 

      Dim dtTable As New DataTable 

      'execute command 
      Try 
       cnSQL.Open() 
       dtTable.Load(cmdSP.ExecuteReader()) 
       cnSQL.Close() 
      Catch ex As SqlException 
       'do something here 
      End Try 

      'return string 
      Return dtTable.Rows(0)(0) 
     End Using 
    End Using 

End Function 
関連する問題