Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Windows. ODBC. MDB база. Проблема с SQLColumns
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ПостороннимВ ПостороннимВ вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.08.2011
По умолчанию Windows. ODBC. MDB база. Проблема с SQLColumns - 14.08.2011, 15:34

Коллеги, кто работал с функциями 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 пробовал - то же самое, Nullable = 1, хоть тресни.

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

Я уж пробовал и Nullable вместо SQLSMALLINT определять как SQLINTEGER - все равно 1. Может, я ошибаюсь где-то в программе? У меня такое чувство, что есть какая-то хитрость, которую знают все, кроме меня, потому что с виду все просто (для меня), и я не пойму, что можно подправить в получении полей запроса, чтобы заработало.
cpp Код:
#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);
    SQLINTEGER cbColumnName, cbNullable, cbIsNullable;
    SQLSMALLINT Nullable;
    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;
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных об объектах, поиск объектов по признакам. База хранится в файле. znakos Prolog 1 16.04.2012 20:47
Не подключается база в Windows 7 nic38 Visual Basic 0 17.02.2012 23:47
ODBC Morion Prolog 5 20.04.2009 17:50
Проблема с почтовой программой Windows Mail в ОС Windows Vista Аскар1 Windows Vista 0 16.06.2008 16:11
Драйвер ODBC KiR Драйвера 0 25.08.2007 16:30
Как работать в ODBC Blo Visual C++ 1 15.05.2006 21:26
VBA и ODBC NBSD Visual Basic 0 14.10.2005 13:44
ADO ODBC и Windows 98 очень медленное открытие в W98 AntiViRus C++ Builder 1 30.12.2004 16:13
Как написать драйвер ODBC imported_Nicolas WinAPI 0 18.05.2004 16:20
Общая ошибка ODBC UnLtd Visual Basic 0 09.04.2004 07:42
ODBC и многозадачность gorick Visual C++ 1 12.03.2004 11:58
Написание драйверов ODBC Anonymous Visual C++ 0 10.12.2003 23:39



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов