C# 在c中将blob数据从一个表复制到另一个表

C# 在c中将blob数据从一个表复制到另一个表,c#,mysql,blob,C#,Mysql,Blob,基本上,我有一个服务可以查看两个表——一个位于远程服务器上,另一个位于本地。我试图写一个程序,将选择任何需要的文件从远程服务器和本地复制它们。我可以让它在标准记录中工作,但我如何处理c语言中的blob-我只是刚开始使用这种语言,所以请温柔一点 下面是我的一个片段 public static void BroadcastCheck(String ip_addr) { OdbcConnection local = new OdbcConnection("DSN=local")

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

    }
基本上,云数据库是被查询的,可能会返回多个结果,我想处理返回的每个记录并将其复制到本地数据库。 我环顾四周,似乎不能真正得到一个像样的解决方案,我可以在VisualFoxpro9中简单地做到这一点,所以我猜有一个类似的解决方案


感谢您的帮助:

答案的第一部分是,尽可能避免使用动态SQL。你在用。。。值“+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

不动态构造查询的原因大约有一百万个,因此我建议您研究如何在odbc命令上使用参数集合。开始

更新

通常,只需使用索引器[]即可获得DataReader值,而无需使用GetXXX方法。对于字节数组,这通常更简单,因为您不需要事先知道或猜测长度

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

String type = (string)DbReader[0];
String filename = (string)DbReader[1];
byte[] data = (byte[])DbReader[2];
请注意,您的GetBytes调用最初有一个1,但我假设您没有尝试获取filename字段的字节。因此,如果字节[]数据位于另一个字段中,请使用该字段。但是,请注意,您也可以同样轻松地使用字符串字段名,并且在下次需要阅读代码时可能会更清楚:

String type = (string)DbReader["type"]; // replace with whatever your fields are actually called
String filename = (string)DbReader["filename"];
byte[] data = (byte[])DbReader["data"];
如果文件名和数据都使用同一个字段,因为数据实际上不在数据库中,而您希望获取文件名并读取该文件系统对象作为插入查询的数据,则需要使用不同的方法

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

无论哪种方式,您都可以填充变量,并按照上面的解释使用参数化查询插入它们。

cool我将对此进行一番研究,这似乎很简单-但这涉及到构建查询,如何处理查询结果中返回的blob字段?啊,对了,我将重点放在操作的后半部分。更新我的答案…多米尼克-绝对精彩的答案:真的涵盖了一切谢谢!!!很好,这个网站上有像你这样的人!再次感谢道歉-已有一段时间没有出现在网站上-更新: