2013-10-26 3 views
1

Я использую VS 2008 с SQL Server 2005 и SQL Framework Compact Server, 3,5Передача данных между SQL Server и SQL Server Compact

  • У меня есть мобильные устройства (у них есть окно Ce 6.0 ОС).
  • Я установил свою программу на устройства windows ce
  • Я использую базу данных .sdf в устройстве.

  • .SDF и .MDF схемы базы данных являются одни и те же

Рабочие используют эти устройства из компании и сохранить данные.

Когда они приходят в компанию, я должен сохранить данные из своих .sdf файлов в экземпляр SQL Server.

Я делаю это так:

public void TransferData() 
{ 
    SqlCeCommand tempcecommand=new SqlCeCommand("select * from Customer",SDFConnection); 
    SqlCeDataReader tempcereader=tempcecommand.ExecuteReader(); 

    SqlCommand tempmscommad=new SqlCommand("",MDFConnection); 

    while(tempcereader.Read()) 
    { 
     tempcommandtext = String.Format("insert into Customer (Column1,Column2) values  ('{0}','{1}')",tempcereader["Column1"],tempcereader["Column2"] ; 

     tempmscommand.CommandText = tempmscommand; 
     tempmscommand.ExecuteNonQuery(); 
    } 
} 

Есть ли более простой способ передачи данных из файла .sdf в экземпляр SQL Server?

ответ

2

Первый подход может быть

string cmdText = "INSERT INTO CUSTOMER (Column1, Column2) VALUES (@col1, @col2)" 
SqlCommand tempmscommad=new SqlCommand(cmdText,MDFConnection); 
tempmscommad.Parameters.AddWithValue("@col1", ""); 
tempmscommad.Parameters.AddWithValue("@col1", ""); 
while(tempcereader.Read()) 
{ 
    tempmscommad.Parameters["col1"].Value = tempcereader["Column1"].ToString(); 
    tempmscommad.Parameters["col2"].Value = tempcereader["Column2"].ToString(); 
    tempmscommand.ExecuteNonQuery(); 
} 

Это будет еще перебирает данные CE, но удалить строку форматирования внутри цикла и использовать более безопасный параметризованный запрос. Однако для этого потребуется выполнить команду для каждой записи.

Если вы АБСОЛЮТНО уверены, что ваши ценности не могут быть подделаны вашим пользователем при ввозе, то можно воспользоваться возможностями multiinsert в Sql Вставка

ЗНАТЬ - Этот путь не рекомендуется, потому что он использует конкатенацию строк, очень опасную практику при работе с командами базы данных.
Вы должны быть уверены, что ваш input values are SANITIZED

StringBuilder cmdText = new StringBuilder("INSERT INTO CUSTOMER (Column1, Column2) VALUES "); 
while(tempcereader.Read()) 
{ 
    cmdText.AppendFormat("('{0}', '{1}'),", 
      tempcereader["Column1"].ToString(), 
      tempcereader["Column2"].ToString()) 
} 
// remove the last comma 
cmdText.Length -= 1; 

// Just execute one single command 
SqlCommand tempmscommad=new SqlCommand(cmdText.ToString(),MDFConnection); 
tempmscommad.ExecuteNonQuery(); 

Наконец, THE BEST OPTION должны использовать класс SqlBulkCopy. У меня нет способа проверить это, потому что у меня нет SQLCE данные доступны, но, давая тот факт, что метод WriteToServer принимает экземпляр IDataReader я полагаю, что он должен работать также с SqlCeDataReader

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(MDFConnection)) 
{ 
    bulkCopy.DestinationTableName = "CUSTOMER"; 
    bulkCopy.WriteToServer(tempcereader); 
} 

Пожалуйста, проверьте это ...

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