2012-06-07 3 views
0

В основном у меня есть служба, которая смотрит на две таблицы - одна находится на удаленном сервере, а другая локально. Я пытаюсь написать программу, которая выберет любые требуемые файлы с удаленного сервера и скопирует их локально. я могу получить эту работу для стандартных записей, но как я обрабатывать пятно в C# - я просто начать с языка так нежнакопировать данные блоба из одной таблицы в другую в C#

фрагмент того, что у меня есть ниже

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, поэтому я думаю, что есть аналогичное решение.

любая помощь оценила :)

+0

извинения - не было на сайте какое-то время - обновлено :) – JazziJeff

ответ

1

Первая часть ответа заключается в том, избегать динамического SQL, если вы можете. Вы используете «... VALUES (« + »+« »,« + имя файла + »« + данные + »),« когда вы должны использовать «... VALUES (?,?,?)».

Затем добавьте параметры, используя, например,

// 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 [].

Существует около миллиона причин не строить ваши запросы динамически, поэтому я бы рекомендовал изучить вопрос о том, как использовать коллекцию параметров на вашем OdbcCommand. Начало 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

cool ill смотреть на это кажется довольно прямолинейным - это, однако, касается построения запросов, как я обрабатываю поле blob, возвращаемое в результате запроса? – JazziJeff

+0

А, правильно, я сосредоточился на второй половине операции. Обновление моего ответа ... –

+0

Доминик - абсолютно фантастический ответ :) действительно покрыл все спасибо !!! Отлично, что на этом сайте есть такие люди, как ты! еще раз спасибо – JazziJeff

Смежные вопросы