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

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

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

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

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

textual
Листинг программы
  1. using (ZipFile zip = new ZipFile())
  2. {
  3.    Stream stream = new MemoryStream();
  4.  
  5.    zip.AddEntry("text.txt", stream);
  6.    stream.Write(new byte[] { 0xFF, 0xFE }, 0, 2);
  7.    byte[] buffer = new byte[15000];
  8.    
  9.    using (SqlConnection Conn = new SqlConnection("Server=alpha;Database=ReferInfo;Integrated Security=false;User ID=sa;Pwd=Oj7s0Kde"))
  10.    {
  11.       Conn.Open();
  12.       using (SqlCommand Cmd = new SqlCommand("select * from T_DEF order by [id]", Conn))
  13.       {
  14.          
  15.          SqlDataReader reader = Cmd.ExecuteReader();
  16.          string Delimiter = "\t";
  17.          string Terminator = "\n";
  18.          Encoding enc = Encoding.Unicode;
  19.          while (reader.Read())
  20.          {
  21.             string Field = "";
  22.             for (int i = 0; i < reader.FieldCount; i++)
  23.             {
  24.                switch (reader[i].GetType().ToString())
  25.                {
  26.                   case "System.DateTime":
  27.                      Field = ((DateTime)reader[i]).ToString("yyyy-MM-dd HH:mm:ss");
  28.                      break;
  29.                   case "System.Decimal":
  30.                      Field = reader[i].ToString().Replace(",", ".");
  31.                      break;
  32.                   case "System.Double":
  33.                      Field = reader[i].ToString().Replace(",", ".");
  34.                      break;
  35.                   default:
  36.                      Field = reader[i].ToString().Replace(Delimiter, " ").Replace("\r", " ").Replace("\n", " ").Replace("  ", " ");
  37.                      if (Field.Length > 5000)
  38.                         Field = Field.Substring(1, 5000);
  39.                      break;
  40.                }
  41.                if (i != reader.FieldCount - 1)
  42.                   Field += Delimiter;
  43.                else
  44.                   Field += Terminator;
  45.                int cnt = enc.GetBytes(Field, 0, Field.Length, buffer, 0);
  46.                stream.Write(buffer, 0, cnt);
  47.                stream.Flush();
  48.             }
  49.          }
  50.          reader.Close();
  51.       }
  52.    }
  53.    zip.Save(@"c:\test.zip");
  54. }

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


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

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

15   голосов , оценка 4.133 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы