大量のの量のSQL ServerのFILESTREAM列への書き込みに問題があります。具体的には、1.5〜2GB程度の小さなファイルは問題なく処理されますが、サイズが6GB以上になると、が断続的になりますIOException
転送の最後には.CopyTo()
にハンドルが無効です。大きなファイルをSQL Server FILESTREAMに書き込む方法は?
データをチャンクに書き込むことを考えましたが、SQL Serverは大きなファイルのパフォーマンスを完全に破壊するデータを追加する前に、フィールドのバッキングファイルをコピーします。
は、ここでは、コードです:
public long AddFragment (string location , string description = null)
{
const string sql =
@"insert into [Fragment] ([Description],[Data]) " +
"values (@description,0x); " +
"select [Id], [Data].PathName(), " +
"GET_FILESTREAM_TRANSACTION_CONTEXT() " +
"from " +
"[Fragment] " +
"where " +
"[Id] = SCOPE_IDENTITY();";
long id;
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions {
Timeout = TimeSpan.FromDays(1)
}))
{
using (var connection = new SqlConnection(m_ConnectionString))
{
connection.Open();
byte[] serverTx;
string serverLocation;
using (var command = new SqlCommand (sql, connection))
{
command.Parameters.Add("@description",
SqlDbType.NVarChar).Value = description;
using (var reader = command.ExecuteReader())
{
reader.Read();
id = reader.GetSqlInt64(0).Value;
serverLocation = reader.GetSqlString (1).Value;
serverTx = reader.GetSqlBinary (2).Value;
}
}
using (var source = new FileStream(location, FileMode.Open,
FileAccess.Read, FileShare.Read, 4096,
FileOptions.SequentialScan))
using (var target = new SqlFileStream(serverLocation,
serverTx, FileAccess.Write))
{
source.CopyTo (target);
}
}
scope.Complete();
}
return id;
}
たぶんhttp://msdn.microsoft.com/en-us/library/bb933972(v=sql.105を見て、あなたのmachine.configの構成設定に以下を追加します).aspx – Paparazzi
フィールドに_9_バイトを書き込む一般的な例があります。 – chase
接続にタイムアウトが発生している可能性があります。たとえば、接続タイムアウトを増やしてみましたか?ところで、ちょうど不思議なことに、なぜあなたは大きなファイルにSQL Serverを使用していますか?これらは最近、SQL Server上で一般的なプラクティスになっていますか? – ziya