0

我正在尝试将文件名列表插入到一个简单的 Sql Server 表中。

正如其他 SO 答案所建议的那样,我正在尝试利用 SqlBulkCopy 和@markgravell 的 FastMember库。

public async Task AddFileNamesAsync(string[] fileNames)
{
    fileNames.ShouldNotBeNull();

    using (var bulkCopy = new SqlBulkCopy(ConnectionString))
    {
        using (var reader = ObjectReader.Create(fileNames))
        {
            bulkCopy.DestinationTableName = "FileNames";
            bulkCopy.ColumnMappings.Add("value", "FileName");
            await bulkCopy.WriteToServerAsync(reader)
                          .ConfigureAwait(false);
        }
    }
}

CREATE TABLE [dbo].[FileNames](
[FileNameId] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](500) NOT NULL

所以我觉得这是一个映射问题:

  • FastMember 无法映射到某些内部支持集合
  • FastMember 后备集合与 DB 列的名称不同,因此无法映射。
4

1 回答 1

1

在查看 GitHub 源代码之前,我从未使用过这个库,它需要一个属性来从源中查询。现在在字符串上实际上没有属性value,您只需要使用Length属性即可。使用Length. 现在这可能是 FastMember 库的问题,它创建了一个CallSite访问器函数来从目标对象中捕获属性。

来源在这里

现在我玩了一场,无法访问任何可以工作的财产。乍一看,它们是结果Chars中返回的属性,TypeAccessor但这似乎不起作用。

我的建议并不是对问题的真正答案,而是使其发挥作用的一种方法。如果您创建了一个具有字符串属性的类型,那么您可以有效地解决这个问题。

public async Task AddFileNamesAsync(string[] fileNames)
{
    fileNames.ShouldNotBeNull();

    var list = fileNames.Select(f => new { value = f });

    using (var bulkCopy = new SqlBulkCopy(ConnectionString))
    {
        using (var reader = ObjectReader.Create(list))
        {
            bulkCopy.DestinationTableName = "FileNames";
            bulkCopy.ColumnMappings.Add("value", "FileName");

            try
            {
                await bulkCopy.WriteToServerAsync(reader)
                                .ConfigureAwait(false);

            }
            catch(Exception ex)
            {

            }
        }
    }
}

现在这将起作用,因为我们生成了一个新类型,其属性value是每个文件名。现在执行应该按预期工作。(注意try..catch...只是为了测试)。

于 2017-03-03T03:31:53.253 回答