0

前の質問から、MongoDB データベースから実行しようとしていSqlBulkCopyますが、エラーが発生し、必要な列の型が見つかりません。

データ ソースからのtype の指定された値をObjectId、指定されたターゲット列の nvarchar 型に変換できません。

ここに画像の説明を入力

DataTable私のコラムDataTypeはどこにありますかMongoDB.Bson.ObjectId

この値をホストする Microsoft Sql Serverの型は何ですか?

私の現在のコード:

string connectionString = GetDestinationConnectionString();
var mongoCollection = GetSourceConnectionString();

var queryFind = Query.And(Query.NotExists("sync"), Query.NotIn("challenge_guid", new List<MongoDB.Bson.BsonValue>() { "87558b59-73ee-4f10-add4-b9031551e395" }));
var sourceData = mongoCollection.Find(queryFind).ToList();

DataTable dt = CollectionHelper.ConvertTo<MongoAnswerDoc>(sourceData);

using (SqlConnection destinationConnection =
            new SqlConnection(connectionString))
{
    destinationConnection.Open();

    // Set up the bulk copy object. 
    // Note that the column positions in the source
    // data reader match the column positions in 
    // the destination table so there is no need to
    // map columns.
    using (SqlBulkCopy bulkCopy =
                new SqlBulkCopy(destinationConnection))
    {
        bulkCopy.DestinationTableName = "JK_RawChallengeAnswers";

        try
        {
            // Write from the source to the destination.
            bulkCopy.WriteToServer(dt);
        }
        catch (Exception ex)
        {
            txtMsg.Text = ex.Message;
        }
        finally
        {
            // Dispose of the DataTable.
            dt.Dispose();
            // close connection
            destinationConnection.Close();
        }
    }
}
4

1 に答える 1

1

モンゴスペックから:

ObjectIdは12バイトのBSONタイプであり、以下を使用して構築されます。

  • 4バイトのタイムスタンプ、
  • 3バイトのマシン識別子。
  • 2バイトのプロセスID、および
  • 3バイトのカウンター。

BINARY(12)したがって、SQLでマップするには型列が必要になります。

とにかく、重要性の転送時にコードのメモリが不足するため、中間のDataTableメモリ内コピーを使用することはできません。EnableStreamingを使用しIDataReaderて、ソースをジャストインタイムで反復処理します。

于 2012-12-17T07:32:02.353 に答える