2010-12-19 6 views
3

다음은 데이터베이스 스키마, 현재 삽입 된 데이터베이스 데이터 (단 하나의 레코드 임) 및 실행중인 코드를 제공합니다. 이것은 매우 간단한 설정이지만 데이터베이스에서 하나의 레코드를 반환하는 대신 아무 것도 반환하지 않습니다. 누구나 왜 그런 생각이 있니? 나는 ... 여기 내 지혜의 끝입니다매우 간단한 SQLite 쿼리가 예상대로 반환되지 않습니다.

테이블 : 하청 업체

열 : (이름 입력) 형식으로 아래.

ID guid, 
BusinessName varchar(50), 
Address varchar(200), 
City varchar(50), 
State varchar(50), 
ZipCode varchar(50), 
Contact varchar(50), 
Phone varchar(50), 
Fax varchar(50), 
Email varchar(200), 
GLOPolicy bit, 
GLOLimit bigint, 
GLOExpiration datetime, 
ALPolicy bit, 
ALLimit bigint, 
ALExpiration datetime, 
WCPolicy bit, 
WCLimit bigint, 
WCExpiration datetime, 
ULPolicy bit, 
ULLimit bigint, 
ULExpiration datetime, 
Notes varchar(15000) 

=====

다음과 같이 내가 내 데이터베이스에서 하나 개의 레코드가 있습니다.

ID "7b143c19-ad66-46ad-b587-db0bee98cf1e" 
BusinessName "1" 
Address "1" 
City "1" 
State "1" 
ZipCode "1" 
Contact NULL 
Phone NULL 
Fax NULL 
Email NULL 
GLOPolicy False (0) 
GLOLimit NULL 
GLOExpiration NULL 
ALPolicy False (0) 
ALLimit NULL 
ALExpiration NULL 
WCPolicy False (0) 
WCLimit NULL 
WCExpiration NULL 
ULPolicy False (0) 
ULLimit NULL 
ULExpiration NULL 
Notes NULL 

===== * 나는 다음과 같은 쿼리를 시도하고, 그리고 그것은 분명 위의 유일한 기록을 반환해야 할 때, 아무 것도 반환하지 않습니다. 그것은 SQLite는 것 같습니다 *

String ID = "7b143c19-ad66-46ad-b587-db0bee98cf1e"; 
DataTable dt = sqliteQuery.selectFromDatabase("*", "WHERE ID = '" + ID + "'"); 

그리고 위의 방법에 대한 코드가 ...

public DataTable selectFromDatabase(String column, String filter) 
    { 
     string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter; 
     SQLiteCommand cmd = new SQLiteCommand(SQL); 
     cmd.Connection = connection; 
     SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     try 
     { 
      da.Fill(ds); 
      DataTable dt = ds.Tables[0]; 
      return dt; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
      return null; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      connection.Close(); 
     } 
    } 
+0

먼저 필터링하지 않고 선택하십시오. 모든 행을 가져 오도록 필터 대신 WHERE 1 = 1 (항상 참)이되도록 조건부를 설정하십시오. 당신이하지 않으면 그것은 잘못한 쿼리가 아닙니다. 또한 열 유형은 GUID이지만 쿼리는 문자열 값을 사용합니다. 전환이 필요할 수 있습니다. –

+0

필터를 1 = 1로 설정하면 데이터베이스의 단일 레코드를 반환합니다. 어떤 유형의 전환이 있다고 생각합니까? 나는 쿼리를 할 때 모든 것이 문자열로 전달되었다는 가정하에있었습니다 ... 그렇지 않은가요? 그렇지 않은 경우 그러한 전환에 대해 알고 있습니까? – CODe

답변

4

는 기본적으로는 GUID 형식을 지원하지 않습니다. 래퍼와 플러그인에 의해 지원되지만 유형이 사용되는 방식 사이에 약간의 임피던스가 발생한다고 생각합니다. 아마도 TEXT 유형으로 변경하는 것이 좋습니다. 그러면 귀하의 술어가 작동합니다.

편집

단지 않는 PKEY으로 행에 삽입 할 수있는 새로운 GUID 값을 만들려면 : 또한

Guid.NewGuid().ToString(); 

내가 the following info을 발견

GUID가 아닌 (!) 네이티브 SQLite-datatype이지만 추가 기능은 Robert 's 래퍼에서 을 제공했습니다. 연결 문자열에서 "BinaryGUID = Yes | No"를 지정할 수 있으며 예를 들어 으로 지정할 수 있습니다. "BinaryGUID = Yes"일 경우 GUID는 스토리지의 16 바이트를 사용하여 저장됩니다. 이제 "SQLite Expert"가 데이터 형식 GUID를 인식하는지 여부에 따라 달라집니다. 그렇다면 문서를 보시고 처리 방법을 알려주십시오. 그렇지 않은 경우 이 텍스트 (대개 문자 데이터로 유효하지 않음)로 처리됩니다. SQLite 편집기 또는 래퍼를 변경할 때 다시 문제가 발생합니다.

"BinaryGUID = 아니오"를 GUID가 텍스트가 32-38 바이트를 복용로 저장하면 (난 당신이 테스트가 마이너스 징후 및 중괄호 {} 저장되어 있는지 모르는 ).저장 용량이 큰 문제가 아닌 경우이 양식을 사용하는 것이 좋습니다. 그런 다음 아무런 문제가 없어야합니다. wrapper 또는 DB 편집기 을 사용하면 많은 시간을 절약하고 문제가 발생합니다.

유형 자체에 문제가있는 것으로 보입니다.

+0

그래서 래퍼는 16 진수를 변환합니까? 어쩌면 위에서 실제로하고있는 일을 실제로 할 수있는 방법이 있습니까? -_- – CODe

+1

예. ID 열 유형을 텍스트로 변경하십시오. (나는 그 대답의 주요 지점을 만들었습니다.) –

+0

텍스트 데이터 유형에 익숙하지 않습니다. guid와 같은 모든 레코드에 대해 고유 한 값을 부여합니까? 아니면 수동으로 어떻게해야합니까? – CODe

관련 문제