Conserving Resources When Writing BLOB Values to SQL Server and Streaming BLOB Values back to the Client

All posts have moved to Typps

See you there.

Alessandro

2 Comments

  • I think you should consider using a SqlTransaction.

    Probably something like this is more robust :

           public static void InsertFile(string applicationName, Stream data,

               string mimeType, string fileName)

           {

               SqlTransaction transaction = null;

               try

               {

                   using (SqlConnection myConnection = GetSqlConnection())

                   {

                       myConnection.Open();

                       transaction = myConnection.BeginTransaction();

                       using (SqlCommand cmd = new SqlCommand("DbOwner" + ".DataFile_Insert", myConnection, transaction))

                       {

                           cmd.CommandType = CommandType.StoredProcedure;

                           cmd.Parameters.Add("@applicationName", SqlDbType.NVarChar, 256).Value = applicationName;

                           cmd.Parameters.Add("@mimeType", SqlDbType.NVarChar, 50).Value = mimeType;

                           cmd.Parameters.Add("@length", SqlDbType.Int, 4).Value = data.Length;

                           cmd.Parameters.Add("@fileName", SqlDbType.NVarChar, 256).Value = fileName;

                           SqlParameter fileIdParam = cmd.Parameters.Add("@fileId", SqlDbType.Int, 4);

                           fileIdParam.Direction = ParameterDirection.Output;

                           cmd.ExecuteNonQuery();

                           var fileId = (int)fileIdParam.Value;

                           InsertFileByChunks(cmd, fileId, data, 128);

                       }

                       transaction.Commit();

                   }

               }

               catch (SqlException sqlException)

               {

                   if (transaction != null)

                   {

                       transaction.Rollback();

                   }

                   // ... Log the exception

               }

               finally

               {

                   if (transaction != null)

                   {

                       transaction.Dispose();

                   }

               }

           }

           private static void InsertFileByChunks(SqlCommand cmd, int fileId, Stream data, int bufferLen)

           {

               cmd.CommandText = "DbOwner" + ".DataFile_InsertChunk";

               cmd.CommandType = CommandType.StoredProcedure;

               cmd.Parameters.Add("@fileId", SqlDbType.Int, 4).Value = fileId;

               SqlParameter paramData = cmd.Parameters.Add("@data", SqlDbType.VarBinary, 128);

               SqlParameter paramOffset = cmd.Parameters.Add("@offset", SqlDbType.BigInt);

               cmd.Parameters.Add("@length", SqlDbType.Int, 4).Value = bufferLen;

               using (BinaryReader br = new BinaryReader(data))

               {

                   byte[] buffer = br.ReadBytes(bufferLen);

                   int offset = 0;

                   while (buffer.Length > 0)

                   {

                       paramData.Value = buffer;

                       paramOffset.Value = offset;

                       cmd.ExecuteNonQuery();

                       offset += bufferLen;

                       buffer = br.ReadBytes(bufferLen);

                   }

               }

           }

  • Petar! That totally slipped my mind. I know i was considering it at some point, just weren't there yet :-)
    Many thanks

Comments have been disabled for this content.