Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MySQL查询正在执行,但在C中未被识别#_C#_Mysql_Visual Studio 2008 - Fatal编程技术网

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

C# MySQL查询正在执行,但在C中未被识别#,c#,mysql,visual-studio-2008,C#,Mysql,Visual Studio 2008,我有一个应用程序,它使用一个类创建一个完整的MySQL数据库供应用程序使用。该类使用单独的方法创建每个表 对话框用于允许创建表,因为在组中创建了用于不同用途的表。每个group create按钮的底层代码依次执行上述类中的表创建方法 每个表创建方法使用两个查询。首先是 如果存在表名,则删除表 第二个查询是表定义创建表 如果数据库为空,则所有表都将成功创建 如果表存在,并且我正在从头开始重新创建表,则在尝试重新创建表时会收到一个错误(errno 121)。这很奇怪,因为没有一个被重新创建的表有主键

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

对话框用于允许创建表,因为在组中创建了用于不同用途的表。每个group create按钮的底层代码依次执行上述类中的表创建方法

每个表创建方法使用两个查询。首先是

如果存在表名,则删除表

第二个查询是表定义创建表

如果数据库为空,则所有表都将成功创建

如果表存在,并且我正在从头开始重新创建表,则在尝试重新创建表时会收到一个错误(errno 121)。这很奇怪,因为没有一个被重新创建的表有主键,也没有一个表有外键!我假设errno 121会出现,因为即使它被丢弃,表仍然显示在那里

如果我使用MySQL Workbench手动删除表并再次运行表创建,则一切正常,所有表都再次成功创建

在运行CREATE TABLE查询之前,DROP TABLE查询似乎尚未完成或程序无法看到。删除表最终是成功的,因为当我签入MySQL工作台时,该表不再出现在数据库中

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

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

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

根据下面SH的要求,以下是其中一个表(小表)的代码。连接字符串包含默认目录,因此我不必在查询中显式地包含它。此版本将查询包装到事务中,而原始版本则没有——结果相同。我甚至在黑暗中投下了一颗子弹

    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会报告删除表必须已完成,因为该表不再存在。执行CREATE TABLE时,会生成一个异常:

“无法创建表
casualtyutf8.vCasualtyLookup
(错误号121)”

在Locals窗口中检查ex变量时,显示“base”错误代码为“-2147467259”,MySQL异常“Number”为“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错误,该表已经存在。我不知道还有什么进程可以打开表句柄,除非它是VisualStudio调试器。我关闭了应用程序并关闭了VisualStudio,但这没有起任何作用


希望这有帮助

好的,这个属于暮光区

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

我对新数据库运行了导致一致性问题的代码,一切正常。我可以运行代码重新构建表,但从未收到错误。我还可以运行“更新”对话框,该对话框可以更改选定的表以添加新列,而不会出现问题

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

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

这一切都是现在工作,我感谢SH的意见和建议

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

从评论中整理信息

问题:未正确删除表。删除似乎由于未知原因而被推迟

Troubleshooting Methods used:
Use new MySQL Command in code -> No Change.
Break After First Drop command -> No Change
Check Mysql Logs after first Command -> Locate Error and code.
Verfiy there is no async commands lingering in code -> No Change.
Recreate Error on clean Mysql Db. -> Unrepeatable
解决方案:重新创建完整模式。错误可能是由某种MySql迁移引起的

OP:Info

很明显,的模式定义存在一些问题 由于许多表出现问题,因此无法恢复原始数据库。当我 在构建Windows 8系统时,我从旧Windows迁移了模式 7使用PhpMyAdmin导出并将其加载到Windows 8的环境 使用MySQL工作台。MysQL服务器版本在Windows 8上相同 以及视窗7。也许是遗漏了什么,或者是一些问题 在导出和导入之间进行排序。我永远不会知道


如果您的MySQL服务器是作为Windows服务运行的,那么禁用它并从控制台运行MySQL服务器守护程序可能会有所帮助

我小时候有个案子