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
コマンドタイプがストアドプロシージャに設定されていることを確認してください。
mycommand.CommandType = System.Data.CommandType.StoredProcedure;
'userName'変数の値がnullの場合、この例外が発生します
Nullが有効な場合は、代わりに「DBNull.Value」をdbに渡します。
command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));
デフォルトでは、CommandText
プロパティには、ストアドプロシージャの名前だけでなく、完全なSQLコマンドが含まれている必要があります。
これを変更して、SqlCommand
の- CommandType
プロパティをStoredProcedure
に設定できます。
または、CommandText
を"someStoredProcedure @UserName, @ProductCode"
に変更して、パラメーターを明示的に渡すこともできます。これは完全なSQLステートメントであり、デフォルトのCommandType
のText
で機能します。
[〜#〜] edit [〜#〜]:試したところ、CommandType
からStoredProcedure
(彼はしませんでした)は、CommandText
がEXEC someStoredProcedure
の場合です。 null
パラメータを渡すと、別のエラーが発生します。
Command1.CommandType = System.Data.CommandType.StoredProcedure
これにより、ExecuteReaderは、フラットコマンドとして試行するのではなく、execを実行するように強制されます。