尝试使用SqlFileStream访问FILESTREAM列会导致锁定

时间:2018-03-06 13:29:09

标签: c# sql-server nhibernate filestream

我正在尝试将数据写入MS SQL数据库的FILESTREAM列。在本地计算机上运行时,它运行正常,但只要连接到远程计算机,它就会锁定。

这就是我所做的(使用NHibernate):

private static readonly string QUERY_GET_PATH =
    "select CompressedData.PathName() as path, GET_FILESTREAM_TRANSACTION_CONTEXT() as con from Data.TimeSeries where FS_ID = :dataId";
private static readonly string QUERY_SET_BLANK =
    "update Data.TimeSeries set CompressedData = Cast('' as varbinary(max)) where FS_ID = :dataId";

// ...

ISession session = ...
var q1 = session.CreateSQLQuery(QUERY_SET_BLANK);
q1.SetGuid("dataId", ts.DataId);
q1.ExecuteUpdate();
var q2 = session.CreateSQLQuery(QUERY_GET_PATH);
q2.SetGuid("dataId", ts.DataId);
var results = q2.List();
var item = (object[])results[0];
var path = (string)item[0];
var context = (byte[])item[1];
return new SqlFileStream(path, context, FileAccess.Write);        

在本地运行它可以正常工作,但后来我使用这样的连接字符串连接到远程数据库(这不在我手中,我只需要写入它):

Server=10.0.0.5; Database=TheDatabase; User Id=foo; Password='barfoo';

返回的路径如下:

\\SOME-HOST\SOMEWHERE\v02-A60EC2F8-2B24-11DF-9CC3-AF2E56D89593\Foo\Data\TimeSeries\%!CompressedData\BAD566ED-CD86-42DE-AC71-D13125E89990\VolumeHint-HarddiskVolume1

首先我认为这是因为从10.0.0.5SOME-HOST的名称解析,但是当我向hosts文件添加适当的条目时,它会一直锁定(ping到数据库工作)。

可能出现什么问题?

跟进

等待几分钟后,我收到Win32Exception消息The user name or password is incorrect

1 个答案:

答案 0 :(得分:0)

我发布这个作为答案,所以我可以将其标记为已解决,尽管它更像是一种解决方法 - 但我想至少在这里为可能面临相同或类似问题的其他人留下解释。< / p>

正如我所知,FILESTREAM仅适用于SSPI,而SSPI仅在客户端和服务器位于同一域或本地访问数据库时才起作用。这解释了为什么当我在本地访问数据库时它首先起作用。

由于数据库服务器位于由我们工作的第三方设置的系统中,因此无法将我的客户端计算机置于其域中,并且无法将其服务器置于我们的服务器中。我们的解决方法是准备所有内容,将其压缩,将该存档转移到数据库服务器并在那里运行服务,在本地连接到数据库,将所有内容放入。从安全角度来看,这是可以的,因为两个系统只运行在本地网络无法访问外部。