表名无法解析为特定的表名

时间:2019-05-13 12:49:48

标签: c# mysql database keyword reserved

我的任务是,我正在尝试连接到mysql DB并查找表的记录计数。

首先,我要连接到数据库并在列表对象中找到表的列表。然后遍历表列表并找到每个表的记录计数。数据库中大约有80个表,其中4到5个表的名称以“ blacklist_”开头。

除了以“ blacklist_”开头的表名以外,其他表的记录计数均已正确返回。出现以下错误。

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以使用正确的语法   在第1行的“?blacklist?_card”附近

我尝试了各种方法来传递表名。.以@,?开头。等等。我怀疑这是否已被识别为关键字/保留字,因为我看到一个“?”我在整个表名称“ blacklist_card”传递时,在此字词的两侧都有符号。

是否有可能与某些REGEX模式匹配。 ?因为我看到了吗?黑名单一词两侧的符号,这不是我通过的。

当我在VS 2017中进行调试时,表名在表列表中显示正确。仅当我使用该名称查询表时,才会发生问题。

foreach (string table in tableList)
{
        using (DC1con)
        {
            if (DC1con.State != ConnectionState.Open)
            {
                DC1con.Open();
            }
            // MySqlCommand DC1cmd = new MySqlCommand("select count(1) from `" + table + "`;", DC1con);
            MySqlCommand DC1cmd = new MySqlCommand("select count(1) from '@table_name'", DC1con);
            DC1cmd.Prepare();
            DC1cmd.Parameters.AddWithValue("@table_name", table);
            DC1cmd.Parameters["@table_name"].Value = table;
            DC1cmd.CommandTimeout = 20000;
            MessageBox.Show(DC1cmd.CommandText.ToString());
            int DC1Count = Convert.ToInt32(DC1cmd.ExecuteScalar());
            DC1con.Close();
            DC1con.Dispose();
        }
}

期望是必须返回所有表记录计数。但是,如果附件名称以“ blacklist_”开头的表出现错误,则该错误。

3 个答案:

答案 0 :(得分:0)

我不太了解,但是您不能使用像这样的字符串吗:

String query = "select count(1) from ?";
MySqlCommand DC1cmd = new MySqlCommand(query, DC1con);

然后

DC1cmd.Parameter(1,'@table_name');

还是类似的东西?抱歉,我帮不上什么忙。

答案 1 :(得分:0)

据我所知,“黑名单”不是MySQL中的保留关键字。 但是,您不能将表名作为参数传递。有关更多信息,请参见this question。您必须诉诸字符串串联:

    MySqlCommand DC1cmd = new MySqlCommand("select count(1) from `" + table + "`;", DC1con);
    DC1cmd.CommandTimeout = 20000;
    MessageBox.Show(DC1cmd.CommandText.ToString());
    int DC1Count = Convert.ToInt32(DC1cmd.ExecuteScalar());
    DC1con.Close();
    DC1con.Dispose();

我也删除了Prepare(),因为它没有参数就没有用,并且可能会弄乱查询的文本。

答案 2 :(得分:0)

最后,错误出现了……在黑名单之前和之后隐藏了一个不可见的字符。我还没有修复它并运行我的代码。但是我很确定这是问题所在。下面是过去两天困扰我的字符。两个双引号之间的字符是罪魁祸首。

U+200B    Zero-Width Space       ​      "​"