C# SqlFileStream-在不生成空文件的情况下插入
我正在使用SqlFileStream将文件存储在数据库中,但是在插入新记录时,我遇到了一个似乎无法解决的小问题!问题在于,我需要在插入记录时创建一个临时文件,以提供将实际文件数据流传输到的文件路径。当实际数据流传输到文件路径时,我希望临时文件被覆盖,但实际上它添加了另一个文件-在文件系统中留下空文件 下面是代码(请忽略查询字符串格式和我插入参数的方式,我一直在尝试不同的东西,并失去了编写代码的意愿;):C# SqlFileStream-在不生成空文件的情况下插入,c#,.net,sql,sql-server,filestream,C#,.net,Sql,Sql Server,Filestream,我正在使用SqlFileStream将文件存储在数据库中,但是在插入新记录时,我遇到了一个似乎无法解决的小问题!问题在于,我需要在插入记录时创建一个临时文件,以提供将实际文件数据流传输到的文件路径。当实际数据流传输到文件路径时,我希望临时文件被覆盖,但实际上它添加了另一个文件-在文件系统中留下空文件 下面是代码(请忽略查询字符串格式和我插入参数的方式,我一直在尝试不同的东西,并失去了编写代码的意愿;): 请告诉我是否可以添加更多信息或更清楚地说明此问题。filestream系统使用垃圾收集器-每
请告诉我是否可以添加更多信息或更清楚地说明此问题。filestream系统使用垃圾收集器-每次更改都会生成一个新文件,然后最终删除旧文件。但这不会立即发生
例如,请参阅或,以了解有关这背后机制的一些讨论。filestream系统使用垃圾收集器-每次更改都会生成一个新文件,然后最终删除旧文件。但这不会立即发生。@Damien_不信者-你知道,我认为文件夹中似乎少了几个文件,这些文件来自我之前运行的一些测试(几个小时前),并且刚刚再次检查,似乎更多的文件消失了,所以看起来你是对的,先生(不是我怀疑你;))请发帖回答,我会接受的——谢谢你让我摆脱了痛苦
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();
}