Я пытаюсь вставить список имен файлов в простую таблицу Sql Server.
Я пытаюсь использовать SqlBulkCopy и библиотеку FastMember @ markgravell , как предлагают другие ответы SO.
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
Так что я чувствую, что это проблема сопоставления либо с:
Я никогда не использовал эту библиотеку, прежде чем, изучая исходный код GitHub, для этого требуется свойство запроса из источника. Теперь в строке нет value
свойства, которое все, что вам нужно использовать, это свойство Length
. Использование Length
. Теперь это может быть проблемой в библиотеке FastMember, где она создает CallSite
доступа 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...
был только для тестирования).