启用了 FileStream 的多个 SQL Server 实例

Kum*_*mar 5 sql-server filestream

是否可以在同一台机器上运行两个 SQL Server 实例,一个 2008 R2 和另一个 2012,两者都启用了文件流?

我试图在本地开发机器上设置它,我可以运行服务。但是当我尝试从 2008 R2 实例读取文件流时,我得到了一个ArgumentException.

两个实例中的路径看起来都不错。

SQL Server 2008 R2

\\DEVMC\MSSQLSERVER\v1\TESTDB\dbo\coreFileStore\fileData\525F2031-8D8C-45FF-8386-E1DD5F11C960
Run Code Online (Sandbox Code Playgroud)

SQL Server 2012

\\DEVMC\EXPRESS2012\v1\TESTDB12\dbo\coreFileStore\fileData\525F2031-8D8C-45FF-8386-E1DD5F11C960
Run Code Online (Sandbox Code Playgroud)

是否有任何神奇的设置可以使其在这两种情况下都能正常工作,或者根本无法做到?

这是尝试使用 C# 测试代码访问文件时的异常堆栈跟踪。

System.ArgumentException : An invalid parameter was passed to the function.
   at System.Data.SqlTypes.SqlFileStream.OpenSqlFileStream(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
   at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access, FileOptions options, Int64 allocationSize)
   at System.Data.SqlTypes.SqlFileStream..ctor(String path, Byte[] transactionContext, FileAccess access)
   at SimpleTests.FileStreamTest.ReadFilestream(String connectionstring, String fileid) in FileStreamTest.cs: line 47
Run Code Online (Sandbox Code Playgroud)

这是我用来验证问题的 NUnit 测试方法。FileStore 访问 TESTDB 失败,但 TESTDB12 工作正常。

[TestCase(new object[] { "Data Source=localhost;Database=TESTDB;Integrated Security=True;Connect Timeout=120;", "525F2031-8D8C-45FF-8386-E1DD5F11C960" })]
[TestCase(new object[] { "Data Source=localhost\\express2012;Database=TESTDB12;Integrated Security=True;Connect Timeout=120;", "9AC28DC0-B927-4075-8D31-00E343E15663" })]
public void ReadFilestream(string connectionstring, string fileid)
{
    const string _selectSql =
        @"SELECT fileData.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT()
  FROM coreFileStore
  WHERE fileStoreId = @FileStoreId";

    using (SqlConnection connection = new SqlConnection(connectionstring))
    {
        connection.Open();
        using (SqlTransaction transaction = connection.BeginTransaction())
        {
            string filepath;
            byte[] txnInfo;
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = _selectSql;
                command.Parameters.AddWithValue("FileStoreId", new Guid(fileid));
                command.Transaction = transaction;
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    reader.Read();
                    filepath = reader.GetString(0);
                    txnInfo = reader.GetValue(1) as byte[];
                }
            }

            Console.WriteLine(filepath);

            using (SqlFileStream sqlFileStream = new SqlFileStream(filepath, txnInfo, FileAccess.Read))
            {
                using (StreamReader reader = new StreamReader(sqlFileStream))
                {
                    string x = reader.ReadToEnd();
                    Console.WriteLine(x);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Kum*_*mar 2

在 SQL Server 支持站点中找到了答案。

https://connect.microsoft.com/SQLServer/feedback/details/793017/filestream-problem-when-installing-sql-server-2012-sp1-side-by-side-with-sql-server-2008-r2

这是 SQL Server 2012 中的一个错误。听到的是建议的解决方法的副本。

解决方法是通过重新定位或重新创建 SQL Server 2012 实例或早期版本实例的 FILESTREAM 容器将其放入不同的卷中。

这将使 SQL Server 2012 RsFx 驱动程序 (RsFx020x) 附加到不同的卷,因此不会干扰对早期版本驱动程序的请求。

有关重新定位文件流目录的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms345483.aspx

重新定位或重新创建后(可能需要重新启动 SQL Server),“fltmc 实例”命令将指示 RsFx 驱动程序是否附加到不同的卷。例如,结果应如下所示(排除不相关的行):

过滤器体积名称 海拔高度 实例名称

RsFx0201 C: 41002.01 RsFx0201 MiniFilter 实例 0

RsFx0105 D:41001.05 RsFx0105 MiniFilter 实例 0