Тяпниичная задачка.
Тяпниичная задачка.
В общем - пинаю те же проблемы, что описаны в ветке "Совсем не понимаю..."
И вот в процессе творческого поиска у меня родилась такая тупая функция.
public DataTable FillXml(string sql, FileStream fs)
{
DataTable dt = null;
int model = 0;
try
{
OracleConnection oraCN = new OracleConnection();
oraCN.ConnectionString = _connectionString;
OracleCommand cmd = new OracleCommand(sql, oraCN);
oraCN.Open();
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
using (BinaryWriter bw = new BinaryWriter(fs, Encoding.UTF8))
{
byte[] lead = new byte[3] { 0xEF, 0xBB, 0xBF };
byte[] xml = Encoding.UTF8.GetBytes("");
byte[] ds = Encoding.UTF8.GetBytes("");
byte[] tl = Encoding.UTF8.GetBytes("");
bw.Write(lead);
bw.Write(xml);
bw.Write(ds);
int rowcount = 0;
byte[] buffer = new byte[7000];
while (reader.Read())
{
switch (model)
{
case 0:
string val1 = reader.GetString(0);
bw.Write(val1);
break;
case 1:
string val2 = reader.GetString(0);
byte[] ln = Encoding.UTF8.GetBytes(val2);
bw.Write(ln);
break;
case 2:
long reads = reader.GetBytes(0, 0, buffer, 0, 300);
bw.Write(buffer, 0, (int)reads);
break;
}
++rowcount;
}
bw.Write(tl);
}
}
catch (Exception ex)
{
string msg = ex.Message;
}
return dt;
}
Ожидаемый результат - хмл-файл, ДатаТабле пока не используется. Точнее - ДатаТабле обыгрывается в вызывающем методе. Ну да вопрос не в ней.
Передаваемая Скл-строка - производит таблицу из одного поля в котором записывается хмл-враппированная информация по одной строке в таблице. запись - длинная. Сколько именно - немного зависит от данных, но примерно 8К...
По приведенному коду у меня возникли следующие вопросики:
Метод 0.
Какая информация пишется в выходной файл помимо содержимого поля?
Подсказка - там два байта в одном месте и один байт - в другом.
Метод 1:
Какой объем памяти будет использован?
Единственный работающий метод, но ме-е-едленый... мои 250 Мб качаются 5-6 минут...
Метод 2:
Какой именно каст является недопустимым?
В начале функции написана перекодировка строковых констант в byte[].
Что будет иметь место если не перекодировать?
Напомню - используется BinaryWriter...
Отдельный вопросик:
Почему ФАР корректно определяет кодировку файла если файл записан datatable.WriteXml(stream);
и не определяет ее правильно если файл писан бинаривритером?
Заголовки и содержимое у файлов одинаковые.