Alessandro Zifiglio

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

Comments

Petar Petrov said:

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);

               }

           }

       }

# September 23, 2008 4:34 AM

alessandro said:

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

Many thanks

# September 23, 2008 6:19 AM