Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Такая проблема, опишу суть.

Есть таблица в SQL server Compact, в ней 100 столбцов. Необходимо чтобы каждую секунду в каждый столбец записывалось соответствующее значение переменной.

Заполняю так.

            SQLcommand.CommandText = "INSERT into Variables (Time) Values(@time)";
            SQLcommand.Parameters.AddWithValue("@time", DateTime.Now.ToLongTimeString());
            SQLcommand.ExecuteNonQuery();
            SQLcommand.Parameters.Clear();

            for (int i = 0; i < 50; i++)
            {
                SQLcommand.CommandText = "INSERT into Variables (["+variables[i]+"]) Values(@value)";
                SQLcommand.Parameters.AddWithValue("@value", rnd.Next(1,100));
                SQLcommand.ExecuteNonQuery();
                SQLcommand.Parameters.Clear();
            }


Но это неверно, потому что, при каждом ExecuteNonQuery() как я понял это запись полностью строки, следующий ExecuteNonQuery уже с новой строки, что в коде нужно исправить, чтобы не начиналось с новой строки, а заполняло текующую?
3 ноя 14, 17:59    [16793134]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Забыл скриншот

К сообщению приложен файл. Размер - 82Kb
3 ноя 14, 18:00    [16793136]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
aleks2
Guest
Что-то вроде (за корректность синтаксиса не ручаюсь)
SQLcommand.CommandText = "INSERT into Variables Values(@time, @1, ... @фсе ваши поля)";
SQLcommand.Parameters.AddWithValue("@time", DateTime.Now.ToLongTimeString());
            for (int i = 0; i < 50; i++)
            {
                SQLcommand.Parameters.AddWithValue("@" + i, rnd.Next(1,100));
            }
SQLcommand.ExecuteNonQuery();
SQLcommand.Parameters.Clear();
3 ноя 14, 18:38    [16793222]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
aleks2,

SQLcommand.CommandText = "INSERT into Variables Values(@time, @1, ... @фсе ваши поля)";


Это не понял, надо все поля перечислять или это задание диапазона? Просто в рабочем варианте это около 1000 столбцов, перечислять все в коде не вариант, очевидно.
3 ноя 14, 18:47    [16793247]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
o-o
Guest
Anekto
aleks2,

SQLcommand.CommandText = "INSERT into Variables Values(@time, @1, ... @фсе ваши поля)";


Это не понял, надо все поля перечислять или это задание диапазона? Просто в рабочем варианте это около 1000 столбцов, перечислять все в коде не вариант, очевидно.


смешной вы товарищ, не надо было 1000 колонок плодить.
теперь именно что 1000 и перечислять.
но если хочется очень долго и назло себе и всем,
то делайте 1 INSERT,
а все остальные перепишите в UPDATE.
3 ноя 14, 18:52    [16793275]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
o-o,

Ну я не знаю, как по другому сделать логгирование значений 1000 переменных каждую секунду.

Каждая строка - секунда, каждый столбец - значение в эту секунду.

Ну я так и думал, что нужно через UPDATE делать, спасибо что подтвердили догадку.
3 ноя 14, 19:06    [16793316]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
o-o
Guest
Anekto,

обычно делают 2 колонки: "время когда" + значение.
и потом вставляют 2 значения за раз (dt + val): хоть 1000, хоть 100000.
+ разворачивают при выводе на экран.

представьте, что теперь надо вывести значения с 380-ой секунды по 764-ую.
я-то отфильтрю [и разверну. если очень надо. в столбце все же удобней 384 значения разглядывать],
а вам придется писать SELECT, где перечислять в явном виде [380], [381],...,[764]
3 ноя 14, 19:15    [16793346]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
o-o,

Мне не надо ничего выводить, по окончании 5 минут вывести все это в эксель, сохранить файл и очистить таблицу, и так по кругу. Таблица нужна просто для временного хранения, чтобы если вдруг какой-то сбой, то значения не потерялись. В экселе же файл будет пустой при сбое.

Насчет двух столбцов, можно подробнее или где найти информацию, я не совсем понял такой подход.
3 ноя 14, 19:26    [16793376]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Anekto
Ну я не знаю, как по другому сделать логгирование значений 1000 переменных каждую секунду.
У вас прямо в функции на бейсике 1000 переменных? Ну так и в сиквеле перечисляйте 1000 столбцов, раз вам так привычнее.
3 ноя 14, 20:51    [16793703]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
o-o
Guest
Anekto
o-o,
Насчет двух столбцов, можно подробнее или где найти информацию, я не совсем понял такой подход.

все просто.
только будем 3 столбца использовать, чтобы еще и "название столбца" хранить.
в том же цикле делаете свои 100 вставок,
только название столбца теперь -- это не то, куда вставляете, а то, что идет во вторую колонку.
т.е. будет вставлена не одна строка, а как сейчас у вас, все 100,
только не "ёлочкой", а обычно:
create table Variables(t time, col_name varchar(5), val int)
insert into Variables (t, col_name, val) Values(@time, @variable, @value)

вставится в виде:

t col_name val
17:53:51 XA.YD 87
17:53:51 HC.RG 36
17:53:51 UI.IK 17


потом pivot в том же экселе, и все будет развернуто.
но вроде для вашей задачи и как есть сойдет :)
3 ноя 14, 22:47    [16794310]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
alexeyvg,

Нет, переменные это название которое никак не связано с моей программой.

Суть такая, это вообще логгер, я с сервера получаю каждую секуду 1000 различных значений, связанных с определенными названием.

что-то вроде string[] variables = server.GetAllValues(). Мне приходит массив с тысячей значений. Ну и они все идут по порядку, так что я знаю, что variables[0] это например numeric.saw.int16 - название у этой переменной на сервере. Ну и необходимо все эти 1000 переменных записывать каждую секунду, в минуту это 60000 строк, за 10 минут 600000.

Я уже перешел к Двум столбцам - время и значение. так записывается за приемлемое время.

Но вот другая проблема образовалась по истечении 20 минут нужно все эти значения перенести из базы в Excel и очистить базу.

Методом

  myCommand.CommandText = "SELECT * FROM Variables";
            reader = myCommand.ExecuteReader();
            while (reader.Read()){
Запись в excel}


Записывается КРАЙНЕ долго, 1 минута записи в базу, равна 20 секундам записи в excel при 150 переменных. Причем если писать в excel напрямую 1000 значений в секунду, то он делает это за 10мс каждую строчку.

Выход конечно записывать параллельно вместе с записью в базу, тогда весь процесс занимает около 100мс(запись в sql базу и в excel). А запись из базы в excel использовать в случае сбоя, когда прервалась запись в excel и данные потерялись. Но и в этом случае, если сбой произошел на середине операции(10 минут) То операция вывода из базы в excel будет длиться около 1200 секунд при 1000 переменных. методом reader.Read().

Подскажите, как решить эту проблему, пока моих знаний недостаточно вообще.
3 ноя 14, 23:06    [16794424]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Anekto
Это не понял, надо все поля перечислять или это задание диапазона? Просто в рабочем варианте это около 1000 столбцов, перечислять все в коде не вариант, очевидно.
Если вы не можете запрограммировать генерацию строки, которая будет содержать все ваши переменные, то перечисляйте руками... или смените профессию.
3 ноя 14, 23:11    [16794459]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
o-o,

автор
insert into Variables (t, col_name, val) Values(@time, @variable, @value)

Да, сейчас так и пишу в базу, как вы описали, это выходит в худшем случае 1000 строк в секунду, 60000 в минуту и 600000 в 10 минут, но время записи хорошее, 50 - 100 мс. Даже избавился уже от названий переменных, потому что могу до записи узнать в каком порядке они идут, итого просто 2 столбца.

автор
потом pivot в том же экселе, и все будет развернуто.


Вот как бы мне из базы эти 600000 значений по 1000 в строчку записать в excel за приемлемое время, пока после 10 минут записи в базу, в excel все это выводится за примерно то же время. методом reader.Read(), пока использую это как резерв.
3 ноя 14, 23:13    [16794466]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
o-o
Guest
Anekto,

а обязательно программно переносить?
мастер экспорта/импорта когда-нибудь использовали?
им быстрее перенесете + пакет можно сохранить и в дальнейшем запускать
3 ноя 14, 23:15    [16794475]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Mind,

Могу сгенерировать, но не могу понять зачем это делать в данном случае, если можно сделать более быстро и аккуратно.
3 ноя 14, 23:15    [16794478]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
o-o,

Нет, таким не пользовался еще, посмотрю в этом направлении, спасибо.
3 ноя 14, 23:20    [16794492]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
o-o
Guest
Anekto
Mind,
Могу сгенерировать, но не могу понять зачем это делать в данном случае, если можно сделать более быстро и аккуратно.

1 раз вставить строку в 1000 колонок куда быстрее, чем 1000 раз вставить по одной.
вам намекают, что саму строку вставки надо циклом сгенерить, а не 1000 вставок.
хотя я никак не пойму, эти 1000 значений сразу известны или по одному каждую секунду выплывают
3 ноя 14, 23:23    [16794508]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
o-o,


автор
1 раз вставить строку в 1000 колонок куда быстрее, чем 1000 раз вставить по одной.
вам намекают, что саму строку вставки надо циклом сгенерить, а не 1000 вставок.
хотя я никак не пойму, эти 1000 значений сразу известны или по одному каждую секунду выплывают


1000 значений выплывают каждую секунду новые, грубо говоря каждую секунду выплывает string[] variables с 1000 значений. Сейчас попробую с генерацией строки и 1000 столбцами, но боюсь что запись в Excel может опять не устроить.
3 ноя 14, 23:31    [16794555]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Сделал я через генерацию строки, делаю 1 запрос и одну строку в секунду на 1000 столбцов, время заполнения отличное. Но проблема с переносом в Excel осталась. При 150 значениях 60 строк в 150 столбцов переносится в excel с помощью Execute reader, while(reader.read()) за 10 секунд, соответственно при более большом количестве значений и времени работы, это будет занимать в разы больше. Этот вариант опять же годится только как резервный.

Может какая-то проблема в.

myCommand.CommandText = "SELECT * table";
reader = myCommand.ExecuteReader();
while (reader.Read())
{
myExcelWorksheet.Cells[q, 1] = reader["Time"];
for (int i = 1; i <= server.browser.Count; i++)
{
myExcelWorksheet.Cells[q, i + 1] = reader[server.browser.Item(i).ToString().Replace(".", "")];
}
q++;
}


Крайне долго выполняется(150 столбцов, 60 строк = 9940мс), можно ли как-то увеличить скорость? Или только мастер экспорта из таблицы поможет?
4 ноя 14, 09:31    [16795218]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anekto
можно ли как-то увеличить скорость?

Пишите все в текстовый файл с расширением CSV.
Excel его открывает на раз.
4 ноя 14, 10:01    [16795269]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Просто в рабочем варианте это около 1000 столбцов
Пристрелить архитектора уже предлагали ? :)
4 ноя 14, 10:03    [16795276]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Glory,

Не, сама запись в эксель этим же методом отдельно от базы проходит за 10мс, тут дело именно в чтении из базы.
4 ноя 14, 10:22    [16795313]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anekto
тут дело именно в чтении из базы.

Что вы называете "чтением из базы" ? (reader.Read()) что ли ?
4 ноя 14, 10:26    [16795321]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Anekto
Member

Откуда:
Сообщений: 88
Glory,

Извиняюсь, не за 10, наврал, много больше.

Да, я это имею ввиду. в CSV не проверял еще, сейчас посмотрю.
4 ноя 14, 10:29    [16795330]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение 100 столбцов.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Anekto
Да, я это имею ввиду.

(reader.Read()) - это не чтение из базы
Вот ваш ExecuteReader() весь результат себе выбрал ? или за каждой следующей записью обращается к серверу ?
4 ноя 14, 10:31    [16795334]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить