문제

내 데이터베이스에는 테이블 중 하나에 허용 NULLS가있는 GUID 열이 있습니다. 안내서가있는 방법이 있습니까? 테이블에 새 데이터 행을 삽입하는 매개 변수. 그러나 내가 myNewrow.myguidColumn = myGuid라고 말할 때 다음 오류가 발생합니다. "system.guid? ' 'System.guid'로. "

도움이 되었습니까?

해결책

ADO.NET API는 널리 보울 수있는 값 유형을 처리 할 때 몇 가지 문제가 있습니다 (예 : 단순히 올바르게 작동하지 않음). 우리는 그것에 대한 문제가 끝나지 않았으며, 값을 null로 수동으로 설정하는 것이 가장 좋다는 결론에 도달했습니다.

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

Ado.net이 처리 해야하는 것은 고통스러운 추가 작업이지만 (3.5 SP1에서도) 안정적으로하지 않는 것 같습니다. 이것은 적어도 올바르게 작동합니다.

또한 생성 된 SQL에 키워드가 포함 된 SQLPARAMETERS로 무효 값 유형을 전달하는 데 문제가있었습니다. DEFAULT 대신에 NULL 값의 경우 매개 변수를 구축 할 때 동일한 접근법을 권장합니다.

다른 팁

확인; MyGuidColumn은 어떻게 정의되며 MyGuid는 어떻게 정의됩니까?

MyGuid라면 Guid? 그리고 MyGuidColumn입니다 Guid, 그러면 오류가 정확합니다. 사용해야합니다. myGuid.Value, 또는 (Guid)myGuid 가치를 얻으려면 (NULL이면 던질 것입니다) myGuid.GetValueOrDefault() null 인 경우 Zero Guid를 반환합니다.

MyGuid라면 Guid 그리고 MyGuidColumn입니다 Guid?, 그런 다음 작동해야합니다.

MyGuidColumn이라면 object, 당신은 아마 필요합니다 DBNull.Value 일반 널 대신.

물론, 열이 진정으로 무효가되면 단순히 그것이 Guid? C# 코드에서; -p

Greg Beech의 답변과 동일합니다

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

캐스팅해야합니다 null a nullable Guid, 이것이 나를 위해 어떻게 작동했는지 :

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

system.guid.empty를 사용해보십시오

C# 코드에서 무효 가이드를 사용하지 않으려면 (개인적으로, 나는 종종 무효 유형으로 작동하는 것이 번거 롭다는 것을 알게됩니다) 일찍 어딘가에 할당 할 수 있습니다. 안내 DB에서 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();

참고 :이 경우 NULL을 삽입합니다 myGuid == Guid.Empty, 열에서 빈 안내서를 허용하려면 메소드를 쉽게 조정할 수 있습니다.

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top