MySQL 查询适用于 Workbench,但不适用于 C# 代码
Posted
技术标签:
【中文标题】MySQL 查询适用于 Workbench,但不适用于 C# 代码【英文标题】:MySQL query works in Workbench but not in C# code 【发布时间】:2020-08-23 03:04:18 【问题描述】:SQL 查询:
SELECT som.id, som.name, som.search_enabled, oc.id, oc.name
FROM option_category oc
INNER JOIN skill_option so
on oc.id=so.option_category_id
INNER JOIN skill_option_master som
on som.id=so.id;
在 Workbench 中工作正常:
但是,在我的 C# 代码中:
List<string> listItems = getMultiColumnListFromDB(
"SELECT som.id, som.name, som.search_enabled, oc.id, oc.name " +
"FROM option_category oc " +
"INNER JOIN skill_option so " +
" on oc.id=so.option_category_id " +
"INNER JOIN skill_option_master som " +
" on som.id=so.id; "
,new string[] "som.id", "som.name", "som.search_enabled", "oc.id", "oc.name" );
...
private List<string> getMultiColumnListFromDB(string query, string[] columnNames)
List<string> result = new List<string>();
mysqlConnection con = new MySqlConnection(dbConnectionString);
MySqlCommand cmd = new MySqlCommand(query, con);
con.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
string strResult = "";
foreach (string columnName in columnNames)
if (reader[columnName] == DBNull.Value)
//If value is NULL, we assume yes/1
strResult = strResult + "1" + ";";
else
strResult = strResult + reader[columnName].ToString() + ";";
result.Add(strResult.TrimEnd(';'));
return result;
...我得到:System.IndexOutOfRangeException: 'Could not find specified column in results: som.id' at Line: if (reader[columnName] == DBNull.Value )
作为测试,我在调试回 Workbench 时从异常窗口复制了查询,它无需任何修改即可工作1。更简单的查询(没有连接)在我的应用程序中工作正常。我很欣赏我的代码不是最优雅的,但我无法克服上面的1。怎么可能?
谢谢
【问题讨论】:
结果中的列名不包含别名(前缀)。即使在您的屏幕截图中,列名也不包含“som.
”等。
列名是什么,string
s 是否正确传递?
啊。这是我必须使用“as”的地方吗?
如果您希望它们按照数组中的方式命名,是的,您需要为列命名。
【参考方案1】:
修改 SQL 查询为列名起别名:
SELECT som.id as 'som.id', som.name as 'som.name', som.search_enabled as 'som.search_enabled', oc.id as 'oc.id', oc.name as 'oc.name'
FROM option_category oc
INNER JOIN skill_option so
on oc.id=so.option_category_id
INNER JOIN skill_option_master som
on som.id=so.id;
【讨论】:
一种更简单的方法是从字符串数组columnNames
中删除“som”前缀以上是关于MySQL 查询适用于 Workbench,但不适用于 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 查询适用于 SELECT 但不适用于 UPDATE 语句
在单个 MySQL 查询中使用多个临时表(适用于 phpMyAdmin,但不适用于 PHP)
MySQL - WHERE 子句中的 NOT IN 查询具有相同的结构,适用于第一个表但不适用于第二个表
查询适用于 phpMyAdmin,但不适用于 Java [重复]