2012-03-01 3 views
7

ストアドプロシージャを使用してテーブルを作成しています。テーブルは名前の真ん中の頭文字に「null」を許可しますが、次のエラーメッセージが表示されます。C#ASP.Net Parameters.AddWithValueパラメータのnull値を拒否します

プロシージャまたは関数 'uspInsertPersonalAccountApplication'は、パラメータ '@MiddleInitial'が指定されていません。

ありがとうございます!

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 

答えて

4

を設定する必要がちょっと2つのオプションがここにあります

はあなたのストアドプロシージャを変更し、現在はオプションではありませんオプション@MiddleInitialのparamを(作りますだからこそエラーがスローされます)

@MiddleInitial nvarchar(10) = NULL 

またはあなたのコードに次の行を追加します。

cmd.Parameters.AddWithValue("@MiddleInitial", null); 
+1

53人のパラメータを渡していますが、その多くはnullでもかまいません。 IF文で各代入をラップすることなくDBNull.Valueをどのように動的に設定できますか? – Susan

+1

ストアドプロシージャを変更することが可能な場合は、nullにできるparamateresを変更し、ストアドプロシージャ宣言でオプションにします。それが最も柔軟な解決策です。これが不可能な場合は、 'SqlCommandBuilder.DeriveParameters(command);'を使用して、ループ内のそれぞれに対して 'DBNull.Value'を設定することができます。そしてあなたが望むものを割り当てます。 – Marcin

+2

http://stackoverflow.com/a/9518215/8479へのコメントを見る: 'cmd.ParametersAddWithValue(" @MinInitial "、(オブジェクト)yourVal?DBNull.Value);'を使うか、 'AddParamWithValueOrNull( ) ' – Rory

3

DBNull.Valueの代わりnullに渡すようにしてください。それがnullだ場合でも -

+0

私は53人のパラメタを渡していますが、その多くはnullでもかまいません。 IF文で各代入をラップすることなくDBNull.Valueをどのように動的に設定できますか? – Susan

+1

追加 '?? DBNull.Value'を値の後に追加するか、それを行う 'AddValueWithNonNullParameter'のような関数を作成します – Andomar

+0

このようにしますか? Intellisenseは私にエラーを与え、IntellisenseはAddValueWithNullParameterを認識しません------- cmd.Parameters.AddWithValue( "@ MiddleInitial"、InputData [11] ?? DBNull.Value); – Susan

0

はあなたがすべてのものに宣言する必要がヌル値でも

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
1

をMiddleInitialためのパラメータを追加します。

MiddleInitialDBNull.Valueを使用してください。

cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
0

お店の手順で

@MiddleInitial varhcar(8) = null 
+0

+1これは実際にはパラメータがオプションになるので機能します – Andomar

5

あなたが拡張メソッド次のプロジェクトと使用するために追加することができます。

public static SqlParameter AddWithValueSafe(this SqlParameterCollection parameters, string parameterName, object value) 
{ 
    return parameters.AddWithValue(parameterName, value ?? DBNull.Value); 
} 
1

私はこの問題を戦うために拡張メソッドを作成しました。 Marcinの提案は、ストアドプロシージャを更新できるかどうか検討する価値もあります。

cmd.Parameters.AddString("@MyParamName", myValue); 


public static class SQLExtension 
{ 
    public static void AddString(this SqlParameterCollection collection, string parameterName, string value) 
    { 
     collection.AddWithValue(parameterName, ((object)value) ?? DBNull.Value); 
    } 
} 
関連する問題