2012-06-07 169 views
0

基本上我有一个服务,看看两个表 - 一个驻留在远程服务器上,另一个驻留在本地。我正在尝试编写一个程序,用于从远程服务器中选择所需的文件并将其复制到本地。我能得到这个工作的标准记录,但我该如何处理C#中的BLOB - 我刚开始出来的语言,所以要温柔将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中做到这一点,所以即时猜测有一个类似的解决方案。

任何帮助赞赏:)

+0

歉意 - 没有在网站上一段时间 - 更新:) – JazziJeff

回答

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; 

问号将在订单中的参数来代替指定他们,所以你应该添加的类型,那么文件名,然后数据,在该订单。

现在,您指定的值也应该对应于您要插入的字段的类型。因此,而不是字符串,字符串,字符串,您可能希望您的变量的类型为字符串,字符串,字节[]。

有大约一百万个原因不会动态构建您的查询,所以我建议您研究如何在您的OdbcCommand上使用Parameters集合。开始here

UPDATE

一般来说,你可以简单地通过使用索引[]得到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+ 

无论采用哪种方式,您都可以使用参数化查询来填充变量,如上所述。

+0

酷病看看这似乎挺直接 - 这不过处理建筑查询,如何处理查询结果中返回的blob字段? – JazziJeff

+0

啊,对,我正专注于手术的第二部分。更新我的答案... –

+0

多米尼克 - 绝对梦幻般的答案:)真的涵盖了一切谢谢!太棒了,这个网站上有像你这样的人!再次感谢 – JazziJeff

相关问题