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。遵循语言的常规是一个好主意,以帮助其他人阅读您的代码

在您发布的内容的第18行,您针对您的连接执行一个命令:

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:恐怕我不知道您的评论是什么。