web-dev-qa-db-ja.com

SQLクエリによると、パラメータは指定されていませんが、SqlCommandオブジェクトに追加されています

UserNameというパラメーターを持つストアドプロシージャがあり、背後のコードには、Addメソッドを使用してパラメーターを追加するSqlCommandオブジェクトがあります。ただし、何らかの理由で、コマンドオブジェクトがExecuteReaderメソッドを実行しようとすると、例外がスローされます。私は完全に途方に暮れていて、なぜそれがパラメータを認識しないのか分かりません。 ExecuteReaderメソッドを実行する前に、ブレークポイントを設定しているので、コマンドオブジェクトに設定されているパラメーターが含まれていることを確認できます。これは正しいことです。パラメータがコマンドオブジェクトに追加されていない場合、ストアドプロシージャは正しいデータを返しますが、実際のストアドプロシージャにハードコーディングされていることはわかっています。以下は、catchブロックに表示される例外メッセージです。また、コードとストアドプロシージャの最初の部分を貼り付けます。私が役に立たないために多くの異なるアプローチを試みたのを見て、私はこの問題でどんな助けでも大いに感謝します。前もって感謝します。



例外メッセージ

プロシージャまたは関数 'someStoredProcedure'には、指定されていないパラメータ '@UserName'が必要です。



コードビハインド

private DataTable GetLossMitData(string code, DateTime? start, DateTime? end)  
{  
DataTable results = new DataTable();  
string connectionString = ConfigurationManager.ConnectionStrings["asdf"].ConnectionString;  
string userName = String.Empty;  

try  
{  
    using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"]))  
    {  
        using (SPWeb web = site.OpenWeb())  
        {  
            userName = web.CurrentUser.Email.ToString();  
        }  
    }  

    using (SqlConnection connection1 = new SqlConnection(connectionString))  
    {  
         connection1.Open();  
         using (SqlCommand command1 = new SqlCommand("someStoredProcedure", connection1))  
         {  
             command1.Parameters.Add(new SqlParameter("@UserName", userName));  
             command1.Parameters.Add(new SqlParameter("@ProductCode", code));  

             SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection);  
             results.Load(dr);  
         }  
         connection1.Close();  
    }  
}  
catch (Exception ex)  
{  
}  
return results;  
}  



ストアドプロシージャ

@UserName nvarchar(256),  
@ProductCode nvarchar(256),
@StartDate nvarchar(256) = '1/1/1900',
@EndDate nvarchar(256) = '12/30/2012'

AS
BEGIN
SET NOCOUNT ON;

Declare @UserID int

Select @UserID = Users.UserID
from Users
where Users.Email = @UserName
22
jhorton

コマンドタイプがストアドプロシージャに設定されていることを確認してください。

mycommand.CommandType = System.Data.CommandType.StoredProcedure;
48
Aaron

'userName'変数の値がnullの場合、この例外が発生します

Nullが有効な場合は、代わりに「DBNull.Value」をdbに渡します。

command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));   
9
Ray

デフォルトでは、CommandTextプロパティには、ストアドプロシージャの名前だけでなく、完全なSQLコマンドが含まれている必要があります。

これを変更して、SqlCommandの-​​ CommandType プロパティをStoredProcedureに設定できます。

または、CommandText"someStoredProcedure @UserName, @ProductCode"に変更して、パラメーターを明示的に渡すこともできます。これは完全なSQLステートメントであり、デフォルトのCommandTypeTextで機能します。

[〜#〜] edit [〜#〜]:試したところ、CommandTypeからStoredProcedure(彼はしませんでした)は、CommandTextEXEC someStoredProcedureの場合です。 nullパラメータを渡すと、別のエラーが発生します。

3
SLaks
Command1.CommandType = System.Data.CommandType.StoredProcedure

これにより、ExecuteReaderは、フラットコマンドとして試行するのではなく、execを実行するように強制されます。

3
Craig