1

我将 VS 2008 与 SQL Server 2005 和 SQL Server Compact Framework 3.5 一起使用

  • 我有移动设备(他们有 Window 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 实例?

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 回答