19


2

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

4 Answer


45


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

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


8


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

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

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


3


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

これを変更するには、 SqlCommand`のhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtype.aspx [ CommandType`]プロパティを `StoredProcedure`に設定します。 。

あるいは、 CommandText`を "someStoredProcedure @UserName、@ProductCode" に変更することで、明示的にパラメーターを渡すこともできます。これは完全なSQLステートメントであり、デフォルトの `Text`の CommandType`で動作します。

編集:私はそれを試しましたが、 CommandType`を StoredProcedure`に設定せずにエラーメッセージを取得する唯一の方法(彼はしませんでした)は、 CommandText`が EXEC someStoredProcedure`である場合です。 「null」パラメータを渡すと、別のエラーが発生します。


3


Command1.CommandType = System.Data.CommandType.StoredProcedure

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