2009-08-26 44 views
1

SQLiteからSQL Serverにデータを転送しようとしています。ターゲットと送信先テーブルのスキーマがちょうど同じです。SqlBulkCopyクラスを使用してSQLiteからSQL Serverにデータをインポート

SQL Serverの:

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

データが読み込まれています(確認済みです)。しかし、InvalidOperationExceptionはWriteToServerメソッドをスローします。指定されたColumnMappingは、ソースまたは宛先の任意の列と一致しません。

私のためのアイデアや提案はありますか?

+1

は私が間違っているか、このColumnMappings.Addは必要ありませんか? 2つのテーブルは同じです... –

答えて

1

これは問題を解決する場合もありませんが、SqlBulkCopyOptionsを使用して、新しいID値を生成しないように指定したい場合があります。

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

エラーがあり、あなたがそれを知らない場合、その空のキャッチブロックはあなたに大きな頭痛を与えるでしょう。たぶんそれはあなたが「それは働いている」と言っている理由です。知るか? – usr

関連する問題