无法从数据库中获取列类型

时间:2012-04-10 03:02:29

标签: c# mysql database visual-studio odbc

以下是一些代码:

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,something_else)FROM some_table”等查询。

然而,当我使用“显示来自some_table的列”时,它会失败。

这是我得到的错误:

  

无法将'System.DBNull'类型的对象强制转换为'System.String'。

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

我尝试创建一个if语句,检查myReader.GetString(i)是否为System.DBNull无效。无论我做什么,总是出错。我不明白发生了什么。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

通常,您需要注意可空列的值。 DB通过返回名为null的特殊对象来表示返回值为DBNull。您无法将其转换为string或其他任何内容,因此您的代码应使用IsDBNull检查是否为null:

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