c# - MySQL 查询正在执行但在 C# 中未被识别

标签 c# mysql visual-studio-2008

我有一个应用程序,它使用一个类来创建一个完整的 MySQL 数据库以供该应用程序使用。该类使用单独的方法来创建每个表。

对话框用于允许创建表,因为存在分组创建的用于不同用途的表。每个组创建按钮的底层代码都会连续执行上述类中的表创建方法。

每种表创建方法都使用两个查询。第一个是

如果表名存在则删除表

第二个查询是表定义CREATE TABLE ...

如果数据库为空,则表全部创建成功。

如果表存在并且我从头开始重新创建表,则在尝试重新创建表时会收到错误 (errno 121)。这很奇怪,因为重新创建的表都没有主键,也没有外键!我假设 errno 121 出现,因为该表似乎仍然存在,即使它已被删除。

如果我使用 MySQL Workbench 手动删除表并再次运行表创建,一切都会很好,所有表都会再次成功创建。

在运行 CREATE TABLE 查询之前,DROP TABLE 查询似乎尚未完成或对程序不可见。 DROP TABLE 最终成功,因为当我 checkin MySQL Workbench 时该表不再出现在数据库中。

我使用相同的 MySQL 命令对象来运行这两个查询。执行 DROP TABLE 查询后,我更改 CREATE TABLE 查询的 CommandText 属性。我还使用不同的 MySQL 命令对象和不同的 MySQL 连接对象进行了尝试,得到了相同的结果。

知道为什么 DROP TABLE 查询在 CREATE TABLE 查询之前没有完成或识别吗?

我在 Windows 8 上运行 MySQL 5.1.39(在 Windows 7 上结果相同),并在 Visual Studio 2008 中使用 C# 的 MySQL Connector/NET 6.5.4。

根据下面 SH 的要求,这里是其中一个表(一个小表)的代码。连接字符串包含默认目录,因此我不必将其显式包含在查询中。此版本将查询包装在事务中,而原始版本则没有 - 结果相同。我什至将 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,但这没有执行任何操作。

希望这有帮助!

最佳答案

好吧,这个属于暮光之城!

SH 建议我尝试使用一个干净的新数据库。因此,我创建了一个新架构,并创建了数据库中存在的导致问题的所有表、 View 、触发器和例程。然后,我使用旧数据库中完全相同的数据填充新数据库中的所有表。这一切都是通过我的应用程序的功能完成的。

我运行了对新数据库造成一致问题的代码,一切正常。我可以运行代码来重建表,但从未收到错误。我还可以运行更新对话框,该对话框可以毫无问题地更改选定的表以添加新列。

为了完整起见,我删除了原始架构,并以与新测试架构相同的方式从头开始重新创建它以及所有表、 View 、触发器和例程,并将数据从测试表复制回来。一切都再次正常运行,我不能再生成任何错误。

很明显,原数据库的模式定义存在一些问题,因为很多表都出现了问题。当我构建 Windows 8 系统时,我使用 PhpMyAdmin Export 将架构从旧的 Windows 7 环境迁移,并使用 MySQL Workbench 将它们加载到 Windows 8 中。 Windows 8 和 Windows 7 上的 MySQL 服务器版本相同。也许在导出和导入之间存在遗漏或某种故障。我永远不会知道。

现在一切正常,我感谢 SH 的意见和建议。

我会将这个文件与总是导致 BSOD 的 Word 文档放在同一堆中 - 即使对于 Microsoft 也是如此!以及在测试期间导致 BSOD 的 Oracle 数据库,直到我们删除用户 ID 666!以及始终返回错误结果的类,直到我将其完全复制到一个新类,并在其中返回正确的结果!

关于c# - MySQL 查询正在执行但在 C# 中未被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18819573/

相关文章:

c# - 仅在父元素可见时启用 RequiredFieldValidator?

php - 可以更改日期时间本地输入的格式

visual-studio - 为什么 Intellisense 不适用于一个单元测试项目?

c# - 嵌套的 Linq Min() 使 Visual Studio 崩溃

c# - 使用 MediatR 时可以让一个处理程序调用另一个处理程序吗?

c# - (VS2017) 运行选择的代码生成器时出错 : 'Sequence contains no elements'

mysql - SQL 结果长度且搜索时不显示任何内容

php - 子查询顺序

c# - 如何在 Visual Studio 加载项中阻止打开的文件

c# - 设计用于通过TCP与Arduino通信的协议(protocol)