Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как вставить много строк из двумерного массива / 17 сообщений из 17, страница 1 из 1
08.06.2019, 22:28
    #39824513
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Завис в С++ на примитивной вещи. Не могу передать массив double rt[N][5] в таблицу SQLite.
Запрос простой - const char* INS = " insert into foo values(1, 2, 3, 4, 5 );"; Все работает.
Как сформировать строку этого запроса, с элементами массива rt? Или ссылку на инет, где это описано.
Все как-то с Питон или С#, а c С++ c БД не приходилось.(
...
Рейтинг: 0 / 0
09.06.2019, 03:17
    #39824535
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
...
Рейтинг: 0 / 0
09.06.2019, 14:17
    #39824617
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Лучше параметризованный запрос как выше посоветовали. Еще можно сформировать свой инсерт, читай про snprintf()
...
Рейтинг: 0 / 0
09.06.2019, 16:19
    #39824626
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Не пойму, чего она от меня хочет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
double a = 1.23456;
	const char* QW = "begin; insert into foo(a0) values( ? ); commit;";
	sqlite3_stmt *ppStmt;
	const char      *tail;
	int er;
	er=sqlite3_prepare_v2(db, QW,1000, &ppStmt, &tail);
	printf(" Err1 %d \n", er);
	er=sqlite3_bind_double(ppStmt, 1, a);
	printf(" Err2 %d \n", er);
	er=sqlite3_step(ppStmt);
	printf(" Err3 %d \n", er);
	er=sqlite3_step(ppStmt); //?
	printf(" Err4 %d \n", er);
	er=sqlite3_step(ppStmt); //?
	printf(" Err5 %d \n", er);
	er=sqlite3_reset(ppStmt);
	printf(" Err6 %d \n", er);
	er=sqlite3_finalize(ppStmt);
	printf(" Err7 %d \n", er);


Коды ощибок
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Err1 0
 Err2 25
 Err3 101
 Err4 1
 Err5 1
 Err6 1
 Err7 0

Err2 25 - (25) SQLITE_RANGE
Ошибка SQLITE_RANGE указывает на то, что аргумент номера параметра одной из подпрограмм sqlite3_bind или номер столбца в одной из подпрограмм sqlite3_column находится вне допустимого диапазона.
Не понимаю, что она хочет?
...
Рейтинг: 0 / 0
09.06.2019, 17:00
    #39824629
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Предыдущий вопрос снят. Изменен запрос, исключен begin;
В пакете ? не работает.
...
Рейтинг: 0 / 0
09.06.2019, 20:29
    #39824651
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Вопрос решен.
Полностью рабочий код
Код: plaintext
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.
const char* QW = "insert into foo(a0,a1,a2,a3,a4) values( ?, ?, ?, ?, ? );";
	double rt[10000][5]; //инициализация массива опущена
        sqlite3_stmt *ppStmt;
	const char      *tail;
	int er;
	i = 0;  j = 0;
	
	er = sqlite3_prepare_v2(db, "begin;", 10, &ppStmt, &tail);
	printf(" ErrBeg %d \n", er);
	er = sqlite3_step(ppStmt);
	printf(" ErrBeg2 %d \n", er);
	for (i = 0;i < 100;i++)
	{
		        er = sqlite3_prepare_v2(db, QW, 1000, &ppStmt, &tail);
			printf(" Err1 %d \n", er);
			er = sqlite3_bind_double(ppStmt, 1, rt[i][j]);
			printf(" Err2.0 %d \n", er);
			er = sqlite3_bind_double(ppStmt, 2, rt[i][j + 1]);
			printf(" Err2.1 %d \n", er);
			er = sqlite3_bind_double(ppStmt, 3, rt[i][j + 2]);
			printf(" Err2.2 %d \n", er);
			er = sqlite3_bind_double(ppStmt, 4, rt[i][j + 3]);
			printf(" Err2.3 %d \n", er);
			er = sqlite3_bind_double(ppStmt, 5, rt[i][j + 4]);
			printf(" Err2.4 %d \n", er);
			er = sqlite3_step(ppStmt);
			printf(" Err3 %d \n", er);
			er = sqlite3_reset(ppStmt);
	}
	
        printf(" Err6 %d \n", er);
	er = sqlite3_prepare_v2(db, "commit;", 10, &ppStmt, &tail);
	printf(" ErrCom %d \n", er);
	er = sqlite3_step(ppStmt);
	er = sqlite3_finalize(ppStmt);
	printf(" Err7 %d \n", er);
	printf(" ErrCom2 %d \n", er);

printf() вставлены для отладки.
...
Рейтинг: 0 / 0
10.06.2019, 15:53
    #39824999
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Жесть какая. Почему prepare ВНУТРИ цикла?
Весь смысл в Prepar ed Statements в том, что их заранее подготовливают.

p.s. SQLLite использовал (Java), но C API не пользовался
...
Рейтинг: 0 / 0
10.06.2019, 18:05
    #39825060
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Leonid Kudryavtsev, не вижу никакой жести. Не надо драматизировать ситуацию.)
Задача стояла разобраться с С-API SQLite и сделать рабочую конструкцию. Далее, совершенству нет предела.
Следующим этапом в том числе и запланировано вынесение sqlite3_prepare_v2 и sqlite3_reset за пределы цикла.
Пока весь проект делается для оценки быстродействия SQLite через интерфейс C/C++ и возможностей его повышения в разумных пределах. После чего будет рассматриваться вопрос применимости для конкретных целей.
PS Интересно, кстати, что в инете большинство пишут данные в таблицы SQLite через char*. Возможно плохо искал, но экземплы с использованием sqlite3_bind_ не попадались.
...
Рейтинг: 0 / 0
10.06.2019, 18:43
    #39825082
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
IMHO prepare внутри цикла, полное не понимание для чего же этот самый prepare делается

https://www.sqlite.org/c3ref/stmt.html

Prepared Statement Object
...
1 Create the prepared statement object using sqlite3_prepare_v2().
2 Bind values to parameters using the sqlite3_bind_*() interfaces.
3 Run the SQL by calling sqlite3_step() one or more times.
4 Reset the prepared statement using sqlite3_reset() then go back to step 2. Do this zero or more times.

6 Destroy the object using sqlite3_finalize().
...


Пока весь проект делается для оценки быстродействия
Тогда жесть вдвойне. Оценивать быстродействие по изначально кривому коду.
Вы бы еще ф-цию sleep в "тест для быстродействия" запихали )))
...
Рейтинг: 0 / 0
10.06.2019, 19:21
    #39825093
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Leonid Kudryavtsev, все, что вы пишите, мне уже известно. И ранее уже сделано.
Кстати, вынос prepare за пределы цикла ничего существенного не дал. Что-то в пределах погрешности измерений.
...
Рейтинг: 0 / 0
10.06.2019, 22:42
    #39825128
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Фрагмент последней версии кода записи массива в БД с вынесенным за пределы цикла sqlite3_prepare_v2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
double rt[10000][5];
int i, j;
const char* QW = "insert into foo(a0,a1,a2,a3,a4) values( ?, ?, ?, ?, ? );";
sqlite3_stmt *ppStmt;
const char      *tail;
int er;
i = 0;  j = 0;
t0 = clock();
er = sqlite3_prepare_v2(db, "begin;", 10, &ppStmt, &tail);
er = sqlite3_step(ppStmt);
er = sqlite3_prepare_v2(db, QW, 250, &ppStmt, &tail);
for (i = 0;i < 1000;i++)
	{
	 er = sqlite3_bind_double(ppStmt, 1, rt[i][j]);
	 er = sqlite3_bind_double(ppStmt, 2, rt[i][j + 1]);
	 er = sqlite3_bind_double(ppStmt, 3, rt[i][j + 2]);
	 er = sqlite3_bind_double(ppStmt, 4, rt[i][j + 3]);
	 er = sqlite3_bind_double(ppStmt, 5, rt[i][j + 4]);
	 er = sqlite3_step(ppStmt);
	 er = sqlite3_reset(ppStmt);    
	}
er = sqlite3_prepare_v2(db, "commit;", 10, &ppStmt, &tail);
er = sqlite3_step(ppStmt);
er = sqlite3_finalize(ppStmt);

В смысле быстродействия, как писалось ранее это ничего не дает, и не могло дать, т.к. основное время выполнения запроса занимают дисковые операции.
Уже писал в другой теме, что аналогичная БД в :memory: выполняет этот запрос за 3 мс. Код, приведенный в этом фрагменте и фрагменте выше, за 120-130 мс. На долю sqlite3_prepare_v2 приходится небольшая часть из этих 3 мс, что никак не может влиять на быстродействие программы в целом.
...
Рейтинг: 0 / 0
10.06.2019, 22:45
    #39825129
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
PS Во всех фрагментах кода инициализация массива double rt[10000][5]; опущена.
...
Рейтинг: 0 / 0
11.06.2019, 14:37
    #39825421
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
YUBA, подозреваю, что auto-commit mode Вы тоже забыли отключить.
Если это так, то нет ничего удивительного, что производительность ниже плинтуса

By default, SQLite is in auto-commit mode. It means that for each command, SQLite starts, processes, and commits the transaction automatically.

http://www.sqlitetutorial.net/sqlite-transaction/
...
Рейтинг: 0 / 0
11.06.2019, 15:15
    #39825438
NewBy52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Leonid KudryavtsevYUBA, подозреваю, что auto-commit mode Вы тоже забыли отключить.
Если это так, то нет ничего удивительного, что производительность ниже плинтуса
Его не надо специально отключать. При посылке команды
Код: plsql
1.
begin transaction

он автоматически отключается.
...
Рейтинг: 0 / 0
11.06.2019, 15:43
    #39825451
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
Тогда у автора результаты замеров скорости какие-то странные.
Файловая БД SQLite в памяти.
...
Рейтинг: 0 / 0
11.06.2019, 19:11
    #39825574
YUBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
NewBy52Его не надо специально отключать. При посылке команды
Код: plsql
1.
begin transaction

он автоматически отключается.Полагаю, вы несколько отстали от жизни, достаточно просто begin;. См. код, кстати.
...
Рейтинг: 0 / 0
11.06.2019, 21:49
    #39825608
NewBy52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вставить много строк из двумерного массива
YUBAПолагаю, вы несколько отстали от жизни, достаточно просто begin;. См. код, кстати.
Просто "достаточно". Но ведь не "необходимо и достаточно"?
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как вставить много строк из двумерного массива / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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