C# 报告 MySQL 命令失败,即使它没有失败
本文关键字:失败 报告 MySQL 命令 | 更新日期: 2023-09-27 18:35:41
为了便于编辑,我将命令分成几行:
string docommand = "";
docommand += "DROP TABLE IF EXISTS `config`;";
//docommand += "/*!40101 SET @saved_cs_client = @@character_set_client */;";
//docommand += "/*!40101 SET character_set_client = utf8 */;";
docommand += "CREATE TABLE `config` (";
docommand += " `name` varchar(200) NOT NULL,";
docommand += " `value` varchar(200) NOT NULL,";
docommand += " `timestamp` int(11) NOT NULL,";
docommand += " UNIQUE KEY `name` (`name`)";
docommand += ")";
//docommand += " ENGINE=MyISAM DEFAULT CHARSET=latin1";
docommand += ";";
//docommand += "/*!40101 SET character_set_client = @saved_cs_client */;";
mysql_connect connect = new mysql_connect();
MySqlConnection conn = connect.connect(core_config.server, core_config.database, core_config.username, core_config.pass);
bool success = mysql_command.command(docommand, conn);
connect.disconnect();
if (!success)
Console.WriteLine("Command failed : " + docommand);
如您所见,我注释掉了几行,看看它们是否造成了麻烦。没有区别。
输出:
Returning false because resultSet is 0
Command failed : DROP TABLE IF EXISTS `config`;CREATE TABLE `config` ( `name` varchar(200) NOT NULL, `value` varchar(200) NOT NULL, `timestamp` int(11) NOT NULL, UNIQUE KEY `name` (`name`));
但是表已正确创建...当我将完全相同的命令粘贴到phpmyadmin
并从那里运行它时,它没有任何问题。
像 "SELECT * FROM config"
这样的命令不会报告失败。那么为什么 CREATE TABLE 命令会这样做呢?
mysql_command.command() 函数:
public static bool command(string input, MySqlConnection con)
{
try
{
MySqlCommand command = new MySqlCommand(input, con);
var resultSet = command.ExecuteNonQuery();
if (!resultSet.Equals(0))
{
return true;
}
Console.WriteLine("Returning false because resultSet is 0");
return false;
}
catch (Exception ex) { Console.WriteLine("MySQL command error : "+ex.Message); }
Console.WriteLine("Returning false after exception");
return false;
}
DROP TABLE
和 CREATE TABLE 都不会发回 0 以外的任何内容。因此,您的"命令"方法将始终认为命令失败。ExecuteNonQuery() 将返回受语句影响的行,该行将为 0。
你可以做什么,顺便说一下你期望它改变的行数,所以像这样:
public static bool command(string input, MySqlConnection con, int expectedRowsAffected = 0)
{
try
{
MySqlCommand command = new MySqlCommand(input, con);
var resultSet = command.ExecuteNonQuery();
if (resultSet.Equals(expectedRowsAffected))
{
return true;
}
Console.WriteLine(string.Format("Returning false because resultSet isn't {0}", expectedRowsAffected));
return false;
}
catch (Exception ex)
{
Console.WriteLine("MySQL command error : "+ex.Message);
}
Console.WriteLine("Returning false after exception");
return false;
}
这不是一个好方法——正如我所说,一个命令是否"成功"可能意味着不同的事情——但在低层次上,如果一个命令运行而没有任何错误/异常,那么它就是成功的,你已经在检查了。