Nullable GUID
-
03-07-2019 - |
質問
データベースのテーブルの1つに、NULLを許可するGUID列があります。 Guidを使用したメソッドはありますか?テーブルに新しいデータ行を挿入するパラメーター。ただし、myNewRow.myGuidColumn = myGuidと言うと、次のエラーが表示されます。"暗黙的に型 'System.Guid?'を変換できません「System.Guid」へ」"
解決
ADO.NET APIには、null許容値型の処理に関していくつかの問題があります(つまり、単に正しく動作しません)。これで問題は終わりませんでした。したがって、値を手動でnullに設定するのが最善であるという結論に達しました。たとえば、
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
ADO.NETで処理するのは苦痛の多い余分な作業ですが、(3.5 SP1でも)確実に処理できるとは思えません。これは少なくとも正しく機能します。
また、生成されたSQLの値に NULL
の代わりにキーワード DEFAULT
が含まれる場合、SqlParametersにNULL値を許可する値型を渡す問題が発生しました。パラメータを構築するときの同じアプローチ。
他のヒント
OK; myGuidColumnの定義方法とmyGuidの定義方法
myGuidが Guid?
でmyGuidColumnが Guid
の場合、エラーは正しいです。 myGuid.Value
を使用する必要があります。または(Guid)myGuid
で値を取得(nullの場合はスローされます)、または myGuid.GetValueOrDefault()
でnullの場合はゼロのguidを返します。
myGuidが Guid
でmyGuidColumnが Guid?
の場合、動作するはずです。
myGuidColumnが object
の場合、通常のnullの代わりに DBNull.Value
が必要になる可能性があります。
もちろん、列が本当にヌル可能であれば、C#コードで Guid?
であることを単に確認したいかもしれません;-p
グレッグビーチの答えと同じ
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
null
を nullable Guid
にキャストする必要があります。
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
nullにするSystem.Guid.Emptyを試してください
c#コードでnull値を許可するGUIDの操作を避けたい場合(個人的には、null値を許可する型を操作するのは面倒だと感じることが多い)、 Guid.Empty は、データベース内のnullである.NETデータへ。そうすれば、すべての.HasValueに煩わされる必要はなく、代わりに myGuid!= Guid.Empty
かどうかを確認するだけです。
または:
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
ヘルパーメソッドを使用できます:
public static class Ado {
public static void SetParameterValue<T>( IDataParameter parameter, T? value ) where T : struct {
if ( null == value ) { parameter.Value = DBNull.Value; }
else { parameter.Value = value.Value; }
}
public static void SetParameterValue( IDataParameter parameter, string value ) {
if ( null == value ) { parameter.Value = DBNull.Value; }
else { parameter.Value = value; }
}
}
拡張メソッドを使用している場合...
/// <summary>
/// Returns nullable Guid (Guid?) value if not null or Guid.Empty, otherwise returns DBNull.Value
/// </summary>
public static object GetValueOrDBNull(this Guid? aGuid)
{
return (!aGuid.IsNullOrEmpty()) ? (object)aGuid : DBNull.Value;
}
/// <summary>
/// Determines if a nullable Guid (Guid?) is null or Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid? aGuid)
{
return (!aGuid.HasValue || aGuid.Value == Guid.Empty);
}
その後、あなたは言うことができます:
myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();
注: myGuid == Guid.Empty
の場合、nullが挿入されます。列に空のGuidを許可する場合は、メソッドを簡単に調整できます。
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}