【问题标题】:Unable to insert file stream into SQL filetable using Dapper.NET无法使用 Dapper.NET 将文件流插入 SQL 文件表
【发布时间】:2016-09-06 16:48:44
【问题描述】:

我在我的项目中使用 Dapper.NET 作为 ORM 层。我正在尝试为文件上传和下载编写 WebApis。但是我无法让它工作。我已经进行了足够多的搜索以寻求帮助,但我找不到任何帮助。

如果我只是使用 ADO.NET,我可以将 VarBinary 类型的 SqlParameter 用于文件流。但是 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();

抛出异常:mscorlib.dll 中的“System.NotSupportedException”

附加信息:System.IO.Stream 类型的成员 fileStream 不能作为参数值

有没有人这样做或知道我可以使用的任何小巧的扩展插件?

【问题讨论】:

  • 你的表的 DDL 怎么样?
  • DDL 非常简单 CREATE TABLE [dbo].[Attachments] AS FILETABLE WITH (FileTable_Directory = 'AttachmentFiles', FileTable_Collat​​e_Filename = database_default)] 您可以找到许多关于如何设置文件表目录的示例。

标签: c# sql ado.net dapper dapper-extensions


【解决方案1】:

您需要使用 DynamicParameters 类并指定参数的数据类型。 例如,我创建了一个表 TEST,其中有一列名为 Stream 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);
    }
}

【讨论】:

  • 如何在 SQL Server 中配置 FILESTREAM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2011-10-31
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多