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)
在 SQL Server 支持站点中找到了答案。
这是 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
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |