web-dev-qa-db-ja.com

ヌル可能GUID

私のデータベースでは、テーブルの1つにGUID nullを許可する列があります。テーブルに新しいデータ行を挿入するGuid?パラメータを持つメソッドがあります。しかし、 myNewRow.myGuidColumn = myGuid次のエラーが表示されます:「暗黙的にタイプ「System.Guid?」を「System.Guid」に変換できません。」

27
kjv

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

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

ADO.NETが処理する必要がある余分な作業は苦痛ですが、(3.5 SP1でさえ)確実に処理されないようです。これは少なくとも正しく動作します。

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

28
Greg Beech

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

10
Marc Gravell

nullnullable Guidにキャストする必要があります。これは私にとってどのように機能したかです。

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
5
Chtiwi Malek

グレッグ・ブナの答えと同じ

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
5
cheeves

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

4
Imran

C#コードでnull可能なGUIDの操作を避けたい場合(個人的には、null可能な型を操作するのが面倒なことがよくあります)、どこかに早期に Guid.Empty を.NETデータに割り当てることができます。データベース内。そうすれば、すべての.HasValue要素を気にする必要がなく、myGuid != Guid.Empty代わりに。

3
Isak Savo

または:

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }
2
jimi

あなたが拡張メソッドに夢中なら...

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

1
Justin

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

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; }
    }
}
1
TcKs
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
0
maurox