0

基本的に私は2つのテーブルを調べるサービスを持っています-1つはリモートサーバーにあり、もう1つはローカルにあります。リモートサーバーから必要なファイルを選択してローカルにコピーするプログラムを作成しようとしています。私はこれを標準のレコードで機能させることができますが、C#でblobを処理するにはどうすればよいですか?私は言語を始めたばかりなので、穏やかにしてください

私が持っているものの抜粋は以下にあります

public static void BroadcastCheck(String ip_addr)
    {
        OdbcConnection local = new OdbcConnection("DSN=local");
        OdbcConnection cloud = new OdbcConnection("DSN=cloud");
        local.Open();
        cloud.Open();
        OdbcCommand update1 = new OdbcCommand("UPDATE exchange set status = '1' where `status`='0' and inp_date=chg_date and LEFT(filename,12)='" + ip_addr + "' and type='UPDATE'", cloud);
        update1.ExecuteNonQuery();
        OdbcCommand broadcastSelect = new OdbcCommand("select * from exchange where inp_date=chg_date and LEFT(filename,12)='" + ip_addr + "' and status='1' and type='UPDATE'", cloud);
        OdbcDataReader DbReader = broadcastSelect.ExecuteReader();
        int fCount = DbReader.FieldCount;
        byte[] outByte = new byte[500]; 
        while (DbReader.Read())
        {
           String type = DbReader.GetString(0);
           String filename = DbReader.GetString(1);
           String data = DbReader.GetBytes(1);
           OdbcCommand broadcastCopy = new OdbcCommand("INSERT INTO exchange(type,filename) VALUES('"+type+"','"+filename+"'"+data+")", local);
           broadcastCopy.ExecuteNonQuery();


        }
        itouchcloud.Close();
        itouchlocal.Close();
        Console.Write("Broadcast Check Completed \n");

    }

基本的に、クラウドデータベースが照会され、複数の結果が返される場合があります。返された各レコードを処理して、ローカルDBにコピーします。私は周りを見回しましたが、本当にまともな解決策を得ることができないようです。これはVisual FoxPro 9で簡単に行うことができるので、同様の解決策があると思います。

助けていただければ幸いです:)

4

1 に答える 1

1

答えの最初の部分は、可能であれば動的SQLを避けることです。「...VALUES(?、?、?)」を使用する必要がある場合は、「... VALUES('" + type +"'、'" + filename +"' "+ data +")」を使用しています。

次に、たとえば、を使用してパラメータを追加します。

// sample: the name of the parameter (here @Type) can be anything, and the type and length should match your schema.
broadcastCommand.Parameters.Add("@Type", OleDbType.VarChar, 10).Value = type; 

疑問符は、指定した順序でパラメーターに置き換えられるため、タイプ、ファイル名、データの順に追加する必要があります。

これで、指定する値は、挿入するフィールドのタイプにも対応している必要があります。したがって、String、String、Stringの代わりに、変数をString、String、byte[]型にすることができます。

クエリを動的に作成しない理由は約100万あります。そのため、OdbcCommandでParametersコレクションを使用する方法を検討することをお勧めします。ここから始めてください。

アップデート

DataReader一般に、メソッドを実行しなくても、インデクサー[]を使用するだけで値を取得できますGetXXX()。バイト配列の場合、事前に長さを知ったり推測したりする必要がないため、通常は簡単です。

次のように、インデクサーを使用するようにコードを変換できます。

String type = (string)DbReader[0];
String filename = (string)DbReader[1];
byte[] data = (byte[])DbReader[2];

呼び出しには元々1が含まれていたことに注意してください。ただしGetBytes()、ファイル名フィールドのバイトを取得しようとしていないと思います。したがって、byte[]データが別のフィールドにある場合は、代わりにそれを使用してください。ただし、文字列フィールド名も同じように簡単に使用できることに注意してください(次にコードを読む必要があるときに、より明確になる可能性があります)。

String type = (string)DbReader["type"]; // replace with whatever your fields are actually called
String filename = (string)DbReader["filename"];
byte[] data = (byte[])DbReader["data"];

オフチャンスでは、実際にはデータベースにないためfilenamedata両方が同じフィールドを使用し、data代わりにファイル名を取得して、挿入クエリのデータとしてそのファイルシステムオブジェクトを読み込みたい場合は、を使用する必要があります。別の方法。

byte[] data = System.IO.File.ReadAllBytes(filename); // requires .NET 2.0+

どちらの方法でも変数を入力する場合は、上記で説明したようにパラメーター化されたクエリを使用して変数を挿入します。

于 2012-06-07T15:26:52.637 に答える