2012-04-10 5 views
2

から列タイプを取得できませんいくつかのコードです:がここデータベース

OdbcConnection connection = new OdbcConnection(@"DRIVER={MySQL ODBC 5.1 Driver};SERVER=" + ip + ";DATABASE=db_name;USER=user;PASSWORD=" + dbPw + ";"); 
connection.Open(); 

string queryString = query; 
OdbcCommand command = new OdbcCommand(queryString); 

command.Connection = connection; 
OdbcDataReader myReader = command.ExecuteReader(); 
int fieldsN = myReader.FieldCount; 

StringBuilder sb = new StringBuilder(); 

while (myReader.Read()) 
{ 
    for (int i = 0; i < fieldsN; i++) 
    { 
     sb.Append(myReader.GetString(i) + " "); 
    } 
    sb.Append(", "); 
} 

connection.Close(); 

//Console.WriteLine(sb.ToString()); 

このコードは、 "some_table SELECT * FROM" などのクエリで正常に動作します "some_table FROM(何か、something_else)を選択します。"

ただし、 "SHOW COLUMNS FROM some_table"を使用すると失敗します。

は、ここで私は取得エラーです:

型のオブジェクトをキャストできません「System.DBNull」「可能System.String」を入力します。

このエラーは、myReader.GetString()行のどこかで発生します。

myReader.GetString(i)がSystem.DBNullでないかどうかを確認するif文を作成しようとしました。私が何をしても、いつもエラーが出ます。私は何が起こっているのか分からない。

ありがとうございました!

答えて

2

GetString()を呼び出す前にDBNullをチェックする必要があります。 See this answer.

if (!myReader.IsDBNull(i)) 
    sb.Append(myReader.GetString(i)); 
+0

私は感謝、まさに必要。 –

1

一般に、null可能な列の値に注意する必要があります。 DBは、戻り値がnullであることを、DBNullという特別なオブジェクトを返すことによって通知します。あなたのコードは次のようIsDBNullを使用してnullをチェックする必要がありますので、あなたは、stringまたは何か他のものにキャストすることはできません。

if (!myReader.IsDBNull(i)) { 
    sb.Append(myReader.GetString(i) + " "); 
} 
+0

ありがとう、それは私が必要としたものです。 mgnoonanそれにもかかわらず:) –

関連する問題