質問

データベースのテーブルの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)
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top