2016-05-04 24 views
2

私はこのバグをしばらく理解しようとしていますが、助けていただければ幸いです。ありがとう。 ここに私のエラーメッセージがあります: プロシージャまたは関数 'getAvailableSMSNumbers'は、パラメータ '@Election_ID'が必要ですが、これは指定されていません。ここで"プロシージャまたは関数が提供されていないパラメータを期待しています"

は私のSQLコードです:

CREATE PROCEDURE {databaseOwner}{objectQualifier}getAvailableSMSNumbers 
    @Election_ID nvarchar(20)  
AS 
SELECT * 
FROM {databaseOwner}{objectQualifier}icc_sms_phones 
LEFT JOIN {databaseOwner}{objectQualifier}icc_sms_elections ON sms_elections_sms_number = phones_number 

WHERE sms_elections_sms_number IS NULL 
OR sms_elections_id = @Election_ID 

GO 

機能:機能を使用している

Public Overrides Function getAvailableSMSNumbers(eventid As String) As IDataReader 
    Dim dtable As New DataTable 
    Using sqlconn As New SqlConnection(Me.ConnectionString) 
     Using sqlcomm As New SqlCommand 
      Using sqlda As New SqlDataAdapter 
       sqlcomm.Connection = sqlconn 
       sqlcomm.CommandType = CommandType.StoredProcedure       sqlcomm.CommandText=GetFullyQualifiedName("getAvailableSMSNumbers") 
       sqlcomm.Parameters.AddWithValue("@Election_ID", eventid) 
       sqlda.SelectCommand = sqlcomm 
       sqlconn.Open() 
       sqlda.Fill(dtable) 
       sqlconn.Close() 
       Return dtable.CreateDataReader 
      End Using 
     End Using 
    End Using 
End Function 

Public Function getAvailableSMSNumbers(eventid As String) As List(Of phoneModel) 
    Dim numbers As New List(Of phoneModel) 
    Dim number As phoneModel 

    numbers = CBO.FillCollection(Of phoneModel)(dal.getAvailableSMSNumbers(eventid)) 

    For Each number In numbers 'dal.getAvailableSMSNumbers(eventid).Rows 
     number = New phoneModel 
     With number 
      .val = ("PHONES_NUMBER").ToString 
      .text = String.Format("{0:# (###) ###-####}", Long.Parse(.val)) 
     End With 
     numbers.Add(number) 
    Next 
    Return numbers 
End Function 

あなたはもう情報が必要な場合、私に知らせて、私はそれを追加します。

+0

実際に有効な文字列を 'eventid'として渡していることを確認できますか? –

+0

可能な複製http://stackoverflow.com/q/3865982/1654818。可能であれば、あなたと問題を比較し、差別化のための詳細を追加してください。 – JimmyBoh

答えて

0

これは、通常、SQLパラメータの値として指定されたオブジェクトがNULLであるが、ストアドプロシージャでNULL値を許可しない場合に発生します。この行に条件付きブレークポイントを設定してsqlcomm.Parameters.AddWithValue("@Election_ID", eventid)に設定して、eventidパラメータがnullでないことを確認することができます。

防衛的なコーディングを使用し、getAvailableSMSNumbers関数でeventidがヌルでないことを確認し、そうであれば、例外をスローするか、ユーザーに対して何らかのタイプのフィードバックを提供することをお勧めします。

CREATE PROCEDURE {databaseOwner}{objectQualifier}getAvailableSMSNumbers 

    @Election_ID nvarchar(20) = NULL 

AS 

あなたのパラメータのデフォルト値は入力の値がない場合はnullになりますことを意味します。あなたはNULLパラメータを許可するように、ストアドプロシージャを再コンパイルしようとすることができます。オプションとして

+0

あなたの推論によれば、_eventid_がnullの場合、@Election_IDパラメータはストアドプロシージャに渡されません。 – Steve

+0

これは渡されないか、渡されますが、NULL値です。 '@Election_ID'を許容されるNULLにしたい場合は、' @Election_ID nvarchar(20)= NULL'としてsprocで宣言して、デフォルト値を持つようにしたいでしょう。 – DVK

0

。このソリューションは、空のデータテーブルをエラーなく返したい場合に便利です。それ以外の場合は、VBコードをデバッグし、問題の開始場所を理解する必要があります。

0

手続きをどのように呼んでいるか考えてみましょう。あなたが手順の値を指定する必要があり呼び出すとき:。get_particular_girl_from_girlsTableは手続きであり、「ジェーン」は、パラメータGirlNameの値である。例えば、

Call get_particular_girl_from_girlsTable("Jane") 

関連する問題