2010-11-19 5 views
5

私はSqlParameterを使用して、ヌル値を、NULL可能なさまざまな列の表に渡しています。問題は、sqlParameterが、sqlDbTypeが存在しない場合、nvarcharにデフォルト設定されているように見えることです。これは、実際のdb型がvarbinaryの場合は問題が発生します。sqlDbTypeを知らずにSqlParameterでDBNull.Valueを使用していますか?

データ型nvarcharからvarbinary(max)への暗黙的な変換は許可されていません。この問合せを実行するには、CONVERTファンクションを使用します。

私がSqlParameterを作成するとき、私が知っているのはパラメータの名前とオブジェクトだけです。オブジェクトがnullの場合、SqlParameterは明らかに使用する正しい型を推論することができません.SQLパラメータを作成する際にsqlParameterを使用する方法はありますか?

タイプを指定せずにDBNullをデータベースに渡し、データベースで処理させますか?

+0

実際にアプリケーションの列の種類がわかっているはずです。 – cjk

答えて

1

NULL列のデフォルト値(NULLに設定)を設定してから、挿入文でNULL列を渡さないでください。

-1
command.Parameters.AddWithValue("@param", DBNull.Value); 
4

古い投稿ですが、他の人に役立つかもしれません。この

command.Parameters.AddWithValue("@param", Convert.DBNull); 
+0

**これは、問題の汎用的な解決策です。前もって型を知らずに!** – CodeAngry

+0

残念ながら、私はこれを 'varbinary'型で動作させることはできません。 – jocull

0

同様

Convert.DBNull 

は、これを行うための別の方法があります。 AddWithValueを使用しても、 は使用できますが、DBNull.Valueの代わりにSqlBinary.Nullを使用します。

c.Parameters.AddWithValue( "@ cfp"、SqlBinary.Null);

System.Data.SqlTypesをプロジェクトにインポートすることを忘れないでください。

Source

0

私は、パラメータを生成するobjectsを使用して、社内のORMのようなものを扱っています。 nullでは、さまざまなSQLのNULL型を区別することが難しくなります。

DBNull.ValueはほとんどすべてのSQL型で機能しますが、私が使用しているvarbinary(max)カラムでは失敗します。代わりにSqlBinary.Nullを使用する必要があります - なぜ私に尋ねないでください。

ここでは、特別なタグ値を使用して、この列タイプをいつ使用するかを指定することにしました。以下の「ORM」を除きフルです。

using System.Data.SqlTypes; 

class MyModelType 
{ 
    public Guid ID { get; set; } 
    public byte[] Data { get; set; } 
} 

static readonly object NullSqlBinary = new object(); 

object SqlValueForObject(object val) 
{ 
    if (val == null) 
    { 
     val = DBNull.Value; 
    } 
    else if (val == NullSqlBinary) 
    { 
     val = SqlBinary.Null; 
    } 
    return val; 
} 

IDictionary<string, object> Params(MyModelType x) 
{ 
    return new Dictionary<string, object> 
    { 
     { "@ID", x.ID }, 
     { "@Data", x.Data ?? NullSqlBinary }, 
    }; 
} 

private SqlCommand CreateCommand() 
{ 
    var cmd = Connection.CreateCommand(); 
    cmd.CommandTimeout = 60; 

    return cmd; 
} 

SqlCommand CreateCommand(string sql, IDictionary<string, object> values) 
{ 
    var cmd = CreateCommand(); 
    cmd.CommandText = sql; 
    cmd.Transaction = GetCurrentTransaction(); 

    cmd.Parameters.Clear(); 
    if (values != null) 
    { 
     foreach (var kvp in values) 
     { 
      object sqlVal = SqlValueForObject(kvp.Value); 
      cmd.Parameters.AddWithValue(kvp.Key, sqlVal); 
     } 
    } 
    return cmd; 
} 

int Execute(string sql, IDictionary<string, object> values) 
{ 
    using (var cmd = CreateCommand(sql, values)) 
    { 
     return cmd.ExecuteNonQuery(); 
    } 
} 

void InsertMyModel(MyModelType obj) 
{ 
    DB.Execute(
     @"INSERT INTO MyTable (ID, Data) 
     VALUES (@ID, @Data)", Params(obj)); 
} 
関連する問題