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

Posted

技术标签:

【中文标题】无法从数据库中获取列类型【英文标题】:Can't get column types from database 【发布时间】:2012-04-10 03:02:28 【问题描述】:

这里有一些代码:

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”等查询。

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

这是我得到的错误:

无法将“System.DBNull”类型的对象转换为“System.String”类型。

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

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

谢谢,这正是我所需要的。不过,mgnoonan 打败了你 :)

以上是关于无法从数据库中获取列类型的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pymssql 获取列数据类型?

从 pyspark 中的数据框数组类型列中获取“名称”元素

无法在python数据框中将列类型从对象转换为str

如何在不知道列类型的情况下获取列的值

如何从以正确列类型传递的 SQL 服务器获取数据

Android:无法从CursorWindow读取第0行,第3列。在从中访问数据之前,请确保正确初始化Cursor