0

編集しやすいように、コマンドを複数の行に分割します。

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そこから実行すると、問題はまったく報告されません。

コマンド like"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;
}
4

1 に答える 1

1

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;

}

これは良い方法ではありません - 私が言ったように、コマンドが「成功」するかどうかは異なることを意味する可能性があります - しかし、低レベルでは、エラー/例外なしで実行された場合、コマンドは成功です。すでにチェックしています。

于 2012-05-29T11:59:15.810 に答える