Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2011, 13:21   #1
Посторонним_В
Новичок
Джуниор
 
Регистрация: 14.08.2011
Сообщений: 1
По умолчанию Windows. ODBC. MDB база. Проблема с SQLColumns

Коллеги, кто работал с функциями ODBC напрямую? передо мной задача - получить полное описание всех таблиц в базе MDB. Список таблиц я прекрасно получаю и обрабатываю с помощью SQLTables. Список колонок получается при помощи SQLColumns. С именами и типами данных все в порядке. А вот с признаком NOT NULL - нет! Сколько бы ни было в таблице колонок NOT NULL, для всех них возвращается NULLABLE = 1 (11 позиция) и ISNULLABLE = "YES" (18 позиция). А для меня это важно - от этого будут зависеть дальнейшие действия в алгоритме, обработка ситуации "нет нужных данных"

У гугля спрашивал - только еще 1 человек в 2006 году интересовался подобным, и ему никто не ответил....
Вот есть программка http://alekseyrybakov.narod.ru/ViewODBC.zip, так она показывает все правильно. Посмотрел таблицу импорта exe-шника - автор вроде тоже пользуется SQLColumns, включил трассировку ODBC, и потом у себя воспроизвел те же вызовы с теми же параметрами - и нифига. Правда, он получает данные из result set-а, сделав предварительно SQLBindCol, как в примере в MSDN, а я через SQLGetData, но это же непринципиально, ИМХО. Я и через SQLBindCol пробовал, те же яйца.

Написал тестовую прогу, она коннектится к базе db1.mdb, лежащей в текущем каталоге, создает таблицу с двумя NOT NULL колонками, и запрашивает инфу о колонках этой таблицы. Если обнаружена колонка NOT NULL, то должен выскочить MessageBox.

Я уж пробовал и Nullable вместо SQLSMALLINT определять как SQLINTEGER - ничего не меняется, никак не получается отдетектить. Может, я ошибаюсь где-то в программе? У меня такое чувство, что есть какая-то хитрость, которую знают все, кроме меня, потому что с виду все просто (для меня), и я не пойму, что можно подправить в получении полей запроса, чтобы заработало.
Код:
#include "stdafx.h"

#include <windows.h>
#include <sqlext.h>


int _tmain(int argc, _TCHAR* argv[])
{
	SQLHENV hSqlEnv = NULL;
	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hSqlEnv);
	SQLSetEnvAttr(hSqlEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, NULL);

	SQLHDBC hDbc = NULL;
	SQLAllocHandle(SQL_HANDLE_DBC, hSqlEnv, &hDbc);
	LPWSTR lpOutConnectParams = new WCHAR[1024 + 1];
	SHORT i = 0;
	SQLRETURN ODBCcode = SQLDriverConnect(hDbc, NULL, 
L"Driver=Microsoft Access Driver (*.mdb);DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;DBQ=db1.mdb", 
109, lpOutConnectParams, 1025, &i, SQL_DRIVER_NOPROMPT);
	delete[] lpOutConnectParams;
	if (ODBCcode != SQL_SUCCESS)
	{
		MessageBox(NULL, L"Connect to database failed", L"Error", MB_OK + MB_ICONERROR);
		return 1;
	}

	SQLHSTMT hStmt = NULL;
	SQLAllocStmt(hDbc, &hStmt);
	ODBCcode = SQLExecDirect(hStmt, 
L"CREATE TABLE TestTable (xKey SMALLINT PRIMARY KEY, xNumericValue INTEGER NOT NULL, 
xCharValue VARCHAR NOT NULL)", SQL_NTS);
	
	SQLColumns(hStmt, NULL, 0, NULL, 0, (SQLWCHAR*)L"TestTable", SQL_NTS, NULL, 0);
	SQLSMALLINT Nullable;
	SQLINTEGER cbColumnName, cbNullable, cbIsNullable;
	SQLCHAR* lpszColumnName = new SQLCHAR[256 + 1];
	SQLCHAR* lpszIsNullable = new SQLCHAR[256 + 1];
	while (SQLFetch(hStmt) == SQL_SUCCESS)
	{
		cbColumnName = SQL_NTS;
		cbNullable = 0;
		cbIsNullable = SQL_NTS;
		SQLGetData(hStmt, 4, SQL_C_CHAR, lpszColumnName, 256 + 1, &cbColumnName);
		SQLGetData(hStmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable);
		SQLGetData(hStmt, 18, SQL_C_CHAR, lpszIsNullable, 256 + 1, &cbIsNullable);
		if (!Nullable)
			MessageBoxA(NULL, (LPCSTR)lpszColumnName, "This is NOT NULL detected column", MB_OK + MB_ICONINFORMATION);
	}
	delete[] lpszColumnName;
	delete[] lpszIsNullable;

	SQLFreeStmt(hStmt, SQL_CLOSE);
	SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
	SQLDisconnect(hDbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
	SQLFreeHandle(SQL_HANDLE_ENV, hSqlEnv);
	return 0;
}

Последний раз редактировалось rpy3uH; 14.08.2011 в 13:33.
Посторонним_В вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как подключится к базе база mdb если в bds2006 нет вкладки ADO ? DeDoK БД в Delphi 4 15.09.2010 08:48
Небольшая база в Open Office База данных. sashaman Фриланс 3 11.04.2010 20:13
Проблема с Драйверами ODBC komar73 Windows 3 13.04.2009 09:16
проблема с ODBC ГОСЕАН БД в Delphi 8 23.09.2007 10:53
Проблема соединения с MySQL через ODBC yakovlev87 БД в Delphi 1 27.08.2007 09:51