我的任务是,我正在尝试连接到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_”开头的表出现错误,则该错误。
答案 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 ​ ""