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 += "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;

}

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

关于c# 报告 mysql 命令失败,即使它没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798536/

相关文章:

mysql - 有没有办法在 mysql 中创建 DATETIME 列,默认为 UTC 中的当前时间戳?

mysql - 如何在 MySQL 中减去具有多行的 2 个查询

python - sqlalchemy 1.3 python 插入忽略 mysql

c# - 在 RavenDB 中存储/检索动态数据

c# - 如何从 LDAP 路径字符串中提取项目

c# - double 类型的问题与区域设置有关

c# - 是否有内置的方法来识别类的实例?

php - 通过 cake-php 从 db 获取不同的值

php - 是否可以登录数据库而不是整个域?

c# - 如何使用 DirectShow 过滤器将图像序列转换为视频?