2012-04-10 46 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()); 

此代码工作正常查询,如 “SELECT * FROM some_table” 或 “SELECT(的东西,something_else)FROM some_table。”

但是,当我使用“SHOW COLUMNS FROM some_table”时它失败。

这是我得到的错误:

无法投类型的对象'System.DBNull为键入“System.String”。

此错误发生在myReader.GetString()行的某处。

我试着创建一个if语句,检查如果myReader.GetString(i)是System.DBNull无济于事。无论我做什么,总会犯错。我不明白发生了什么事。

感谢您的帮助!

回答

2

在调用GetString()之前,您需要检查DBNull。 See this answer.

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

正是我需要的,谢谢。 – 2012-04-10 03:27:27

1

通常,您需要关注可空列的值。 DB通过返回一个称为DBNull的特殊对象来指示返回值为null。你不能将它转换为string或其他任何东西,所以你的代码应该使用IsDBNull这样的检查空:

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

谢谢,这正是我需要的。 mgnoonan击败你,虽然:) – 2012-04-10 03:27:18