C# c报告mysql命令失败,即使它没有

C# c报告mysql命令失败,即使它没有,c#,mysql,C#,Mysql,为了便于编辑,我将命令拆分为几行: 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 += "CREA

为了便于编辑,我将命令拆分为几行:

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的命令不会报告失败。那么为什么CREATETABLE命令会这样做呢

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以外的任何内容。因此,您的命令方法将始终认为命令失败。ExecuteOnQuery将返回受语句影响的行,该行为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;
}


这不是一个很好的方法——正如我所说的,一个命令是否成功可能意味着不同的事情——但在较低的级别上,如果一个命令在没有任何错误/异常的情况下运行,那么它就是成功的,您已经检查过了。

不知道这一点;O我有没有办法检查任何命令是否成功/失败?没有,因为它是否成功取决于命令是什么。例如,如果update命令更新了您期望的行数,则该命令是成功的;但是,如果该表现在如您所期望的那样存在,则CREATETABLE命令是成功的。然而,若您传递到命令中的SQL无效,那个么它将抛出SQLException。因此,通过确保没有引发异常,您可以确定命令是否实际执行时没有错误,但它是否以您期望的方式成功执行取决于您。我编辑了我的答案。考虑一下,您可以传入希望它影响的行数,并基于此更改返回值。简单的回答是,我将坚持您已经在做的事情,但在使用特殊命令(如DROP TABLE和CREATE TABLE)时,只需更改您的成功检查。