пятница, 25 июля 2008 г.

Save blob from database into a file

Програмисту часто приходиться писать достаточно тривиальные куски кода, на которые и время жалко тратить(а там могут быть последовательные вызовы к редко используемому/слабознакомому API ) и в отдельные библиотечки выделять не хочеться. Повторное использование такого кода возможно на основе code snippets.
Code snippet - кусок повторно используемого кода, функция, или несколько взаимосвязаных ф-ций. Он относительно небольшого размера, самодостаточен, выполняет одну задачу и легко интегрируется в проект с помощью минимальный работы напильником. Основное преимущество подхода - код очень просто интегрировать в проект, нету лишнего кода и зависимостей, можно быстро подправить форматирование и code convention. В визул студии есть даже поддержка для библиотек таких Code snippets
Под тегом "code snippets" буде выкладывать такой код.

Как не странно, учитывая что с++ основной язык програмирования, первый сниппет будет на c# и описывает работу с базой данных и BLOB полями в ней. Этот код был написан пару недель назад для автоматизации рутины, шарп и языка типа питона тут более применимы.

Получить BLOB поле (небольшой файл) из базы данных (MSSQL) и сохранить его в файл.
для использования заменить параметры в connection string, SQL и путь к файлу с результатом. Данный код предпологает, что sql вернет только один файл за раз, но переделать на обработку нескольких файлов его очень просто.
   1:  public void BLOB2File()
   2:  {            
   3:      SqlConnection Conn = new SqlConnection("server=SERVERNAME;uid=USERNAME;pwd=PWD;database=DB_NAME");
   4:      SqlCommand Cmd = new SqlCommand("SELECT FileName, FileImage FROM TARGET_TABLE WHERE (FILE_ID = NUMBER", Conn);
   5:      Cmd.CommandType = CommandType.Text;
   6:      Conn.Open();
   7:      SqlDataReader Reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
   8:   
   9:      bool rdSatte = Reader.Read();
  10:   
  11:      FileStream FStream = null;
  12:      string str = Reader["FileName"].ToString();
  13:      FStream = new FileStream(@"c:\temp\" + str, FileMode.OpenOrCreate, FileAccess.Write);
  14:      byte[] Binary = null;
  15:      
  16:      Binary = (Reader["FileImage"]) as byte[];
  17:   
  18:      MemoryStream MStream = new MemoryStream(Binary);
  19:      BinaryWriter BWriter = new BinaryWriter(FStream);
  20:      const int ChunkSize = 100;
  21:      int SizeToWrite = ChunkSize;
  22:      for (int i = 0; i < Binary.GetUpperBound(0) - 1; i = i + ChunkSize)
  23:      {
  24:          if (i + ChunkSize >= Binary.Length)
  25:              SizeToWrite = Binary.Length - i;
  26:          byte[] Chunk = new byte[SizeToWrite];
  27:          MStream.Read(Chunk, 0, SizeToWrite);
  28:          BWriter.Write(Chunk);
  29:          BWriter.Flush();
  30:      }
  31:      BWriter.Close();
  32:      FStream.Close();
  33:      FStream.Dispose();
  34:  }

Комментариев нет: