2013-08-28 2 views
4

일부 데이터를 Access 테이블에 삽입하는 다음 코드가 있습니다. 그러므로 매개 변수로 배열 요소를 추가 I 문자열 배열로 분할 쉼표로 구분 선로 시작INSERT 쿼리 - Null 대 빈 문자열 .. 중요합니까?

위의 예에서
string line = "one\ttwo\t\tfour"; 

string[] values = line.Split('\t'); 

using (OleDbCommand com = new OleDbCommand("INSERT INTO [MyTable] (" + 
    "[Field1], [Field2], [Field3], [Field4] " 
    ") VALUES (" + 
    "?, ?, ?, ?" + 
    ")", con)) 
{ 
    com.Parameters.Add("@p0", OleDbType.Char, 255).Value = (object)values[0] ?? DBNull.Value; 
    com.Parameters.Add("@p1", OleDbType.Char, 255).Value = (object)values[1] ?? DBNull.Value; 
    com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value; 
    com.Parameters.Add("@p3", OleDbType.Char, 255).Value = (object)values[3] ?? DBNull.Value; 

    com.ExecuteNonQuery(); 
} 

, @p2이 값을 가질 것이다. null 값 대신 빈 값으로 Access 테이블에 삽입됩니다. 적어도 나는 그것을 정확하게 설명하고 있다고 생각한다. Field3 is Null을 쿼리하면 결과가 없습니다. Field3 = ""을 쿼리하면 결과가 나타납니다. 공백이거나 null 인 경우 중요합니까? '선호'옵션이 있습니까?

감사합니다.

+1

정확한 용어는 ** 길이가 0 인 문자열 ** 또는 ** 빈 문자열 **이며 비어 있지 않습니다. 또한 왜 문자열 연결을 사용하여 다중 행 문자열 대신 SQL을 작성합니까? –

+2

설명해 주셔서 감사합니다. concatenation vs multiline에 관해서는, 나는 정말로 좋은 대답이 없습니다. 하지만 지금은 여러 줄 문자열에 대해 더 많이 읽은 후에 대신 그 문자열을 사용하려고합니다! –

답변

1

원래 문 : 그것은 values[2]에서 ''빈 문자열을 보내고있는 설명이 아닌 DBNull.Value에서

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value; 

.

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2]; 

추가 : 유형-사양으로 (OleDbType.Char) 보내지 못하게 방지한다 나는 명시 적으로 오히려 널 병합 연산자 (?) 사용하는 것보다 빈 문자열 (또는 null)로 변환 할 DBNull이 데이터베이스에, 나는 AddWithValue로 되돌릴 것 :

com.Parameters.AddWithValue("@p2", String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2]); 

이 너무 DBNull 또는 문자열을 받아 들여야 유형을 지정하지 않습니다. 어쨌든이 접근법을 선호합니다. 유형을 지정하면 필드 데이터 유형과 완전히 일치하는지 확인해야합니다. -> C#으로 처리하도록하십시오.

+0

필자의 견해로는 나중에이 코드를 읽을 때 'values'라는 이름이 약간 혼란스럽고 조금 더 설명적인 것을 선호한다. –

+0

이 시도하고 'System.DBNull'및 'String'사이에 암시 적 변환이 없기 때문에 '조건 식 종류를 확인할 수 없습니다.'오류가 발생합니다. 그리고 나는 '가치'에 대해 동의합니다. 간단한 작은 응용 프로그램이 시작되면서 통제 불능 상태에 빠졌습니다. 나는 어느 시점에서 그것을 모두 다시 쓸 계획이다. –

+0

내 답변에 추가했습니다. –

2

글쎄, null은 분명히 빈 문자열과 같지 않습니다. 그래, 중요해. 그러나 귀하의 도메인에서만. 즉 필드가 실제로 nullable이 아니고 Access가 빈 문자열로 DBNull.Value을 해석하면 값이없는 행을 찾을 때 염두에 두어야합니다. Access에서이 열이 nullable 인 경우이 동작을 볼 수 없습니다.

그러나 nullable 입력란 인 경우 실제로는 DBNull.Value 대신 null을 보내 주시면됩니다. 그래서, 다른 단어 :

values[0]; 

대신 :

(object)values[0] ?? DBNull.Value; 
+0

'(object) values ​​[2] 대신'values ​​[2]'를 사용 했습니까? DBNull.Value'하지만 Field3에 여전히 빈 문자열이 삽입됩니다. 테이블을 만들 때이 특정 필드를 만들기 위해'[Field3] Text (255) NULL'을 사용하고 있습니다. 나는 다른 것을 놓치고 있니? –

+0

내가 틀렸다고 정정하십시오. 그러나 SQL NULL은 .NET'null'과 동일하게 정의되지 않으므로'DBNull' 유형입니다. MS SQL에서'NULL'을 되 돌리면 .NET null과 비교하는 것이 정확하지 않을 수 있으며'DBNull'은이를 수정합니다. 그러나 EF 메서드에 null을 전달할 수 있으며 EF는 값으로 올바른 작업을 수행합니다. 실제로 이것은 struct Nullable '을 만드는 주된 동기 였으므로 nullable int와 bool을 nullable DB 컬럼으로 사용할 수 있습니다. – fourpastmidnight

관련 문제