C# 在.Net core 2中使用SQL Server Filestream

C# 在.Net core 2中使用SQL Server Filestream,c#,sql-server,linq,C#,Sql Server,Linq,我需要以Filestream数据的形式访问存储在SQL Server中的pdf文件。我正在开发一个.NETCore2(RazorPages)应用程序 我正在尝试使用此方法访问此页面上概述的Filestream数据: 但是,SqlFileStream类型似乎在.NETCore2版本的System.Data.SqlTypes中不可用 从SQL Server.Net Core 2访问Filestream数据的最佳方式是什么 另外,是否有一种方法可以以更“精简”的方式使用Linq和实体框架,而不必通

我需要以
Filestream
数据的形式访问存储在SQL Server中的pdf文件。我正在开发一个.NETCore2(RazorPages)应用程序

我正在尝试使用此方法访问此页面上概述的
Filestream
数据:

但是,
SqlFileStream
类型似乎在.NETCore2版本的
System.Data.SqlTypes
中不可用

从SQL Server.Net Core 2访问
Filestream
数据的最佳方式是什么



另外,是否有一种方法可以以更“精简”的方式使用Linq和实体框架,而不必通过设置
SqlCommand
SqlConnection
等来设置“经典”SQL查询?

恐怕.NET核心上不支持
SqlFileStream
。正因为如此,我仍然使用ASP.NET内核来对抗完整的.NET框架,而不是.NET内核

如果您想了解本主题的进展,请点击以下链接:

以及与Linux相关的更通用的:


这将在.NET Core 3中作为的一部分提供。您可以尝试,但官方发布即将发布

它以前在这里被跟踪:

从创建数据库开始。我们可以找到一个很好的例子

安装SQLClient-nuget

Install-Package Microsoft.Data.SqlClient -Version 1.0.19249.1
请注意,
System.Data
不再使用。新名称空间是Microsoft.Data

下面是一个简单的应用程序(来自上述示例):

类程序
{
常量字符串cs=@“数据源=;初始目录=MyFsDb;集成安全性=TRUE”;
静态void Main(字符串[]参数)
{
Save();
Open();
}
私有静态void Save()
{
var path=@“C:\Files1\testfile.txt”;
FileStream fs=newfilestream(路径,FileMode.Open,FileAccess.Read);
BinaryReader rdr=新的BinaryReader(fs);
byte[]fileData=rdr.ReadBytes((int)fs.Length);
rdr.Close();
fs.Close();
使用(SqlConnection con=newsqlconnection(cs))
{
con.Open();
string sql=“插入MyFsTable值(@fData、@fName、default)”;
SqlCommand cmd=新的SqlCommand(sql,con);
cmd.Parameters.Add(“@fData”,SqlDbType.Image,fileData.Length).Value=fileData;
cmd.Parameters.Add(“@fName”,SqlDbType.NVarChar).Value=“Some Name”;
cmd.ExecuteNonQuery();
con.Close();
}
}
私有静态void Open()
{
使用(SqlConnection con=newsqlconnection(cs))
{
con.Open();
SqlTransaction txn=con.BeginTransaction();
string sql=“SELECT fData.PathName(),GET_FILESTREAM_TRANSACTION_CONTEXT(),fName FROM MyFsTable”;
SqlCommand cmd=新的SqlCommand(sql、con、txn);
SqlDataReader rdr=cmd.ExecuteReader();
while(rdr.Read())
{
字符串文件路径=rdr[0]。ToString();
字节[]对象上下文=(字节[])rdr[1];
SqlFileStream sfs=新的SqlFileStream(filePath,objContext,System.IO.FileAccess.Read);
字节[]缓冲区=新字节[(int)sfs.Length];
读取(缓冲区,0,缓冲区长度);
sfs.Close();
字符串fileContents=System.Text.Encoding.UTF8.GetString(缓冲区);
Console.WriteLine(文件内容);
}
rdr.Close();
提交();
con.Close();
}
}
}
class Program
{
    const string cs =@"Data Source=<your server>;Initial Catalog=MyFsDb;Integrated Security=TRUE";

    static void Main(string[] args)
    {
        Save();
        Open();
    }

    private  static void Save()
    {
        var path = @"C:\Files1\testfile.txt";
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
        BinaryReader rdr = new BinaryReader(fs);
        byte[] fileData = rdr.ReadBytes((int)fs.Length);
        rdr.Close();
        fs.Close();

        using (SqlConnection con = new SqlConnection(cs))
        {
            con.Open();
            string sql = "INSERT INTO MyFsTable VALUES (@fData, @fName, default)";
            SqlCommand cmd = new SqlCommand(sql, con);
            cmd.Parameters.Add("@fData", SqlDbType.Image, fileData.Length).Value = fileData;
            cmd.Parameters.Add("@fName", SqlDbType.NVarChar).Value = "Some Name";
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }

    private static void Open()
    {
        using (SqlConnection con = new SqlConnection(cs))
        {
            con.Open();
            SqlTransaction txn = con.BeginTransaction();
            string sql = "SELECT fData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT(), fName FROM MyFsTable";
            SqlCommand cmd = new SqlCommand(sql, con, txn);
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                string filePath = rdr[0].ToString();
                byte[] objContext = (byte[])rdr[1];
                SqlFileStream sfs = new SqlFileStream(filePath, objContext, System.IO.FileAccess.Read);
                byte[] buffer = new byte[(int)sfs.Length];
                sfs.Read(buffer, 0, buffer.Length);
                sfs.Close();

                string fileContents = System.Text.Encoding.UTF8.GetString(buffer);
                Console.WriteLine(fileContents);
            }

            rdr.Close();
            txn.Commit();
            con.Close();

        }
    }
}