Реализация Stream для чтения из SqlDataReader - C#
Формулировка задачи:
Нужен метод, который преобразует некоторые данные на входе (SqlDataReader) и возвращает Stream
То, что я написал ниже - полная лажа, так как Stream возвращается только в конце, но как сделать правильно, не знаю.
Для архивации потока использую Ionic.Zip
Нужно чтоб работало так:
Листинг программы
- Stream SaveSqlReaderToStream(SqlDataReader Reader)
- {
- Stream Return = new TMemoryStream()
- while(Reader.Read)
- {
- //читаем Reader и пишем в Return
- }
- return Return;
- }
Листинг программы
- 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");
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д