Реализация Stream для чтения из SqlDataReader - C#

Узнай цену своей работы

Формулировка задачи:

Нужен метод, который преобразует некоторые данные на входе (SqlDataReader) и возвращает Stream То, что я написал ниже - полная лажа, так как Stream возвращается только в конце, но как сделать правильно, не знаю.
Stream SaveSqlReaderToStream(SqlDataReader Reader)
{
   Stream Return = new TMemoryStream()
   while(Reader.Read)
   {
      //читаем Reader и пишем в Return
   }
   return Return;
}
Для архивации потока использую Ionic.Zip
ZipFile zip = new ZipFile();
Далее zip.AddEntry("data.txt", myStream);
Нужно чтоб работало так:
zip.AddEntry("data.txt", SaveSqlReaderToStream(Reader));

Решение задачи: «Реализация Stream для чтения из SqlDataReader»

textual
Листинг программы
using (ZipFile zip = new ZipFile())
{
   Stream stream = new MemoryStream();
 
   zip.AddEntry("text.txt", stream);
   stream.Write(new byte[] { 0xFF, 0xFE }, 0, 2);
   byte[] buffer = new byte[15000];
   
   using (SqlConnection Conn = new SqlConnection("Server=alpha;Database=ReferInfo;Integrated Security=false;User ID=sa;Pwd=Oj7s0Kde"))
   {
      Conn.Open();
      using (SqlCommand Cmd = new SqlCommand("select * from T_DEF order by [id]", Conn))
      {
         
         SqlDataReader reader = Cmd.ExecuteReader();
         string Delimiter = "\t";
         string Terminator = "\n";
         Encoding enc = Encoding.Unicode;
         while (reader.Read())
         {
            string Field = "";
            for (int i = 0; i < reader.FieldCount; i++)
            {
               switch (reader[i].GetType().ToString())
               {
                  case "System.DateTime":
                     Field = ((DateTime)reader[i]).ToString("yyyy-MM-dd HH:mm:ss");
                     break;
                  case "System.Decimal":
                     Field = reader[i].ToString().Replace(",", ".");
                     break;
                  case "System.Double":
                     Field = reader[i].ToString().Replace(",", ".");
                     break;
                  default:
                     Field = reader[i].ToString().Replace(Delimiter, " ").Replace("\r", " ").Replace("\n", " ").Replace("  ", " ");
                     if (Field.Length > 5000)
                        Field = Field.Substring(1, 5000);
                     break;
               }
               if (i != reader.FieldCount - 1)
                  Field += Delimiter;
               else
                  Field += Terminator;
               int cnt = enc.GetBytes(Field, 0, Field.Length, buffer, 0);
               stream.Write(buffer, 0, cnt);
               stream.Flush();
            }
         }
         reader.Close();
      }
   }
   zip.Save(@"c:\test.zip");
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы