3

所以这是我的代码,我真的不知道为什么它可以在其他程序中工作,这个代码是标准的!

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;
        }
    }
}

它给了我以下错误,我已经尝试了很多开始和连接的置换,但没有任何 goog 结果。

代码编辑:

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;
                }
            }
        }
4

3 回答 3

3

这段代码:

OdbcCommand DbCommand1 = DbConnection.CreateCommand();
OdbcCommand DbCommand2 = DbConnection.CreateCommand();

... 在同一连接上创建两个命令,并尝试同时使用它们(使用一个命令插入,同时从另一个命令读取)。我怀疑如果你创建了两个连接,你会更成功。

此外:

  • 不要通过字符串操作在 SQL 语句中包含值。请改用参数化 SQL,否则您很容易受到SQL 注入攻击、转换问题和脆弱代码的攻击。
  • 使用using语句自动关闭连接、命令和阅读器,无论成功或失败
  • 当您发现异常时,继续前进几乎不是一个好主意。例如,如果您无法打开连接,您仍然会尝试从数据库中读取。那只是自找麻烦。
  • 通常 C# 中的局部变量是 camelCased 而不是 PascalCased。遵循语言的常规约定是一个好主意,以帮助其他将阅读您的代码的人。
于 2013-05-17T08:23:47.077 回答
1

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

OdbcDataReader DbReader = DbCommand1.ExecuteReader();

然后,当阅读器仍然打开时,在第 30 行,您在同一连接上执行另一个命令:

DbCommand2.ExecuteNonQuery();

你不能这样做;在给定的连接上一次只能执行一个命令。虽然该阅读器已打开,但您无法在连接上执行任何其他操作。您必须先关闭阅读器,考虑到您的情况,这意味着您将不得不从阅读器中复制所需的所有数据,关闭阅读器,然后开始循环并发出后续命令。

于 2013-05-17T08:28:11.250 回答
0

每个命令对象都应该被显式处理。

我在不同的场景中遇到了这个错误。我一次只执行一个命令,但仍然让这个连接很忙MARS_Connection=yes没有解决问题。在分析MS SQL Server Profiler中的跟踪后,我发现准备好的语句在使用后没有立即发布。消息在exec sp_unprepare一段时间后出现。然后我对我的程序进行了更改,并OdbcCommand在使用后直接处理(Dispose())。之后我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_Connection标志。

于 2017-09-25T20:16:41.950 回答