2009-01-02 4 views
4

SQL에서 문자열 필드를 검색하는 여러 가지 방법을 보았습니다. 는 "올바른"방법이 있나요, 그리고 차이는SQL에서 문자열 필드를 검색하는 올바른 방법이 있습니까

SqlDataReader rdr; 
    1. String field = (String) rdr["field"]; 
    2. String field = rdr["field"].ToString(); 
    3. String field = rdr["field"] As String; 

감사 무엇인가! 유형이 문자열

  • 하지 않은 값이 null의 경우 그 예외를 발생시킬 수 있기 때문에 확실히 잘못되면

  • 답변

    4
    1. 는 예외를 일으킬 수 있음.
    2. 가 null의 경우, 또는이 안전을 위해

    그래서, 문자열이 아닌 다른 형태의 경우 경우는 null 할당합니다 - 나는 문자열을 기대하고있어 경우에 나는 3.

    +0

    실제로 (2)에서는 null에 대한 예외가 발생하지 않는다. null 문자열이 생깁니다. – LeJeune

    +0

    그러나 1. null에 대한 예외가 발생할 수 있습니다. –

    +0

    사실, (2) 값이 null이면 예외가 발생합니다. (3) 여기서 가장 좋습니다. –

    1

    를 선택할 것 , # 1 할거야. 어떤 이유로 필드가 문자열 또는 변경 유형이 아닌 경우 예외 메커니즘을 통해 필드에 대해 최소한 알게됩니다. 는 (그냥 시도/빈 캐치의 내부를 포장하지 않습니다.)

    6

    당신은 또한 사용할 수 있습니다 당신은 SqlDataReader 개체에 대한 정의를 보면

    int ordinal=rdr.GetOrdinal("stringField"); 
    if (rdr.IsDBNull(ordinal)) 
    { 
        return string.Empty; //Or null or however you want to handle it 
    } 
    else 
    { 
        rdr.GetString(ordinal); 
    } 
    

    [ "필드"]의 모습을 어느 :

    public override object this[string name] 
    { 
        get 
        { 
         return this.GetValue(this.GetOrdinal(name)); 
        } 
    } 
    

    본질적으로 이것은 동일한 일을합니다. 유형 안전합니다. 내가 뭘하고 싶은 건 SqlDataReader를 래핑하는 내 자신의 IDataReader를 만드는 것입니다. CSLA는이 패턴을 구현하는 다양한 데이터 유형에 대한 오버로드를 제공하므로 SafeDataReader를 호출하는 유사 메커니즘을 사용합니다.

    당신이 필드를 알고 있다면

    당신이 isDbNull 검사를 생략 할 수 null이되지 않습니다. 장황함 때문에 어떤 유형의 래퍼 또는 도우미 클래스에이를 넣고 함수를 만드는 것이 좋습니다.

    2

    질문이 데이터 정의와 상호 작용한다는 점에 유의하십시오. "field"가 "Not Null"로 정의 된 경우 null 데이터에 대해 걱정할 필요가 없으며 가독성을 위해 # 1을 선택해야합니다. 필드가 Null을 허용하지만 쿼리를 수행 할 때 당신이 "ISNULL"기능을 사용하는 경우 마찬가지로 : 당신은 여전히 ​​널 (null)에 대해 걱정할 필요가 없기 때문에

    Select IsNull(Field1, '') as Field1 From DBTable Where... 
    

    후, 다시, 당신은 # 1을 선택해야합니다. 물론 이것은 빈 문자열에 의해 마스크 될 null 값을 원한다고 가정합니다.

    if (nwReader.IsDBNull(nwReader.GetOrdinal("Field1"))) 
        *throw exception or otherwise handle null condition 
    string aStr = (string)nwReader["field"]; 
    

    이 마지막 사건은, 그러나, 정말 좋은 방법이 아닙니다 : 당신은 널 (null)에 대해 테스트 할 경우이 같은 오류 조건이 다음 로직이있을 것이다 때문이다. null이 유효하지 않은 값, 즉 오류 조건 인 경우 DDL에서이를 제외해야합니다. 나는 더 나은 가독성에 이르게 생각하기 때문에

    는 결국,하지만, 난 항상 옵션 # 1 가서는 내 널 (null)이 명시 적으로 처리하도록 강제합니다.

    0

    나는 ?? 문자열로 [ "필드"]

    문자열 필드 = RDR를 (다른 게시물 바와 같이) 널 (null)을 확인하기위한 오퍼레이터 ?? string.Empty

    이렇게하면됩니다. 그렇지 않다면 결과가 null이 아니길 바란다.그렇다면 3을 좋아한다.

    관련 문제