2009-08-26 230 views
1

我想从SQLite传输数据到SQL Server。目标和目标表的架构是一样的:从SQLite导入数据到SQL Server与SqlBulkCopy类

SQL服务器:

CREATE TABLE [dbo].[Shop] (
    [ShopID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](128) NOT NULL, 
    [Url] [nvarchar](128) NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [ShopID] ASC 
)) 

和SQLite:

CREATE TABLE "Shop" (
    "ShopID" INTEGER PRIMARY KEY NOT NULL, 
    "Name" VARCHAR NOT NULL, 
    "Url" VARCHAR NOT NULL); 

我写的代码如下(有System.Data.SQLite) :

using (var conn = new SQLiteConnection(@"Data Source=Data.sqlite;FailIfMissing=True")) 
{ 
    conn.Open(); 
    var cmd = new SQLiteCommand("SELECT * FROM Shop", conn); 
    var reader = cmd.ExecuteReader(); 

    using (var bulkCopy = new SqlBulkCopy("Data Source=.;Initial Catalog=Test;Integrated Security=True")) 
    { 
     bulkCopy.DestinationTableName = "Shop"; 
     bulkCopy.ColumnMappings.Add("ShopID", "ShopID"); 
     bulkCopy.ColumnMappings.Add("Name", "Name"); 
     bulkCopy.ColumnMappings.Add("Url", "Url"); 
     bulkCopy.WriteToServer(reader); 
    } 
} 

数据已被读者加载(我检查过)。但是,在WriteToServer方法上引发InvalidOperationException:给定的ColumnMapping不匹配源或目标中的任何列。

对我有何建议或建议?

+1

我错了或这ColumnMappings.Add是没有必要?这两个表格是相同的... – 2009-08-26 10:08:52

回答

1

这可能会也可能不会解决您的问题,但您可能希望使用SqlBulkCopyOptions来指定您不希望它生成新的标识值。

SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
0

这对我的作品......

private void GatherDb3Info(FileInfo[] fiDb3) { 
     SQLiteConnectionStringBuilder csb = new SQLiteConnectionStringBuilder(); 
     foreach (FileInfo fi in fiDb3) { 
      csb.Clear(); 
      csb.DataSource = fi.FullName; 
      csb.Password = "[email protected]$$w0rd"; 
      csb.SyncMode = SynchronizationModes.Full; 

      using (var conn = new SQLiteConnection(csb.ToString())) { 
       conn.Open(); 
       DataTable dtTables = conn.GetSchema(SQLiteMetaDataCollectionNames.Tables, new String[] { }); 
       foreach (DataRow dRow in dtTables.Rows) { 
        if (dRow["Table_Type"].ToString().ToLower() != "table") continue; 
        String 
         catName = String.Format("{0}", dRow["Table_Catalog"]), 
         schName = String.Format("{0}", dRow["Table_Schema"]), 
         tblName = String.Format("{0}", dRow["Table_Name"]); 
        DataTable dtColumns = conn.GetSchema(SQLiteMetaDataCollectionNames.Columns, new System.String[] { catName, schName, tblName }); 
        StringBuilder sb = new StringBuilder(); 
        foreach (DataRow dRowColumn in dtColumns.Rows) { 
         sb.AppendFormat("[{0}], ", dRowColumn["Column_Name"]); 
        } 

        String sColList = sb.ToString(); 
        sColList = sColList.Remove(sColList.Length - 2); 
        var cmd = new SQLiteCommand("Select " + sColList + " From " + tblName, conn); 
        var reader = cmd.ExecuteReader(); 
        using (var bulkCopy = new System.Data.SqlClient.SqlBulkCopy(@"Server=.;Integrated Security=true;Database=TargetDBName;")) { 
         bulkCopy.DestinationTableName = "TargetTableSchema." + tblName; 
         try { 
          bulkCopy.WriteToServer(reader); 
         } catch (Exception) { } 
        } 
       } 
       conn.Close(); 
      } 
     } 
    } 
+1

如果出现错误并且您不知道,那么空的catch块会给您一个很头痛的问题。也许这就是你说“它有效”的原因。谁知道? – usr 2013-10-17 07:06:17