powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование SqlDataReader в Stream
19 сообщений из 44, страница 2 из 2
Преобразование SqlDataReader в Stream
    #39247809
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Сергей=,
Зачем ты пишешь строку и в юникоде?
Если писать в ascii - то размер будет в 2 разе меньше.
Если писать бинарные данные - размер очень сильно уменьшиться.
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247810
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и пример итератора
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
class CmdIterator : IEnumerable<byte[]>,IDisposable
    {
        IDbCommand cmd;
        IDataReader rdr;
        Encoding enc;
        
        public CmdIterator(IDbCommand cmd,Encoding enc)
        {
            this.cmd = cmd;
            this.enc = enc;
        }
        public IEnumerator<byte[]> GetEnumerator()
        {
            if (rdr != null) rdr.Dispose();
            rdr = cmd.ExecuteReader();
            yield return enc.GetPreamble();
            while (rdr.Read())
            {
                yield return format(rdr);
            }
            rdr.Dispose();
            rdr = null;
        }
        public byte[] format(IDataRecord r)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < r.FieldCount; ++i)
            {
                // форматировать по желанию до потери пульса
                sb.Append(r.GetValue(i).ToString());
                if (i== r.FieldCount-1) sb.Append("\r\n"); else sb.Append(',');
            }
            return enc.GetBytes(sb.ToString());
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }

        public void Dispose()
        {
            if (rdr != null)
            {
                rdr.Dispose();
                rdr = null;
            }
        }
    }


...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247816
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Сергей=Изопропил,
а как правильно употребить BStream?
а теперь собираем всё вместе:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
            SqlConnection conn = new SqlConnection("server=(local);database=test;integrated security=SSPI;");
            conn.Open();
            
            Stream src = new BStream(new CmdIterator(new SqlCommand("select * from foo", conn), Encoding.Unicode));
            Stream src1 = new BStream(new CmdIterator(new SqlCommand("select * from bar", conn), Encoding.UTF8));
            using (ZipFile zip = new ZipFile(@"c:\tmp\xyz.zip"))
            {
                zip.UseZip64WhenSaving = Zip64Option.Always;
                zip.Encryption = EncryptionAlgorithm.WinZipAes256;
                zip.Password = "MyPassword";
                zip.AddEntry("data.txt", src);
                zip.AddEntry("data1.txt", src1);
                zip.Save();
            }
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247819
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ, специфика данных накладывает необходимость выгрузки в Unicode / UTF-8. Так как данные в основном не на латинице, то большого смысла в UTF-8 нет.
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247826
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЕсли писать в ascii - то размер будет в 2 разе меньше.
во-первых ASCII - это только ASCII (0..127)
во-вторых кодовую страницу на каком основании назначать? (это только упоротые дельфийцы не понимают)
в третьих - zip поможет сжать unicode
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247861
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Не заметил, что могут быть строки.
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247869
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНе заметил, что могут быть строки.
грабли то зачем по дороге раскладывать?
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247950
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, всё работает! ОГРОМНОЕ спасибо за конкретную помощь и советы!!!
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39247958
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Сергей=,

внимательно изучи код, пригодится ещё
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248051
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
нужны ещё заголовки полей, а куда вставить в коде, чтоб ничего не сломать?
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248059
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уже сделал
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248066
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но не работает :(
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248085
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё, теперь точно работает! :)
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248093
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Сергей=но не работает :(
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 yield return enc.GetPreamble();
// сюда вставлять 
 yield return header(rdr);
//
while (rdr.Read())

....
 public byte[] header(IDataRecord r)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < r.FieldCount; ++i)
            {
                sb.Append(r.GetName(i));
                if (i == r.FieldCount - 1) sb.Append("\r\n"); else sb.Append(',');
            }
                return enc.GetBytes(sb.ToString());
        }
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248177
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Один фиг рано или поздно сломается, когда исходные таблицы еще больше раздуются.

Я бы прямо сейчас начал бить таблицы на куски и передавать одну таблицу в нескольких файлах
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248183
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Один фиг рано или поздно сломается, когда исходные таблицы еще больше раздуются.
да, когда место на диске закончится.
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248452
=Сергей=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, СПАСИБО огромное, всё работает как часы!!!
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248466
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ИзопропилCat2Один фиг рано или поздно сломается, когда исходные таблицы еще больше раздуются.
да, когда место на диске закончится.
Это будет очень скоро.

Но тоже спасибо. Я бы сам и не обратил внимания на новые фичи в 4.5
...
Рейтинг: 0 / 0
Преобразование SqlDataReader в Stream
    #39248467
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Я бы сам и не обратил внимания на новые фичи в 4.5
я пытался вообще-то под 2.0 совместимость сохранить(как в стартовом посте указано)
во всяком случае с target .NET Framework 2.0 собирается.

ну а как место закончится - бей на файлы, не бей - один хер не влезет и новое ТЗ нужно
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование SqlDataReader в Stream
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]