powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ограничение по числу столбцов. Код на С.
9 сообщений из 9, страница 1 из 1
Ограничение по числу столбцов. Код на С.
    #38826597
sncpress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

В новый проект на Microsoft Visual Studio 2013 + MFC добавил sqlite3.c, shell.c, sqlite3.h и sqlite3ext.h из sqlite-amalgamation-3080702.zip
Создаю новую таблицу. Добавляю в нее поля и данные. Сохраняю. Только в базе сохраняется максимум 10 полей.
В чем может быть проблема?

Вот код:

stdafx.H файл--------------------------------
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#define SQLITE_CORE = 1
#define SQLITE_ENABLE_COLUMN_METADATA
#define SQLITE_ENABLE_STAT2
#define SQLITE_DEFAULT_RECURSIVE_TRIGGERS = 1
#define SQLITE_ENABLE_FTS3
#define SQLITE_ENABLE_FTS3_PARENTHESIS
#define SQLITE_ENABLE_RTREE
#define SQLITE_ENABLE_ICU
#define SQLITE_DEFAULT_PAGE_SIZE = 8192
#define SQLITE_DEFAULT_CACHE_SIZE = 8000
#define SQLITE_DEFAULT_TEMP_CACHE_SIZE = 2000
#define SQLITE_DEFAULT_FILE_FORMAT = 4
#define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT = 1048576
#define SQLITE_THREADSAFE = 1
#define SQLITE_ENABLE_LOAD_EXTENSION = 1


stdafx.H файл--------------------------------

CPP файл ----------------------------
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
void InsertTable()
{
	sqlite3 *db;
	if (sqlite3_open("C:\\test_dump_base.sqltdb", &db) == SQLITE_OK)
	{
		sqlite3_stmt *statement;
		sqlite3_limit(db, SQLITE_LIMIT_ATTACHED, 50);
		sqlite3_limit(db, SQLITE_LIMIT_COLUMN, 2000);

		sqlite3_exec(db, "DROP TABLE IF EXISTS \'testtable\'", 0, 0, 0);
		if (sqlite3_prepare_v2(db, "CREATE TABLE IF NOT EXISTS \'testtable\' (ID LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, "\
			"TECHNUM INTEGER, POSINBASE INTEGER, NAME TEXT, POSBX INTEGER, POSBY INTEGER, "\
			"POSEX INTEGER, POSEY INTEGER, STARTNODENUM INTEGER, STARTNODEPOS INTEGER, "\
			"ENDNODENUM INTEGER, ENDNODEPOS INTEGER, LABELPOSX REAL, LABELPOSY REAL, TYPELINE INTEGER);", -1, &statement, 0) == SQLITE_OK)
		{
			char *zErrMsg = 0;
			int result = 0;
			result = sqlite3_step(statement); 
			result = sqlite3_finalize(statement);
			sqlite3_stmt * item_insert;
			sqlite3_exec(db, "BEGIN", 0, 0, 0);

			for (int i = 0; i < 5000; i++)
			{
				char insert_query[] = "INSERT INTO \'testtable\' (ID, TECHNUM, POSINBASE, NAME, POSBX, POSBY, POSEX, POSEY, STARTNODENUM, STARTNODEPOS, ENDNODENUM, ENDNODEPOS, LABELPOSX, LABELPOSY, TYPELINE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
				result = sqlite3_prepare_v2(db, insert_query, sizeof(insert_query), &item_insert, NULL);
				if (result == SQLITE_OK)
				{
					std::string name("test");
					sqlite3_bind_int(item_insert, 1, i + 1);
					sqlite3_bind_int(item_insert, 2, i + 1);
					sqlite3_bind_int(item_insert, 3, i + 1);
					sqlite3_bind_text(item_insert, 4, name.c_str(), name.length(), 0);

					sqlite3_bind_int(item_insert, 5, i + 1);
					sqlite3_bind_int(item_insert, 6, i + 1);
					sqlite3_bind_int(item_insert, 7, i + 1);
					sqlite3_bind_int(item_insert, 8, i + 1);

					sqlite3_bind_int(item_insert, 9, i + 1);
					sqlite3_bind_int(item_insert, 10, i + 1);
					sqlite3_bind_int(item_insert, 11, i + 1);
					sqlite3_bind_int(item_insert, 12, i + 1);
					sqlite3_bind_double(item_insert, 13, (double)(i + 1));
					sqlite3_bind_double(item_insert, 14, (double)(i + 1));
					sqlite3_bind_int(item_insert, 15, (i + 1));
					sqlite3_step(item_insert); 
					sqlite3_reset(item_insert);
					sqlite3_finalize(item_insert);
				}
			}
			sqlite3_exec(db, "COMMIT", 0, 0, 0);
		}
		sqlite3_close(db);

        }
}


CPP файл ----------------------------
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38831802
sncpress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже знатоков проблемы тут нет.
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38831936
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какого лешего вы препарируете запрос внутри цикла, если там должен быть исключительно вызов с (фактическими) параметрами???
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38832241
sncpress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
void InsertTable()
{
	sqlite3 *db;
	if (sqlite3_open("C:\\test_dump_base.sqltdb", &db) == SQLITE_OK)
	{
		sqlite3_stmt *statement;
		sqlite3_limit(db, SQLITE_LIMIT_ATTACHED, 50);
		sqlite3_limit(db, SQLITE_LIMIT_COLUMN, 2000);

		sqlite3_exec(db, "DROP TABLE IF EXISTS \'testtable\'", 0, 0, 0);
		if (sqlite3_prepare_v2(db, "CREATE TABLE IF NOT EXISTS \'testtable\' (ID LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, "\
			"TECHNUM INTEGER, POSINBASE INTEGER, NAME TEXT, POSBX INTEGER, POSBY INTEGER, "\
			"POSEX INTEGER, POSEY INTEGER, STARTNODENUM INTEGER, STARTNODEPOS INTEGER, "\
			"ENDNODENUM INTEGER, ENDNODEPOS INTEGER, LABELPOSX REAL, LABELPOSY REAL, TYPELINE INTEGER);", -1, &statement, 0) == SQLITE_OK)
		{
			char *zErrMsg = 0;
			int result = 0;
			result = sqlite3_step(statement); 
			result = sqlite3_finalize(statement);
			sqlite3_stmt * item_insert;
			sqlite3_exec(db, "BEGIN", 0, 0, 0);

			char insert_query[] = "INSERT INTO \'testtable\' (ID, TECHNUM, POSINBASE, NAME, POSBX, POSBY, POSEX, POSEY, STARTNODENUM, STARTNODEPOS, ENDNODENUM, ENDNODEPOS, LABELPOSX, LABELPOSY, TYPELINE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
			result = sqlite3_prepare_v2(db, insert_query, sizeof(insert_query), &item_insert, NULL);
			for (int i = 0; i < 5000; i++)
			{
				if (result == SQLITE_OK)
				{
					std::string name("test");
					sqlite3_bind_int(item_insert, 1, i + 1);
					sqlite3_bind_int(item_insert, 2, i + 1);
					sqlite3_bind_int(item_insert, 3, i + 1);
					sqlite3_bind_text(item_insert, 4, name.c_str(), name.length(), 0);

					sqlite3_bind_int(item_insert, 5, i + 1);
					sqlite3_bind_int(item_insert, 6, i + 1);
					sqlite3_bind_int(item_insert, 7, i + 1);
					sqlite3_bind_int(item_insert, 8, i + 1);

					sqlite3_bind_int(item_insert, 9, i + 1);
					sqlite3_bind_int(item_insert, 10, i + 1);
					sqlite3_bind_int(item_insert, 11, i + 1);
					sqlite3_bind_int(item_insert, 12, i + 1);
					sqlite3_bind_double(item_insert, 13, (double)(i + 1));
					sqlite3_bind_double(item_insert, 14, (double)(i + 1));
					sqlite3_bind_int(item_insert, 15, (i + 1));
					sqlite3_step(item_insert); 
				}
			}
			sqlite3_reset(item_insert);
			sqlite3_finalize(item_insert);
			sqlite3_exec(db, "COMMIT", 0, 0, 0);
		}
		sqlite3_close(db);

        }
}



Не помогло.

Модератор: Используйте тег SRC
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38832918
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sncpress,

stdafx.h - убрать нафиг. Все эти дефайны ничего для твоего кода не делают, но тебя самого с толку сбивают.


Добавь проверки на ошибки. Убедись что каждый sqlite3_bind_*() возвращает SQLITE_OK а не что-то другое.


Читай документацию на sqlite3_step(), sqlite3_reset() и sqlite3_finalize(). Сейчас ты их лепишь бессистемно и без реального понимания что они делают.


Открой для себя удобство проверки на "не равно".
Код: plaintext
1.
2.
3.
4.
5.
if(sqlite3_prepare_v2( .... ) != SQLITE_OK) {
   printf("Умерли потому что: %s\n", sqlite3_errmsg(db));
   return;
}
// все нормально, продолжаем работать.

И не нужно будет делать гигантских лесенок.
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38835080
sncpress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. На все байнды под отладчиком у меня проходит ОК. Поэтому проверять я его сейчас не буду.
2. stdafx мне нужен, т.к. проект MFC.
3. sqlite3_finalize нужен иначе memory leaks.

Вывод: ответ есть, но бесполезный, потому как не ответ вовсе.

P.S. Вопрос остался не решенным.
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38835498
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sncpressВывод: ответ есть, но бесполезный, потому как не ответ вовсе.
1) Вывод неправильный. Ответ полезный, действий не видно.
2) sqlite3_exec(db, "DROP TABLE IF EXISTS \'testtable\'", 0, 0, 0);
Что за \' ?
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38836406
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что возвращают
result = sqlite3_step(statement);
и result = sqlite3_finalize(statement);
?
...
Рейтинг: 0 / 0
Ограничение по числу столбцов. Код на С.
    #38836610
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sncpress,

Зачем ты используешь "голый" С у тебя ведь проект на MFC
тебе нужны эти лишние грабли с утечками и ошибками?

Возьми как я С++ обертку
https://github.com/pavel-pimenov/flylinkdc-r5xx/tree/master/client/sqlite

Создание таблички
https://github.com/pavel-pimenov/flylinkdc-r5xx/blob/master/client/CFlylinkDBManager.cpp#L575
Пример вставки в цикле с транзакцией
https://github.com/pavel-pimenov/flylinkdc-r5xx/blob/master/client/CFlylinkDBManager.cpp#L1362
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ограничение по числу столбцов. Код на С.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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