我正在使用SqlFileStream将文件存储在数据库中,但是在插入我似乎无法解决的新记录时,我遇到了一个小问题!问题在于我需要在插入记录时创建一个临时文件,以提供一个文件路径来传输实际的文件。我希望当实际数据流传输到文件路径时,临时文件会被覆盖,但它实际上会添加另一个文件 - 将空文件保留在文件系统中。
这是代码(请忽略查询字符串格式以及我插入参数的方式,我一直在试图尝试不同的东西,并且已经失去了很好地编写代码的意愿;)):
using (TransactionScope transactionScope = new TransactionScope())
{
string InsertTSql = "Insert Into Documents(file_name, file_type, category, uploaded_by, file_data) values('" + request.fileInfo.fileName + "', '" + request.fileInfo.fileType + "', '" + request.fileInfo.category + "', '" + request.fileInfo.uploadedBy + "',Cast('' As varbinary(Max))); Select file_data.PathName() As Path From Documents Where document_id = @@Identity";
SqlConnection dbConnection = new SqlConnection(@"Data Source=SAM\SQLEXPRESS;Initial Catalog=PIRS;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");//ConfigurationManager.ConnectionStrings["PIRSDBCon"].ToString()) )
var cmd = new SqlCommand(InsertTSql, dbConnection);
dbConnection.Open();
string filePath = (string)cmd.ExecuteScalar();
string GetTcTSql = "Select GET_FILESTREAM_TRANSACTION_CONTEXT() As TransactionContext";
cmd = new SqlCommand(GetTcTSql, dbConnection);
byte[] transactionContext =(byte[]) cmd.ExecuteScalar();
SqlFileStream sqlFileStream = new SqlFileStream(filePath, transactionContext, FileAccess.Write);
request.fileData.CopyTo(sqlFileStream);
sqlFileStream.Close();
transactionScope.Complete();
}
如果我可以在此问题上添加更多信息或更清晰,请告知我们。
答案 0 :(得分:3)
文件流系统使用垃圾收集器 - 每次更改总是生成一个新文件,然后最终删除旧文件。但这不会立即发生。
参见例如How It Works: FileStream Garbage Collection或How It Works: File Stream the Before and After Image of a File对此背后的机制进行了一些讨论。