クラスを使用して、アプリケーションで使用する完全な MySQL データベースを作成するアプリケーションがあります。クラスは、各テーブルを作成するために個別のメソッドを使用します。
グループで作成されるさまざまな用途のテーブルがあるため、ダイアログを使用してテーブルを作成できます。各グループ作成ボタンの基礎となるコードは、上記のクラスのテーブル作成メソッドを連続して実行します。
各テーブル作成方法では、2 つのクエリを使用します。最初は
DROP TABLE IF EXISTS テーブル名
2 番目のクエリは、テーブル定義の CREATE TABLE ...
データベースが空の場合、テーブルはすべて正常に作成されています。
テーブルが存在し、テーブルを最初から再作成している場合、テーブルを再作成しようとするとエラー (errno 121) が表示されます。再作成されるテーブルには PRIMARY KEY がなく、どれも外部キーがないため、これは興味深いことです。テーブルが削除されたにもかかわらず、テーブルがまだそこにあるように見えるため、errno 121 が表示されると想定しています。
MySQL Workbench を使用してテーブルを手動で削除し、テーブルの作成を再度実行すると、すべて問題なく、すべてのテーブルが再び正常に作成されます。
CREATE TABLE クエリが実行される前に、DROP TABLE クエリが完了していないか、プログラムから認識されていないように見えます。MySQL Workbench をチェックインすると、テーブルがデータベースに表示されなくなったため、DROP TABLE は最終的に成功します。
同じ MySQL コマンド オブジェクトを使用して、両方のクエリを実行します。DROP TABLE クエリの実行後、CREATE TABLE クエリの CommandText プロパティを変更します。また、別のMySQL接続オブジェクトを持つ別のMySQLコマンドオブジェクトでこれを試しましたが、同じ結果が得られました。
DROP TABLE クエリが CREATE TABLE クエリの前に完了または認識されない理由は何ですか?
C# の Visual Studio 2008 で MySQL Connector/NET 6.5.4 を使用して、Windows 8 で MySQL 5.1.39 を実行しています (Windows 7 でも同じ結果)。
以下の SH のリクエストに応じて、テーブルの 1 つ (小さいテーブル) のコードを次に示します。接続文字列には既定のカタログが含まれているため、クエリに明示的に含める必要はありません。このバージョンではクエリがトランザクションにラップされますが、元のバージョンではそうではありませんでした。結果は同じです。私は暗闇でのショットとして DoEvents を投入しました。
public void CreateViewTableCasualtyLookup()
{
// Declare local variables.
string strSQL = string.Empty;
string strMsg = string.Empty;
string strNewDBName = string.Empty;
MySqlConnection cnNewTable = new MySqlConnection();
MySqlCommand cmdNewTable = new MySqlCommand();
MySqlTransaction tranNewTable = null;
StringBuilder sbSQL = new StringBuilder();
try
{
// Create a connection.
cnNewTable.ConnectionString = m_strServerConnect;
cnNewTable.Open();
cmdNewTable.Connection = cnNewTable;
tranNewTable = cnNewTable.BeginTransaction();
// First we need to drop the exising table.
strSQL = "DROP TABLE IF EXISTS vCasualtyLookup";
cmdNewTable.CommandText = strSQL;
cmdNewTable.ExecuteNonQuery();
tranNewTable.Commit();
Application.DoEvents();
// Create the new table.
tranNewTable = cnNewTable.BeginTransaction();
sbSQL.AppendLine("CREATE TABLE vCasualtyLookup (");
sbSQL.AppendLine("CasualtyID char(10), ");
sbSQL.AppendLine("LookupName varchar(100)) ");
// sbSQL.AppendLine("PRIMARY KEY (LookupName))");
sbSQL.AppendLine(" ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
cmdNewTable.CommandText = sbSQL.ToString();
cmdNewTable.ExecuteNonQuery();
tranNewTable.Commit();
Application.DoEvents();
}
catch (Exception ex)
{
tranNewTable.Rollback();
strMsg = "Application Error:\r\n";
strMsg += "An error occurred while trying to create the view table vCasualtyLookup. ";
strMsg += "The full text of the error is shown below:\r\n\r\n";
strMsg += ex.Message;
throw new ApplicationException(strMsg);
}
finally
{
// Clear objects from memory.
if (tranNewTable != null)
{
tranNewTable.Dispose();
}
if (cmdNewTable != null)
{
cmdNewTable.Dispose();
}
if (cnNewTable != null)
{
if (cnNewTable.State == System.Data.ConnectionState.Open)
{
cnNewTable.Close();
}
cnNewTable.Dispose();
}
if (sbSQL != null)
{
sbSQL = null;
}
}
} // end CreateViewTableCasualtyLookup
これと他のテーブルのメソッドが実行されると、MySQL Workbench は、テーブルがもう存在しないため、DROP TABLE が完了したに違いないと報告します。CREATE TABLE が実行されると、例外が生成されます。
「テーブルを作成できませんcasualtyutf8.vCasualtyLookup
(errno 121)」
[ローカル] ウィンドウで ex 変数を調べると、「ベース」エラー コードが「-2147467259」であり、MySQL 例外「番号」が「1005」であることが示されます。
MySQL エラー ログ ファイルを確認したところ、次のように表示されました。
InnoDB: Warning: MySQL is trying to drop table `casualtyutf8`.`vcasualtyassignnarratives`
InnoDB: though there are still open handles to it.
InnoDB: Adding the table to the background drop queue.
次のエントリは、テーブルが既に存在するという INNODB エラーです。Visual Studioデバッガーでない限り、テーブルへのハンドルを開くことができる他のプロセスはわかりません。アプリを閉じて Visual Studio を閉じましたが、何もしませんでした。
お役に立てれば!