2017-03-09 4 views
1

ヌルとデータベースに関するqustionsを読んでいてもちょっと固執しています。私はどのようにデータベースフォームC#にNULLを送ることができるか把握しようとしています。メソッドsingatureは、それがOKですが、私はヌルを渡すとき、それは言うint型nullでないと呼び出されたときにヌル値をTSQLデータベースに挿入

MyMethod(string category, int? calories, int vegetarianFriendlyMeal); 

です。

SqlCommand.Prepareメソッドでは、すべてのパラメータに明示的に設定された型が必要です。

データベースにNULLを渡すことを許可し、以下のコードで明示的にタイプを設定する方法を教えていただけますか?ありがとうございました。

  command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
      command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
      if (calories == null) 
      { 
       command.Parameters.AddWithValue("@calories", DBNull.Value); 
      } 
      else 
      { 
       command.Parameters.Add("@calories", SqlDbType.Int).Value = calories; 
      } 

私も同じ結果と

SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories); 
command.Parameters.Add(cal); 

を試してみました。

+1

'.Value = calories ?? (オブジェクト)DBNull.Value; 'うまく動作するはずです。唯一の違いは値なので、なぜ2つの異なる方法でパラメータを作成しますか? – Luaan

+0

これはコード全体ですか?一見しても何の問題もありません。クエリに他のパラメータがありますか? – Andrey

+0

@Luaanこれもありがとうございます、そのifステートメントを保存します。 – Bendom

答えて

1

あなたが試してみました:

cmd.Parameters.Add("@calories", System.Data.SqlDbType.Int).Value = DBNull.Value;

+0

これは完全に正常に動作します。ありがとうございました。 – Bendom

1

をソリューションはここに簡単です。ケース1の場合、AddWithValueを使用している.NETは、関連タイプDBNull.Valueを推論できません。ケース1の解は次の通りです。

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
if (calories == null) 
{ 
    command.Parameters.Add("@calories", SqlDbType.Int).Value = (object)DBNull.Value; 
} 
else 
{ 
    command.Parameters.Add("@calories", SqlDbType.Int).Value = calories; 
} 

ケース2では、タイプを一切与えません。

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
SqlParameter cal = new SqlParameter("@calories", calories == null ? (object)DBNull.Value : calories); 
cal.DbType = SqlDbType.Int; 
command.Parameters.Add(cal); 

しかし、あなたはそれをきれいにしたい場合は、そのようなこと行うことができます:解決策は以下のようになり

command.Parameters.Add("@cat", SqlDbType.VarChar, 2).Value = category; 
command.Parameters.Add("@veg", SqlDbType.Int).Value = vegetarianFriendlyMeal; 
command.Parameters.Add("@calories", SqlDbType.Int).Value = calories ?? (object)DBNull.Value; 

はEDIT:AddWithValueを使用しないでくださいを。 .NETがあなたのために穴を埋めるのは危険です。

+0

ありがとうございます。私は通常一緒に行く。しかし、ここで私は立ち往生していたし、.AddWithValueが私のためにこれを解決することを望んだ。 – Bendom

関連する問題