我正在尝试将文件名列表插入到一个简单的Server表中。
我试图利用SqlBulkCopy和@markgravell's 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所以我觉得这是一个映射问题,或者是:
发布于 2017-03-03 03:31:53
不过,我以前从未使用过这个库,但它需要一个属性才能从源代码中查询它的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...只是用于测试)。
https://stackoverflow.com/questions/42569519
复制相似问题