powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как вставить много строк из двумерного массива
17 сообщений из 17, страница 1 из 1
Как вставить много строк из двумерного массива
    #39824513
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Завис в С++ на примитивной вещи. Не могу передать массив double rt[N][5] в таблицу SQLite.
Запрос простой - const char* INS = " insert into foo values(1, 2, 3, 4, 5 );"; Все работает.
Как сформировать строку этого запроса, с элементами массива rt? Или ссылку на инет, где это описано.
Все как-то с Питон или С#, а c С++ c БД не приходилось.(
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #39824535
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #39824617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше параметризованный запрос как выше посоветовали. Еще можно сформировать свой инсерт, читай про snprintf()
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #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
Как вставить много строк из двумерного массива
    #39824629
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущий вопрос снят. Изменен запрос, исключен begin;
В пакете ? не работает.
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #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
Как вставить много строк из двумерного массива
    #39824999
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесть какая. Почему prepare ВНУТРИ цикла?
Весь смысл в Prepar ed Statements в том, что их заранее подготовливают.

p.s. SQLLite использовал (Java), но C API не пользовался
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #39825060
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, не вижу никакой жести. Не надо драматизировать ситуацию.)
Задача стояла разобраться с С-API SQLite и сделать рабочую конструкцию. Далее, совершенству нет предела.
Следующим этапом в том числе и запланировано вынесение sqlite3_prepare_v2 и sqlite3_reset за пределы цикла.
Пока весь проект делается для оценки быстродействия SQLite через интерфейс C/C++ и возможностей его повышения в разумных пределах. После чего будет рассматриваться вопрос применимости для конкретных целей.
PS Интересно, кстати, что в инете большинство пишут данные в таблицы SQLite через char*. Возможно плохо искал, но экземплы с использованием sqlite3_bind_ не попадались.
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #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
Как вставить много строк из двумерного массива
    #39825093
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, все, что вы пишите, мне уже известно. И ранее уже сделано.
Кстати, вынос prepare за пределы цикла ничего существенного не дал. Что-то в пределах погрешности измерений.
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #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
Как вставить много строк из двумерного массива
    #39825129
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS Во всех фрагментах кода инициализация массива double rt[10000][5]; опущена.
...
Рейтинг: 0 / 0
Как вставить много строк из двумерного массива
    #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
Как вставить много строк из двумерного массива
    #39825438
NewBy52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevYUBA, подозреваю, что auto-commit mode Вы тоже забыли отключить.
Если это так, то нет ничего удивительного, что производительность ниже плинтуса
Его не надо специально отключать. При посылке команды
Код: plsql
1.
begin transaction

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

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


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