私のデータベースでは、テーブルの1つにGUID nullを許可する列があります。テーブルに新しいデータ行を挿入する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が値のDEFAULT
ではなくキーワードNULL
を含む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
_が必要になる可能性があります。
もちろん、列が本当にnull可能である場合は、C#コードで_Guid?
_であることを確認したいだけかもしれません;-p
null
をnullable Guid
にキャストする必要があります。これは私にとってどのように機能したかです。
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
グレッグ・ブナの答えと同じ
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
Nullにしたい場所でSystem.Guid.Emptyを試してください
C#コードでnull可能なGUIDの操作を避けたい場合(個人的には、null可能な型を操作するのが面倒なことがよくあります)、どこかに早期に Guid.Empty を.NETデータに割り当てることができます。データベース内。そうすれば、すべての.HasValue要素を気にする必要がなく、myGuid != Guid.Empty
代わりに。
または:
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
あなたが拡張メソッドに夢中なら...
_/// <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を許可する場合は、メソッドを簡単に調整できます。
ヘルパーメソッドを使用できます。
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; }
}
}
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}