문제

sqlserver int 필드. 값은 때때로 널. DataAdapter는 DataSet OK를 채우고 DataGridView OK에 데이터를 표시 할 수 있습니다.

데이터 세트에서 프로그래밍 방식으로 데이터를 검색하려고 할 때 데이터 세트 필드 검색 코드는 강력한 표현 오류가 발생합니다.

 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public int curr_reading {
        get {
            try {
                return ((int)(this[this.tableHistory.curr_readingColumn]));
            }
            catch (global::System.InvalidCastException e) {
                throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
            }

Get Accessor에서 DBNULL을 확인하고 NULL을 반환함으로써 이것을 지나갔지 만 ... 데이터 세트 구조가 수정 될 때 (여전히 개발 중) 내 변경 사항이 사라졌습니다.

이 상황을 처리하는 가장 좋은 방법은 무엇입니까? 나는 데이터 세트 수준에서 그것을 다루는 데 붙어있는 것 같습니다. 자동 코드 생성기에게 변경 사항을 제자리에 두도록 지시 할 수있는 속성이 있습니까?

도움이 되었습니까?

해결책

데이터 세트에는 null을 나타내는 부울 속성이 있습니다.

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;

다른 팁

타이핑 된 데이터 세트 디자이너에는 다음이 있습니다 nullvalue 재산. 기본적으로 그 값은입니다 throw exception (따라서 생성 된 코드) 원하는 코드로 설정할 수 있습니다. default value.. 즉. 0. 그러면 예외 대신 0을 반환합니다. (다른 코드가 생성됨)

vs2008 : 이것은 데이터 세트 디자이너에서 직접 작동합니다.

vs2005 : 디자이너의 문자열에만 작동하지만 XSD를 직접 편집 할 수 있습니다.

  1. 자동 생성 된 코드를 내버려 두십시오. 생성되는 "차단"방법은 없으므로 변경 사항이 조만간 날아갈 수 있습니다.

  2. .NET (적어도 .NET 2.0 System.Data 비트)는 dbnull에서 다른 것으로 변환하지 않습니다. 이것은 짜증나지만 당신은 그것에 대해 아무것도 할 수 없습니다.

  3. Tonullable () 또는 유사한 확장 방법을 작성하십시오.이를 수행 할 수 있습니다.

.

public static Nullable<T> ToNullable(this object x){
    if(x == DBNull.Value)
       return default(T); // return null thing
    else
       return (T)x;
}

그런 다음 할 수 있습니다

int? thing = DataRow["column"].ToNullable<int>();

메모리가 제공되는 경우, .beginedit () 또는 이와 유사한 편집중인 것으로 표시해야합니다. 그런 다음 편집을 만들고 행을 저장합니다. 이 방법을 약간 읽고 싶을 수도 있습니다 (데이터 세트, 데이터 가능 또는 데이터가 가능) - 내 기억은 약간 흐릿합니다.

이것이 적어도 조금 도움이되기를 바랍니다.

if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top