31

私のデータベースでは、テーブルの 1 つに null を許可する GUID 列があります。Guid を使用するメソッドがありますか? テーブルに新しいデータ行を挿入するパラメーター。ただし、myNewRow.myGuidColumn = myGuid と言うと、次のエラーが表示されます。「System.Guid」に。」

4

10 に答える 10

32

ADO.NET APIには、null許容値型の処理に関していくつかの問題があります(つまり、単に正しく機能しません)。問題は解決していません。そのため、値を手動でnullに設定するのが最善であるという結論に達しました。

myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value

ADO.NETが処理する必要のある余分な作業は面倒ですが、(3.5 SP1でも)確実に処理できるとは限りません。これは少なくとも正しく機能します。

また、null許容値型をSqlParametersに渡す際に問題が発生し、生成されたSQLに値ではDEFAULTなくキーワードが含まれるNULLため、パラメーターを作成するときに同じアプローチをお勧めします。

于 2008-10-17T08:48:01.363 に答える
10

わかった; 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

于 2008-10-17T08:48:29.943 に答える
6

グレッグ・ビーチの答えと同じ

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
于 2008-10-17T12:05:00.437 に答える
4

null にしたい場所で System.Guid.Empty を試してください

于 2011-06-15T14:03:04.673 に答える
3

C# コードで null 許容 GUID を使用することを避けたい場合 (個人的には、null 許容型を扱うのは面倒だと思うことがよくあります)、早い段階でどこかでGuid.Emptyを .NET データに割り当てることができます。これは db で null です。そうすれば、すべての .HasValue を気にする必要はなく、myGuid != Guid.Empty代わりにかどうかを確認するだけです。

于 2008-10-17T10:33:45.847 に答える
2

また:

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }
于 2008-10-17T10:19:57.697 に答える
1

ヘルパーメソッドを使用できます。

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; }
    }
}
于 2008-10-17T09:15:44.893 に答える
1

拡張メソッドに興味がある場合...

/// <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 を許可する場合は、メソッドを簡単に微調整できます。

于 2013-05-08T14:43:16.100 に答える
0
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
于 2015-10-19T11:59:46.167 に答える