0

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

首先,我正在建立与数据库的连接并在列表对象中查找表列表。然后遍历表列表并找到每个表的记录数。数据库中大约有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_”开头的表会附加错误。

4

3 回答 3

0

据我所知,“黑名单”不是 MySQL 中的保留关键字。但是,您不能将表名作为参数传递。有关详细信息,请参阅此问题。您必须求助于字符串连接:

    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()了,因为没有参数它是无用的,并且可能会弄乱查询的文本。

于 2019-05-13T13:45:50.490 回答
0

我知道的不多,但你不能使用这样的字符串:

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

然后

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

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

于 2019-05-13T13:03:06.837 回答
0

终于bug出来了……黑名单这个词前后都隐藏了一个不可见的字符。我还没有修复它并运行我的代码。但我很确定这是问题所在。以下是过去 2 天困扰我的 char。两个双引号之间的字符是罪魁祸首。

U+200B    Zero-Width Space       ​      "​"
于 2019-05-14T14:56:37.387 回答