0

在上一个问题中,我正在尝试SqlBulkCopy从 MongoDB 数据库中执行操作,但出现错误并且找不到我应该具有的列类型:

来自数据源的 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

来自Mongo 规范

ObjectId 是一个 12 字节的 BSON 类型,使用以下方法构造:

  • 一个 4 字节的时间戳,
  • 一个 3 字节的机器标识符,
  • 一个 2 字节的进程 ID,以及
  • 一个 3 字节的计数器。

所以你需要一个BINARY(12)类型列来在 SQL 中映射它。

无论如何,您的代码将在任何重要的传输中耗尽内存,使用中间 DataTable 内存副本不是要走的路。EnableStreaming并使用 anIDataReader即时迭代源。

于 2012-12-17T07:32:02.353 回答