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.”等。 列名是什么,strings 是否正确传递? 啊。这是我必须使用“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 [重复]

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

MySQL Workbench(版本 6.0.8)SSH 身份验证问题