0

基本上我有一个服务,它查看两个表 - 一个位于远程服务器上,另一个位于本地。我正在尝试编写一个程序,该程序将从远程服务器中选择任何所需的文件并将它们复制到本地。我可以让它适用于标准记录,但我如何处理 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");

    }

基本上查询云数据库并可能返回多个结果,我想处理返回的每条记录并将其复制到本地数据库。我环顾四周,似乎无法真正得到一个像样的解决方案,我可以在 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、byte[],而不是 String、String、String。

大约有一百万个不动态构建查询的理由,所以我建议研究如何在 OdbcCommand 上使用参数集合。从这里开始。

更新

一般来说,您可以DataReader简单地使用索引器 [] 来获取值,而无需通过GetXXX()方法。对于字节数组,这通常更简单,因为您不需要事先知道或尝试猜测长度。

您可以通过这种方式将代码转换为使用索引器:

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

请注意,您的GetBytes()呼叫最初有一个 1 ,但我假设您没有尝试获取文件名字段的字节。因此,如果您的byte[]数据在另一个字段中,请改用它。但是请注意,您也可以轻松地使用字符串字段名称(下次需要阅读代码时可能会更清楚):

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

如果您有机会filename并且data两者都使用相同的字段,因为data实际上不在数据库中,而是您想要获取文件名并将该文件系统对象作为插入查询的数据读取,您需要使用不同的方法。

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

无论采用哪种方式填充变量,都应使用参数化查询将它们插入,如上所述。

于 2012-06-07T15:26:52.637 回答