私のデータベースでは、テーブルの 1 つに null を許可する GUID 列があります。Guid を使用するメソッドがありますか? テーブルに新しいデータ行を挿入するパラメーター。ただし、myNewRow.myGuidColumn = myGuid と言うと、次のエラーが表示されます。「System.Guid」に。」
10 に答える
ADO.NET APIには、null許容値型の処理に関していくつかの問題があります(つまり、単に正しく機能しません)。問題は解決していません。そのため、値を手動でnullに設定するのが最善であるという結論に達しました。
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
ADO.NETが処理する必要のある余分な作業は面倒ですが、(3.5 SP1でも)確実に処理できるとは限りません。これは少なくとも正しく機能します。
また、null許容値型をSqlParametersに渡す際に問題が発生し、生成されたSQLに値ではDEFAULT
なくキーワードが含まれるNULL
ため、パラメーターを作成するときに同じアプローチをお勧めします。
わかった; myGuidColumnはどのように定義され、myGuidはどのように定義されますか?
myGuidがGuid?
でmyGuidColumnがGuid
の場合、エラーは正しいです。、を使用するmyGuid.Value
か(Guid)myGuid
、値(nullの場合はスローされます)を取得するか、myGuid.GetValueOrDefault()
nullの場合はゼロのGUIDを返す必要があります。
myGuidがGuid
で、myGuidColumnがGuid?
の場合、機能するはずです。
myGuidColumnがの場合、通常のnullの代わりにobject
おそらく必要です。DBNull.Value
もちろん、列が本当にnull許容である場合はGuid?
、C#コード内にあることを確認するだけです; -p
グレッグ・ビーチの答えと同じ
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
null にしたい場所で System.Guid.Empty を試してください
C# コードで null 許容 GUID を使用することを避けたい場合 (個人的には、null 許容型を扱うのは面倒だと思うことがよくあります)、早い段階でどこかでGuid.Emptyを .NET データに割り当てることができます。これは db で null です。そうすれば、すべての .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();
注: これは null の場合myGuid == Guid.Empty
に挿入されます。列に空の Guid を許可する場合は、メソッドを簡単に微調整できます。
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}