使用sql ce在C#中将sdf表从一个数据库复制到另一个数据库

使用sql ce在C#中将sdf表从一个数据库复制到另一个数据库,c#,sql-server-ce,C#,Sql Server Ce,sqlce的新特性。我花了两天时间试图解决这个问题,并在stackoverflow中搜索类似的问题。 如何利用sqlce将表(仅限模式和数据)从一个sdf数据库复制到另一个sdf数据库?我应该寻找哪些sqlce关键术语?任何建议,任何代码,都将不胜感激。您可以使用Visual Studio中的我的SQL Server Compact工具箱(或命令行)从一个sdf文件为架构和表编写脚本,还可以针对另一个sdf文件运行脚本。您可以使用Visual Studio中的我的SQL Server Compa

sqlce的新特性。我花了两天时间试图解决这个问题,并在stackoverflow中搜索类似的问题。
如何利用sqlce将表(仅限模式和数据)从一个sdf数据库复制到另一个sdf数据库?我应该寻找哪些sqlce关键术语?任何建议,任何代码,都将不胜感激。

您可以使用Visual Studio中的我的SQL Server Compact工具箱(或命令行)从一个sdf文件为架构和表编写脚本,还可以针对另一个sdf文件运行脚本。

您可以使用Visual Studio中的我的SQL Server Compact工具箱(或命令行)要从一个sdf文件为架构和表编写脚本,并针对另一个sdf文件运行脚本,我想到的是:需要sql server compact nuget

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlServerCe;

namespace ConsoleApp5 {
  class Program {
    static void Main( string[] args ) {
      string tableName = "ZTVC_MF_S_VALCHA";
      string sourceString = "Data Source = C:\\Users\\David\\source\\repos\\ConsoleApp5\\ConsoleApp5\\bin\\Debug\\XXX.sdf";
      string destString = "Data Source = C:\\Users\\David\\source\\repos\\ConsoleApp5\\ConsoleApp5\\bin\\Debug\\YYY.sdf";

      using ( SqlCeConnection sourceConn = new SqlCeConnection() ) {
        SqlCeCommand sourceCmd = sourceConn.CreateCommand();
        sourceCmd.CommandType = CommandType.Text;
        sourceCmd.Parameters.AddWithValue( "tableName", tableName );
        sourceConn.ConnectionString = sourceString;
        sourceConn.Open();

        using ( SqlCeConnection destConn = new SqlCeConnection() ) {
          destConn.ConnectionString = destString;
          destConn.Open();

          DoesTableExist( tableName, destConn );
          DataTable dt=GetDataFromTable( tableName, sourceConn );
          CopyTableSchema( tableName, dt, destConn );
          FillTableCopy( tableName, dt, destConn );
          DeleteTable( tableName, destConn );
          Console.ReadKey();
        }

      }
    }
    private static void FillTableCopy(  string tabName, DataTable dt, SqlCeConnection destConn) {
        List<string> dTypesList = new List<string>();
        int dTypesListIndexCounter = 0;
        string sqlCmd = "";
        foreach ( DataRow row in dt.Rows ) {
          sqlCmd = "INSERT INTO " + tabName + "(";
          int colHeadCounter = 0;
          int colHeadLast = dt.Columns.Count;
          foreach ( DataColumn colHead in dt.Columns ) {
            string dType = colHead.DataType.ToString().ToLower().Substring( 7 );
            dTypesList.Add( dType );
            if ( ++colHeadCounter == colHeadLast ) {
              sqlCmd += colHead + " ";
            }
            else {
              sqlCmd += colHead + ", ";
            }
          }
          sqlCmd += ") VALUES(";
          //Console.Write( sqlCmd );
          colHeadCounter = 0;
          colHeadLast = row.ItemArray.Length;
          foreach ( var item in row.ItemArray ) {
            var temp = item.ToString();
            if ( temp.Count() == 0 ) {
              if ( ++colHeadCounter == colHeadLast ) {
                sqlCmd += ( "null " );
              }else {
                sqlCmd += ( "null, " );
              }
            }else if ( dTypesList[dTypesListIndexCounter] == "string"
             || dTypesList[dTypesListIndexCounter] == "char"
             || dTypesList[dTypesListIndexCounter] == "datetime"
             || dTypesList[dTypesListIndexCounter] == "single"
             || dTypesList[dTypesListIndexCounter] == "guid" ) {
              if ( ++colHeadCounter == colHeadLast ) {
                sqlCmd += ( "'" + item + "' " );
              }else {
                sqlCmd += ( "'" + item + "', " );
              }
            }else {
              if ( ++colHeadCounter == colHeadLast ) {
                sqlCmd += ( item + " " );
              }else {
                sqlCmd += ( item + ", " );
              }
            }
            dTypesListIndexCounter++;
          }
          sqlCmd += ")";
          //Console.Write( sqlCmd );
          //Console.WriteLine();
          SqlCeCommand cmd = new SqlCeCommand( sqlCmd, destConn );
          cmd.ExecuteNonQuery();
        }
        //Console.WriteLine(cmd);
      Console.WriteLine( "Data copy executed." );
    }
    private static void DeleteTable( string tableName, SqlCeConnection pathConn) {
        string sqlCmd = "DROP TABLE " + tableName;
        SqlCeCommand cmd = new SqlCeCommand( sqlCmd, pathConn );
        cmd.ExecuteNonQuery();
        Console.WriteLine( tableName + " deleted." );
    }
    private static void CopyTableSchema( string tableName, DataTable dt, SqlCeConnection destConn ) {
        string sqlCmd = "Create table " + tableName + "(";
        int colHeadCounter = 0;
        int colHeadLast = dt.Columns.Count;
        /*sqlce supported types: bigint, integer,smallint,tinyint,bit,numeric, money, float, real, datetime,
         * national character, national character varying, ntext, nchar, binary,varbinary, image, uniqueidentifier,
         * identity, rowguidcol, timestamp/rowversion */
        foreach ( DataColumn colHead in dt.Columns ) {
          string dType = colHead.DataType.ToString().ToLower().Substring( 7 );

          ////still needs all type conversions mapped
          if ( dType == "int16" ) {
            dType = "smallint";
          }
          else if ( dType == "int32" ) {
            dType = "int";
          }
          else if ( dType == "int64" ) {
            dType = "bigint";
          }
          else if ( dType == "string" ) {
            dType = "nvarchar(4000)";
          }
          else if ( dType == "boolean" ) {
            dType = "bit";
          }
          else if ( dType == "byte" ) {
            dType = "tinyint";
          }
          else if ( dType == "byte[]" ) {
            dType = "binary";
          }
          else if ( dType == "char" ) {
            dType = "nchar";
          }
          else if ( dType == "datetime" ) {
            dType = "datetime";
          }
          else if ( dType == "decimal" ) {
            dType = "money";
          }
          else if ( dType == "double" ) {
            dType = "float";
          }
          else if ( dType == "sbyte" ) {
            dType = "tinyint";
          }
          else if ( dType == "single" ) {
            dType = "real";
          }
          else if ( dType == "guid" ) {
            dType = "uniqueidentifier";
          }
          else {
            Console.WriteLine();
            Console.WriteLine( "Add new type to type conversion" );
            Console.ReadKey();
            Environment.Exit( 0 );
          }

          if ( ++colHeadCounter == colHeadLast ) {
            sqlCmd += colHead + " " + dType;
          }
          else {
            sqlCmd += colHead + " " + dType + ", ";
          }
        }
        sqlCmd += ")";
        //Console.WriteLine( sqlCmd );
        SqlCeCommand cmd = new SqlCeCommand( sqlCmd, destConn );
        cmd.ExecuteNonQuery();
        Console.WriteLine( "Copy of " + tableName + " created." );
    }
    private static DataTable GetDataFromTable( string tableName, SqlCeConnection sourceConn ) {
      SqlCeCommand sourceCmd = sourceConn.CreateCommand();
      sourceCmd.CommandText = "Select * from " + tableName;
      SqlCeDataAdapter sourceAdp = new SqlCeDataAdapter( sourceCmd );
      DataTable dt = new DataTable();
      sourceAdp.Fill( dt );
      //Console.WriteLine( "The SqlCeDataAdapter succesfully filled " + dt.Rows.Count + " rows in the DataSet!" );
      return dt;
    }
    private static bool DoesTableExist(string tableName, SqlCeConnection destConn) {
      bool doesIt = false;
      SqlCeCommand destCmd = destConn.CreateCommand();
      destCmd.CommandType = CommandType.Text;
      destCmd.CommandType = CommandType.Text;
      destCmd.CommandText = "SELECT 1 FROM Information_Schema.Tables WHERE TABLE_NAME = @tableName";
      destCmd.Parameters.AddWithValue( "tableName", tableName );
      object result = destCmd.ExecuteScalar();
      if ( result != null ) {
        doesIt = true;
      }
      return doesIt;
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统数据;
使用System.Data.SqlServerCe;
名称空间控制台EAPP5{
班级计划{
静态void Main(字符串[]参数){
string tableName=“ZTVC\u MF\u S\u VALCHA”;
string sourceString=“Data Source=C:\\Users\\David\\Source\\repos\\ConsoleApp5\\ConsoleApp5\\bin\\Debug\\XXX.sdf”;
string destString=“数据源=C:\\Users\\David\\Source\\repos\\ConsoleApp5\\ConsoleApp5\\bin\\Debug\\YYY.sdf”;
使用(sqlceconnectionsourceconn=newsqlceconnection()){
SqlCeCommand sourceCmd=sourceConn.CreateCommand();
sourceCmd.CommandType=CommandType.Text;
sourceCmd.Parameters.AddWithValue(“tableName”,tableName);
sourceConn.ConnectionString=sourceString;
sourceConn.Open();
使用(SqlCeConnection destConn=new SqlCeConnection()){
destConn.ConnectionString=destString;
destConn.Open();
DoesTableExist(表名,destConn);
DataTable dt=GetDataFromTable(表名,sourceConn);
CopyTableSchema(表名、dt、destConn);
FillTableCopy(表名、dt、destConn);
DeleteTable(表名,destConn);
Console.ReadKey();
}
}
}
私有静态void FillTableCopy(字符串tabName、DataTable dt、SqlCeConnection destConn){
List dTypesList=新列表();
int DTypeSlitIndexCounter=0;
字符串sqlCmd=“”;
foreach(数据行中的数据行){
sqlCmd=“插入到“+tabName+”(”;
int colHeadCounter=0;
int colheadlist=dt.Columns.Count;
foreach(dt.列中的数据列colHead){
string dType=colHead.DataType.ToString().ToLower().Substring(7);
添加(dType);
if(++colHeadCounter==ColHeadList){
sqlCmd+=colHead+“”;
}
否则{
sqlCmd+=colHead+“,”;
}
}
sqlCmd+=“”)值(“”);
//Console.Write(sqlCmd);
colHeadCounter=0;
colheadlist=row.ItemArray.Length;
foreach(row.ItemArray中的变量项){
var temp=item.ToString();
如果(临时计数()==0){
if(++colHeadCounter==ColHeadList){
sqlCmd+=(“空”);
}否则{
sqlCmd+=(“空,”);
}
}else if(dTypesList[DTypeSlitIndexCounter]=“字符串”
||dTypesList[dTypesListIndexCounter]=“char”
||dTypesList[dTypesListIndexCounter]=“日期时间”
||dTypesList[dTypesListIndexCounter]=“单个”
||dTypesList[DTypeSlitIndexCounter]=“guid”){
if(++colHeadCounter==ColHeadList){
sqlCmd+=(“'”+项+“”);
}否则{
sqlCmd+=(“'”+项+“,”);
}
}否则{
if(++colHeadCounter==ColHeadList){
sqlCmd+=(项+“”);
}否则{
sqlCmd+=(项+“,”);
}
}
DTypeSlitIndexCounter++;
}
sqlCmd+=”;
//Console.Write(sqlCmd);
//Console.WriteLine();
SqlCeCommand cmd=新的SqlCeCommand(sqlCmd,destConn);
cmd.ExecuteNonQuery();
}
//控制台写入线(cmd);
Console.WriteLine(“已执行数据副本”);
}
私有静态void DeleteTable(字符串表名,SqlCeConnection路径连接){
字符串sqlCmd=“DROP TABLE”+tableName;
SqlCeCommand cmd=新的SqlCeCommand(sqlCmd,pathConn);
cmd.ExecuteNonQuery();
Console.WriteLine(tableName+“已删除”);
}
私有静态void CopyTableSchema(字符串tableName、DataTable dt、SqlCeConnection destConn){
字符串sqlCmd=“Create table”+tableName+”(”;
int colHeadCounter=0;
int colheadlist=dt.Columns.Count;
/*sqlce支持的类型:bigint、integer、smallint、tinyint、bit、numeric、money、float、real、datetime、,
*国家字符,国家字符变化,ntext,nchar,二进制,varbinary,图像,唯一标识符,
*标识,rowguidcol,时间戳/rowversion*/
foreach(dt.列中的数据列colHead){
string dType=colHead.DataType.ToString().ToLower().Substring(7);
////仍然需要映射所有类型转换
如果(数据类型==“int16”){
dType=“smallint”;
}
else if(数据类型==“int32”){
dType=“int”;
}
else if(数据类型==“int64”){
dType=“bigint”;
}
else if(数据类型==“字符串”){
dType=“nvarchar(4000)”;
}
else if(数据类型==“布尔”){
dType=“bit”;
}
else if(数据类型==“字节”){
dType=“tinyint”;
}
else if(数据类型==“字节[]”){
dType=“二进制”;
}
else if(数据类型==“字符”){