2016-09-06 8 views
1

Я использую Dapper.NET как слой ORM в моем проекте. Я пытаюсь написать WebApis для загрузки и загрузки файлов. Однако я не могу заставить его работать. Я уже искал достаточно, чтобы искать помощь, но я не мог найти.Невозможно вставить поток файлов в файл таблицы SQL с помощью Dapper.NET

Если бы я просто использовал ADO.NET, я мог бы использовать SqlParameter типа VarBinary для потока файлов. Но параметры запроса Dapper.NET - это просто динамический объект. Поэтому следующий код не может вставить запись в файл таблицы.

var fileStream = await Request.Content.ReadAsStreamAsync(); 

var streamId = Guid.NewGuid(); 
var fileName = streamId.ToString(); 

var sql = @"Insert into Attachments(stream_id, file_stream, name) 
      Values(@streamId, @fileStream, @fileName)"; 

using (var db = new SqlConnection(AppConfig.ConnectionString)) 
{ 
    await db.ExecuteAsync(sql, new { streamId, fileStream, fileName); 
} 

fileStream.Close(); 

Исключение брошено: '' System.NotSupportedException в mscorlib.dll

Дополнительная информация: Член FileStream типа System.IO.Stream не может быть использована в качестве значения параметра

Кто-нибудь это сделал или знал о плагине расширения dapper, который я мог бы использовать?

ответ

2

Вам необходимо использовать класс DynamicParameters и указать тип данных параметра. Для примера я создал таблицу TEST с колонкой под названием поток VARBINARY (MAX)

  using (var connection = new SqlConnection(Properties.Settings.Default.connectionString)) 
      { 
       connection.Open(); 
       using (var fs = File.Open(Properties.Settings.Default.filePath, FileMode.Open)) 
       { 
        var sql = "INSERT INTO TEST (Stream) VALUES (@fs)"; 

        var dParams = new DynamicParameters(); 
        dParams.Add("@fs", fs, DbType.Binary); 

        connection.Execute(sql, dParams); 
       } 
      } 
+0

Спасибо большое Хайме, он прекрасно работает с DynamicParameters для меня. Мне просто интересно, почему мне так трудно найти эту информацию. Надеюсь, этот вопрос и ответ помогут другим людям. – Rajiv