Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ограничение по числу столбцов. Код на С. / 9 сообщений из 9, страница 1 из 1
05.12.2014, 18:50
    #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
11.12.2014, 17:58
    #38831802
sncpress
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по числу столбцов. Код на С.
Похоже знатоков проблемы тут нет.
...
Рейтинг: 0 / 0
11.12.2014, 21:17
    #38831936
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по числу столбцов. Код на С.
Какого лешего вы препарируете запрос внутри цикла, если там должен быть исключительно вызов с (фактическими) параметрами???
...
Рейтинг: 0 / 0
12.12.2014, 11:24
    #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
12.12.2014, 19:37
    #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
16.12.2014, 14:22
    #38835080
sncpress
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по числу столбцов. Код на С.
1. На все байнды под отладчиком у меня проходит ОК. Поэтому проверять я его сейчас не буду.
2. stdafx мне нужен, т.к. проект MFC.
3. sqlite3_finalize нужен иначе memory leaks.

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

P.S. Вопрос остался не решенным.
...
Рейтинг: 0 / 0
16.12.2014, 21:03
    #38835498
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по числу столбцов. Код на С.
sncpressВывод: ответ есть, но бесполезный, потому как не ответ вовсе.
1) Вывод неправильный. Ответ полезный, действий не видно.
2) sqlite3_exec(db, "DROP TABLE IF EXISTS \'testtable\'", 0, 0, 0);
Что за \' ?
...
Рейтинг: 0 / 0
17.12.2014, 20:04
    #38836406
pirovindos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по числу столбцов. Код на С.
А что возвращают
result = sqlite3_step(statement);
и result = sqlite3_finalize(statement);
?
...
Рейтинг: 0 / 0
18.12.2014, 08:25
    #38836610
PPA
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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ограничение по числу столбцов. Код на С. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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