1

SQL Server 2005 および SQL Server Compact Framework 3.5 で VS 2008 を使用しています

  • 私はモバイル デバイスを持っています (それらは Window Ce 6.0 os を持っています)。
  • プログラムを 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 インスタンスにデータを転送する簡単な方法はありますか?

4

1 に答える 1

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 データをループしますが、ループ内の文字列の書式設定を削除し、より安全なパラメーター化されたクエリを使用します。ただし、これには、挿入するレコードごとにコマンドを実行する必要があります。

インポート時にユーザーが値を改ざんできないことが絶対に確実な場合は、Sql Insert の複数挿入機能を利用することができます。

注意- この方法は、データベース コマンドを処理する際に非常に危険な方法である文字列連結を使用するため、実際にはお勧めできません。入力値がサニタイズさ
れていることを確認する必要があります

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);
}

テストしてください....

于 2013-10-26T07:57:59.077 に答える