C# MySQL查询正在执行,但在C中未被识别#
我有一个应用程序,它使用一个类创建一个完整的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的要求,以下是其中一个表(小表)的代码。连接字符串包含默认目录,因此我不必在查询中显式地包含它。此版本将查询包装到事务中,而原始版本则没有——结果相同。我甚至在黑暗中投下了一颗子弹C# MySQL查询正在执行,但在C中未被识别#,c#,mysql,visual-studio-2008,C#,Mysql,Visual Studio 2008,我有一个应用程序,它使用一个类创建一个完整的MySQL数据库供应用程序使用。该类使用单独的方法创建每个表 对话框用于允许创建表,因为在组中创建了用于不同用途的表。每个group create按钮的底层代码依次执行上述类中的表创建方法 每个表创建方法使用两个查询。首先是 如果存在表名,则删除表 第二个查询是表定义创建表 如果数据库为空,则所有表都将成功创建 如果表存在,并且我正在从头开始重新创建表,则在尝试重新创建表时会收到一个错误(errno 121)。这很奇怪,因为没有一个被重新创建的表有主键
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服务器守护程序可能会有所帮助 我小时候有个案子