c# - SQL Server FileStream 如何填充文件流列

标签 c# sql-server sql-server-2008 filestream

我遇到了几种将数据插入 SQL Server(对于 FileStream)的不同方法。插入 FileStream 对象的最佳方法是什么?以下方法之间的主要区别是,一种直接执行插入,另一种放在 FileStream 对象的占位符中。

一种方法是他们通过 C# 通过插入直接插入文档:

链接:FileStream

  con.Open();
  string sql = "INSERT INTO MyFsTable VALUES (@fData, @fName, default)";
  SqlCommand cmd = new SqlCommand(sql, con);
  cmd.Parameters.Add("@fData", SqlDbType.Image, fileData.Length).Value = fileData;
  cmd.Parameters.Add("@fName", SqlDbType.NVarChar).Value = fi.Name;
  cmd.ExecuteNonQuery();
  con.Close();

他们插入一行的另一种方法,但将文档(FileStream 列)留空。我必须输入一个虚拟值,因为当 FileStream 列为 null 时,我的 Get File Path 调用返回 Null:

链接:FileStream

  5: if (FileUpload1.FileContent.Length > 0)
   6: {
   7:     SqlConnection objSqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
   8:     objSqlCon.Open();
   9:     SqlTransaction objSqlTran = objSqlCon.BeginTransaction();
  10:  
  11:     SqlCommand objSqlCmd = new SqlCommand("FileAdd",objSqlCon,objSqlTran);
  12:     objSqlCmd.CommandType = CommandType.StoredProcedure;
  13:  
  14:     SqlParameter objSqlParam1 = new SqlParameter("@SystemNumber", SqlDbType.Int);
  15:     objSqlParam1.Value = "1";
  16:  
  17:     SqlParameter objSqlParam2 = new SqlParameter("@FileType", SqlDbType.VarChar,4);
  18:     objSqlParam2.Value = System.IO.Path.GetExtension(FileUpload1.FileName);
  19:  
  20:     SqlParameter objSqlParamOutput = new SqlParameter("@filepath", SqlDbType.VarChar, -1);
  21:     objSqlParamOutput.Direction = ParameterDirection.Output;
  22:  
  23:     objSqlCmd.Parameters.Add(objSqlParam2);
  24:     objSqlCmd.Parameters.Add(objSqlParam1);
  25:     objSqlCmd.Parameters.Add(objSqlParamOutput);
  26:  
  27:  
  28:     objSqlCmd.ExecuteNonQuery();
  29:  
  30:     string Path = objSqlCmd.Parameters["@filepath"].Value.ToString();
  31:  
  32:     objSqlCmd = new SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", objSqlCon, objSqlTran);
  33:  
  34:     byte[] objContext = (byte[])objSqlCmd.ExecuteScalar();
  35:     
  36:  
  37:     SqlFileStream objSqlFileStream = new SqlFileStream(Path, objContext, FileAccess.Write);
  38:     
  39:     objSqlFileStream.Write(buffer, 0, buffer.Length);
  40:     objSqlFileStream.Close();
  41:  
  42:     objSqlTran.Commit();

最佳答案

参见 FILESTREAM MVC: Download and Upload images from SQL Server示例展示了如何以高效的、面向流的方式上传和下载文件流。您采用的方法是分配整个上传文件大小的缓冲区(我假设您在提供内容时也这样做)效率非常低,您的 ASP 进程内存将被如此大的字节 [] 粉碎操作。

关于c# - SQL Server FileStream 如何填充文件流列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973829/

相关文章:

C# 如何从 Active Directory 中获取每个部门的组列表

c# - 使用 C++/CLI 将图片插入 Excel 并收到 100x 警告 C4691

mysql - 更改mysql存储过程以接受mysql字段?

sql - 将 DateTime 分组为 5、15、30 和 60 分钟间隔

.net - 如何使用Entity Framework Code First CTP 5存储图像?

c# - C#无法在类中创建自定义RichTextBox

c# - 没有 PredicateBuilder 的 LINQ 中的动态或

sql - 使用 Union 和 Order By 不会出现重复项

c# - 通过 C# 在单个数据库调用中将大量数据插入 SQL Server

sql - 在插入和更新语句中使用 if/else