【问题标题】:MySQL query works in Workbench but not in C# codeMySQL 查询适用于 Workbench,但不适用于 C# 代码
【发布时间】: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”的地方吗?
  • 如果您希望它们按照数组中的方式命名,是的,您需要为列命名。

标签: c# mysql sql mysql-workbench


【解决方案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”前缀
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多