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();

... 同じ接続で 2 つのコマンドを作成し、それらを同時に使用しようとします (1 つのコマンドを使用して挿入し、もう 1 つのコマンドから読み取ります)。2 つの接続を作成した方が成功すると思います。

さらに:

  • 文字列操作によって SQL ステートメントに値を含めないでください代わりにパラメーター化された SQL を使用してください。そうしないと、SQL インジェクション攻撃、変換の問題、脆弱なコードに対して脆弱になります。
  • usingステートメントを使用して、成功または失敗に関係なく、接続、コマンド、およびリーダーを自動的に閉じる
  • 例外をキャッチした場合、そのまま続行するのが良い考えであることはめったにありません。たとえば、接続を開くことができなかった場合でも、データベースから読み取ろうとします。それはただトラブルを求めているだけです。
  • 通常、C# のローカル変数は PascalCased ではなく camelCased です。コードを読む他の人を助けるために、言語の通常の規則に従うことをお勧めします。
于 2013-05-17T08:23:47.077 に答える
1

投稿したものの 18 行目で、接続に対してコマンドを実行します。

OdbcDataReader DbReader = DbCommand1.ExecuteReader();

次に、そのリーダーがまだ開いている間に、30 行目で同じ接続に対して別のコマンドを実行します。

DbCommand2.ExecuteNonQuery();

これはできません。特定の接続で一度に実行できるコマンドは 1 つだけです。そのリーダーが開いている間は、接続に対して他に何もできません。最初にリーダーを閉じる必要があります。これは、シナリオを考えると、必要なすべてのデータをリーダーからコピーし、リーダーを閉じてから、ループを開始して後続のコマンドを発行する必要があることを意味します。

于 2013-05-17T08:28:11.250 に答える