C# 由于C中的其他hstmt导致连接忙#
这是我的密码, 我真的不知道为什么它在其他程序中工作,这个代码是标准的C# 由于C中的其他hstmt导致连接忙#,c#,C#,这是我的密码, 我真的不知道为什么它在其他程序中工作,这个代码是标准的 static void Main(string[] args) { using (OdbcConnection DbConnection = new OdbcConnection("DSN=savior")) { String query = "***"; OdbcCommand DbCommand = DbConnection.CreateCommand();
static void Main(string[] args)
{
using (OdbcConnection DbConnection = new OdbcConnection("DSN=savior"))
{
String query = "***";
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = query;
try
{
OdbcDataReader DbReader = DbCommand.ExecuteReader();
do
{
int fCount = DbReader.FieldCount;
if (fCount > 0)
{
while (DbReader.Read())
{
using (OdbcConnection DbConnect = new OdbcConnection("DSN=savior"))
{
OdbcCommand DbCom = DbConnect.CreateCommand();
query = System.String.Format("***", DbReader.GetInt16(0));
DbCom.CommandText = query;
try
{
DbCom.ExecuteNonQuery();
}
catch (OdbcException ex)
{
Console.WriteLine("Executing the query2 failed.");
Console.WriteLine("The OdbcCommand returned the following message");
Console.WriteLine(ex.Message);
return;
}
}
}
}
else
{
Console.WriteLine("Query affected row(s)");
}
}
while (DbReader.NextResult());
DbReader.Close();
}
catch (OdbcException ex)
{
Console.WriteLine("Executing the query1 failed.");
Console.WriteLine("The OdbcCommand returned the following message");
Console.WriteLine(ex.Message);
return;
}
}
}
它给了我以下的错误,我尝试了这么多的开始和连接的位置,但没有任何错误的结果
代码编辑:
static void Main(string[] args)
{
using (OdbcConnection DbConnection = new OdbcConnection("DSN=savior"))
{
DbConnection.Open();
OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = "select ID from Table where ID not in (select IdDA from Seconde)";
try
{
OdbcDataReader DbReader = DbCommand.ExecuteReader();
do
{
int fCount = DbReader.FieldCount;
if (fCount > 0)
{
while (DbReader.Read())
{
using (OdbcConnection DbConnect = new OdbcConnection("DSN=savior"))
{
DbConnect.Open();
OdbcCommand DbCom = DbConnect.CreateCommand();
DbCom.CommandText = System.String.Format("INSERT into Seconde(IdDA,Validee) values({0},'oui')", DbReader.GetInt16(0));
try
{
DbCom.ExecuteNonQuery();
}
catch (OdbcException ex)
{
Console.WriteLine("Executing the query2 failed.");
Console.WriteLine("The OdbcCommand returned the following message");
Console.WriteLine(ex.Message);
return;
}
}
}
}
else
{
Console.WriteLine("Query affected no row(s)");
}
}
while (DbReader.NextResult());
}
catch (OdbcException ex)
{
Console.WriteLine("Executing the query1 failed.");
Console.WriteLine("The OdbcCommand returned the following message");
Console.WriteLine(ex.Message);
return;
}
}
}
此代码:
OdbcCommand DbCommand1 = DbConnection.CreateCommand();
OdbcCommand DbCommand2 = DbConnection.CreateCommand();
。。。在同一连接上创建两个命令,并尝试同时使用它们(使用一个命令插入,同时从另一个命令读取)。我怀疑如果你建立了两个连接,你会更成功
此外:
- 请不要通过字符串操作在SQL语句中包含值。请改用参数化SQL,否则您将容易受到错误、转换问题和脆弱代码的攻击
- 使用
使用
语句自动关闭连接、命令和读卡器,无论成功与否
- 当你发现一个异常时,坚持下去很少是个好主意。例如,如果无法打开连接,您仍将尝试从数据库中读取。那只是自找麻烦
- 通常C#中的局部变量是camelCased而不是PASCALCASE。遵循语言的常规是一个好主意,以帮助其他人阅读您的代码
OdbcDataReader DbReader = DbCommand1.ExecuteReader();
DbCommand2.ExecuteNonQuery();
然后,当读卡器仍处于打开状态时,在第30行,在同一连接上执行另一个命令:
OdbcDataReader DbReader = DbCommand1.ExecuteReader();
DbCommand2.ExecuteNonQuery();
你不能这样做;给定连接上一次只能执行一个命令。当读卡器打开时,您无法在连接上执行任何其他操作。您必须首先关闭读卡器,根据您的场景,这意味着您必须从读卡器中复制所需的所有数据,关闭读卡器,然后开始循环并发出后续命令。每个命令对象都应该显式地被释放 我在另一个场景中遇到了这个错误。我一次只执行一个命令,但连接仍然很忙。MARS_Connection=yes未解决该问题。在分析MS SQL Server Profiler中的跟踪后,我发现准备好的语句在使用后并没有立即发布。
exec sp_unprepare
消息在一段时间后出现。然后我在程序中做了一个更改,并在使用后直接释放了OdbcCommand
(Dispose()
)。在此之后,我在insert语句之后立即收到了sp_unprepared
消息。我不再看到那些随机错误了
最棘手的事情是试图处理OdbcAdapter
。此代码不起作用:
var daOut = new OdbcDataAdapter("select top 1 * from " + sTableTo, cmdOut);
...
daOut.Dispose(); // Not enough.
这一次:
var cmdOut = new OdbcCommand("select top 1 * from " + sTableTo, m_connOut);
var daOut = new OdbcDataAdapter(cmdOut);
...
daOut.Dispose();
cmdOut.Dispose(); // Oh yeah!
因此,有时需要提取命令对象,以确保显式地处理它。在所有这些事情之后,我甚至可以关闭MARS_连接标志。首先,即使无法打开连接,您也可以继续运行。您也没有告诉我们哪一行失败。我已经编辑了代码(在顶部),但没有任何结果!!我想我已经照你说的做了!?现在,您的代码根本无法打开任何一个连接。您还使现有的答案看起来很奇怪,因为它们引用的代码已不在问题中。(最好在问题中添加额外代码。)您似乎仍然在为SQL使用字符串格式,这仍然是一个非常糟糕的主意。很抱歉,对于ridiculos问题,但我为什么不打开任何连接??我很困惑,我必须在40分钟内完成测试并发送此工作。尝试查找对
DbConnection.Open
和DbConnect.Open
的调用。这些调用当然不在问题的代码中。当我发现异常时,如何关闭此操作???@tp1:恐怕我不知道您的评论是什么。