Реализация 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");
}