SQL Server 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 был нулевым, мой вызов 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();

person scarpacci    schedule 01.11.2011    source источник


Ответы (1)


См. раздел FILESTREAM MVC: загрузка и выгрузка изображений с SQL Server. для примера, показывающего, как загружать и скачивать файловый поток эффективным, ориентированным на поток способом. Подход, которого вы придерживаетесь, выделяя буфер размером всего загруженного файла (и я предполагаю, что вы делаете то же самое при обслуживании контента) очень неэффективен, ваша память процесса ASP будет разорвана на куски таким большим байтом [] операции.

person Remus Rusanu    schedule 01.11.2011
comment
Спасибо @Remus, я ценю это. - person scarpacci; 02.11.2011