2013-09-04 2 views
5

안녕 캐스팅 작업을 해결할 수 없습니다. 내 테이블 스키마를 얻기 위해 DataReader을 사용하고 라인DBNull을 부울로 캐스팅

isKey = Convert.ToBoolean(row["IsKey"].ToString()); 

에 대한

String not recognized as a valid boolean

: 나는 오류가 발생합니다. IsKey은 현재 내 DB에있는 모든 곳의 null입니다. 기본적으로 true 또는 false 결과가 필요합니다.

tableSchema = myReader.GetSchemaTable();  

foreach (DataRow row in tableSchema.Rows) 
{ 
    string columnName = row["ColumnName"].ToString(); 
    string columnType = row["DataTypeName"].ToString();    
    bool isKey = Convert.ToBoolean(row["IsKey"].ToString()); 
+1

null은 부울 유형이 아니므로 null을 사용할 수 있습니다. 'bool?'. 하지만 ToString()을 사용하면 아무 일도 일어나지 않을 것입니다. – Lloyd

+0

당신은'bool? '을 사용해야합니다. –

+1

만약'DBNull.Value'라면,'bool' 값으로 변환 하시겠습니까? –

답변

19

첫째, DataRow의 값을 얻기 위해이 형식을 사용

string columnName = row.Field<string>("ColumnName"); 
string columnType = row.Field<string>("DataTypeName"); 
//this uses your first and second variable call as an example 

이 강력하게 반환 값을 정의하고 당신을 위해 변환을 수행합니다.

귀하의 문제는 bit (또는 적어도 조금 희망합니다) 열을 가지고 있지만 또한 nulls을 허용한다는 것입니다. 즉, C#의 데이터 유형은 bool?입니다. (의견의)

bool? isKey = row.Field<bool?>("IsKey"); 

두 번째 질문 : "나를 제공 :

if bool? isKey return NULL how can I convert that to false?

가장 쉬운 방법은이 Null-Coalescing Operator

bool isKey = row.Field<bool?>("IsKey") ?? false; 

이 말한다 사용하는 것입니다 이것을 사용 null가 아닌 최초의 것은, 열의 값 또는 「false」입니다.

+0

변수 이름'columnName'은 누군가를 혼란스럽게 만들 수 있습니다. 사실 값은'columnName'이 아니며,'Column' 열의'row' 셀의 값입니다. –

+0

@KingKing, 동의 함. 예를 들어 첫 번째 항목을 사용하고있었습니다. 모두 – gunr2171

+0

@ gunr2171까지 확장 해 주셔서 감사합니다. 도움을 주셨습니다. 그것에 관한 또 다른 질문 : 부울일까요? isKey return NULL 어떻게 그것을 false로 변환 할 수 있습니까? 문서에 따르면 isKey 값이 True 또는 False를 반환하므로 NULL을 반환 할 때 놀랐습니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx – eetawil

관련 문제