+ +
19
2
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を実行します。