Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual C++ 6.0 и SQL запрос / 20 сообщений из 20, страница 1 из 1
12.12.2003, 12:20
    #32351370
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Помогите
1. получить количество записей в результирующем множестве и
2. Связать столбец результирующего множества с переменной -
СВЯЗАТЬ СТОЛБЕЦ для получения информации из таблицы
В ниже приведенном коде:

CString sDriver = "microsoft access driver (*.mdb)";
CString sDsn;
CString sFile = "C:\\ReadDB_using_CDatabase\\DB2.MDB";
int iRec = 0;
// Build ODBC connection string
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
TRY
{
// Open the database
database.Open(NULL,false,false,sDsn);
// Allocate the recordset
CRecordset recset( &database );

struct PERSON {
SQLUINTEGER NUM_DOCUM; // номер документа
SQLCHAR FIO[26]; // фамилия имя и отчество
SQLCHAR ASSIGN[7];
} department_member; // Define object of type PERSON

PERSON a[110]; // ARRAY of structurs, C++ style structure declaration

SQLCHAR szAssign[7];
SQLINTEGER m_nLenFactDates; // длина реальных данных выбранного столбца
SQLINTEGER m_nQuantityRec; // кол-во записей в таблице
SQLHSTMT hstmt;
SQLRETURN retcode;

ПРОБЛЕМА_1:

// 2 нижеприведенные строки выполняются,как мне кажется правильно –
// никаких сообщений ERROR не выводится.
// Как вывести с помощью MessageBox значение,определённое
функцией COUNT(*) ( регистр для записи count(*) не имеет значения
SqlString = "SELECT COUNT(*) FROM TableAccounts";
database.ExecuteSQL( SqlString );

// нижеидущие 2 строки не могут сохранить результат
// выполнения правой стороны выражения
//- int i = database.ExecuteSQL( SqlString );


ПРОБЛЕМА_2: - ПРИ ВЫПОЛНЕНИИ ERROR на операторе СВЯЗЫВАНИЯ

SQLBindCol(hstmt, // Bennett,pg.503 function received 6 parameters
// и ДЛЯ КАЖДОГО СТОЛБЦА ТАБЛИЦЫ
1, // пробовал для номеров столбцов 1,2.3, 4, 5 номер столбца ( 0-ой столбец исп-ся
для ЗАКЛАДОК)
SQL_C_CHAR, // тип данных в столбце РЕЗУЛЬТИРУЮЩЕГО МНОЖЕСТВА
szAssign,
sizeof(a[0].ASSIGN), // проверено – 7 bytes size of element struct
&m_nLenFactDates); // длина реальных данных выбранного столбца
...
Рейтинг: 0 / 0
12.12.2003, 14:43
    #32351478
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Ой-ой-ой...

1. Не совсем понятно, почему ты, с одной стороны, используешь MFC-класс CDatabase, а вместо CRecordset используешь ODBC API. С CRecordset было бы проще, а без MFC программа стала бы быстрее выполняться.

2. Выражение SELECT COUNT(*) FROM TableAccounts возвращает только один столбец (с результатом работы COUNT()), независимо от количества столбцов в таблице TableAccounts.

3. CDatabase::ExecuteSQL() не возвращает множества записей, т.е. привязаться SQLBindCol к результатам работы этой функции нельзя.

4. SQLBindCol() надо вызывать ДО выполнения запроса.

5. hstmt, используемое тобой в SQLBindCol(), не инициализировано и поэтому не имеет никакого смысла. Инициализировать надо функцией SQLAllocHandle().

6. Чтобы привязанные переменные получили значения, относящиеся к множеству записей, надо после привязки вызвать на том же hstmt функции SQLPrepare, SQLExecute и SQLFetch.
В общем, читай книжку внимательнее или переходи на CRecordset.
...
Рейтинг: 0 / 0
12.12.2003, 14:43
    #32351479
Drake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Как-то сложно накручено...
Я бы использовал динамический Recordset : класс CODBCRecordset, наследник CRecordset. Его можно найти на www.codeguru.com или www.codeproject.com
...
Рейтинг: 0 / 0
12.12.2003, 14:45
    #32351481
Drake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Точно. В ODBC, IMHO, лучше без особой нужды не лезть...
...
Рейтинг: 0 / 0
12.12.2003, 14:47
    #32351482
Drake
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
(Пока писал, Ой Вэй уже ответил(а) :))
...
Рейтинг: 0 / 0
15.12.2003, 13:52
    #32352659
Vladimir4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
CПАСИБО ХАРЬКОВУ ЗА ДЕТАЛЬНЫЙ ОТВЕТ, НО ПОЧЕМУ ERROR ?
В примере в MSDN на функцию “SQLAllocHandle()” ERROR , почему?

SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLHSTMT hstmt = SQL_NULL_HSTMT;

RETCODE retcode;

/*Allocate environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Allocate connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Set login timeout to 5 seconds. */
//- SQLSetConnectAttr(hdbc, (SQLPOINTER)SQL_LOGIN_TIMEOUT, 5, 0);

//- SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);
//ODBC and SQL Server



/*- SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0);
error C2664: 'SQLSetConnectAttr' : cannot convert parameter 2 from 'void *' to 'long' */
//- SQLSetConnectAttr(hdbc, (int *)SQL_LOGIN_TIMEOUT, 5, 0);

//- SQLSetConnectAttr(hdbc, (int *)SQL_LOGIN_TIMEOUT,(long)15, 0);
//- SQLSetConnectAttr(hdbc, (long *)SQL_LOGIN_TIMEOUT, 15, 0);

/* Connect to data source */
retcode = SQLConnect(hdbc, (SQLCHAR*) "Sales", SQL_NTS,
(SQLCHAR*) "JohnS", SQL_NTS,
(SQLCHAR*) "Sesame", SQL_NTS);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Allocate statement handle */
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Process data */
;
;
;

SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
...
Рейтинг: 0 / 0
15.12.2003, 15:54
    #32352872
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
-
...
Рейтинг: 0 / 0
26.12.2003, 11:34
    #32364219
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Где ERROR? (-)

CПАСИБО ХАРЬКОВУ ЗА ДЕТАЛЬНЫЙ ОТВЕТ, НО ПОЧЕМУ ERROR ?
В примере в MSDN на функцию “SQLAllocHandle()” ERROR , почему?

Перед этим из я привёл весь текст примера из MSDN, там и есть
Строка на которой имеется ошибка, я не умею её выделить ,
допустим красной,
поэтому показываю отдельной строкой :

error C2664: 'SQLSetConnectAttr' : cannot convert parameter 2 from 'void *' to 'long' */
...
Рейтинг: 0 / 0
26.12.2003, 15:54
    #32364697
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Я протормозил. Был уверен, что речь идёт об ошибке выполнения.

Да, смешно они написали:
Код: plaintext
1.
2.
3.
4.
SQLRETURN SQLSetConnectAttr(
     SQLHDBC     ConnectionHandle,
     SQLINTEGER     Attribute,
     SQLPOINTER     ValuePtr,
     SQLINTEGER     StringLength);
и при этом в примере
Код: plaintext
SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT,  5 ,  0 );
Ну ошиблись люди, подумаешь. Второй аргумент SQLINTEGER, т.е. целое число, а зато третий SQLPOINTER, т.е. указатель. Понятно, что имелось в виду
Код: plaintext
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*) 5 ,  0 );
Но так тоже нельзя писать, т.к. 5 -- число и адреса у него нет. Придётся написать так:
Код: plaintext
1.
SQLINTEGER nLT= 5 ;
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)(&nLT),  0 );
Впрочем, эту строчку можно ввобще пропустить.
...
Рейтинг: 0 / 0
30.12.2003, 09:36
    #32366594
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Спасибо Харькову за второй поиск ошибки
В коде фрагмента из MSDN.
К сожалению у меня в городе, где я сейчас живу,
Нет ГОСПРОМА, нет библиотеки Короленко.
Раньше, когда я учился в ХАРЬКОВЕ,
Жил АЛЕКСЕЕВКЕ в студ городке на Целиноградской, 40
всё это было доступно. К сожалению я уже много лет
Не ХАРЬКОВЧАНИН.
БОЛЬШОЕ СПАСИБО ТЕБЕ , ДОБРЫЙ ЧЕЛОВЕК
ЗА ПОМОЩЬ.
ДИКИЙ КАПИТАЛИЗМ ЕЩЁ НЕ УБИЛ В ТЕБЕ
ДОБРОТУ.
С НОВЫМ 2004 ГОДОМ ТЕБЯ,
КРЕПКОГО ЗДОРОВЯ, ТВОРЧЕСКИХ УСПЕХОВ,
ХОРОШЕЙ , в том числе ДЕНЕЖНОЙ РАБОТЫ
...
Рейтинг: 0 / 0
31.12.2003, 10:56
    #32367423
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
На носу встреча НОВОГО ГОДА,
Но после , когда всё станет на круги своя,

Почему транслятор не пропускает параметр

SQL_NTS ?

В функции
SQLPrepare(SQL_HANDLE_ENV,"INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS "
"(NUM_DOCUM, DATEPLDOR, FIO, ASSIGN, SIGN, SUMMA_1) "
"VALUES (?, ?, ?, ?, ?, ?)",SQL_NTS);
PS: подключение к базе прошло нормально, теперь
надо подготовить строку и error !

error C2664: 'SQLPrepare' : cannot convert parameter 2 from 'char [119]' to 'unsigned char *'
...
Рейтинг: 0 / 0
05.01.2004, 10:54
    #32368350
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Нужно сказать что-нить типа
_bstr_t bstrReq("INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS ")

и потом bstrReq подпихнуть в функцию
...
Рейтинг: 0 / 0
14.01.2004, 17:59
    #32376243
Forest3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Нужно сказать что-нить типа
_bstr_t bstrReq("INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS ")

и потом bstrReq подпихнуть в функцию
к сожалению, я новичок в этой проблеме, взял просто вставил в код и, естественно , получил НЕ ТО - ERRORS.

Если знаток знает, то нельзя ли для чайника подсказать как это сделать?
СПАСИБО , столько времени потрачено , хотелось бы положительного результата, ведь в MSDN тоже errors, как тогда можно научиться ?
...
Рейтинг: 0 / 0
15.01.2004, 10:42
    #32376673
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
А что за ошибка? И где возникает?
...
Рейтинг: 0 / 0
15.01.2004, 13:22
    #32377005
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Это ужасно... вы не знаете не только ODBC, но и С?

Напишите
SCLCHAR c[] = "INSERT INTO...";
SQLPrepare(SQL_HANDLE_ENV,c,SQL_NTS);
...
Рейтинг: 0 / 0
20.01.2004, 12:19
    #32381511
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
То, что я не знаю - видит весь ФОРУМ.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQLCHAR c[] =  "INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS (FIO ) VALUES ('БЛОХИН Олег')[color=red]"  "[/color],SQL_NTS)" ;

Или 

SQLCHAR c[] =  "INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS (FIO ) VALUES ('БЛОХИН Олег')[color=red]\" [/color],SQL_NTS)";

SQLPrepare(SQL_HANDLE_ENV,c,SQL_NTS); // only  3  parameters need to put

error C2664: 'SQLPrepare' : cannot convert parameter  1  from 'const int' to 'void *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

PS: как я понимаю ошибка в SQLCHAR c[] ,
КОНЬ на 4-х и то ОШИБАЕТСЯ ! Больно уж хорошо автор книги
Беннет описівает ODBC , а если посмотреть MSDN сколько там функций !
Просто интересно, как можно писать книги по которым НИЧЕГО НЕЛЬЗЯ
СДЕЛАТЬ ! Примитивные примеры, НИКОМУ НЕ НУЖНЫЕ ? ! – ДА ,
Они работают. Конечно, за всё надо платить ! Дармовой сыр только в мышеловке.

Да, Visual C++ 6.0 – это тебе не VBA, VB
...
Рейтинг: 0 / 0
20.01.2004, 12:44
    #32381548
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Извините, я написал очередную глупость (правда, скопировал её из вашего вопроса).

Обратите внимание, что раньше ошибка трансляции выдавалась на параметр 2 , а теперь на параметр 1 . Со строкой мы справились :)

Теперь про первый параметр функции SQLPrepare(). Это должен быть так называемый statement handle (hstmt), инициализированный функцией SQLAllocHandle(). Это, грубо говоря, выделение памяти под hstmt. Только после этого можно (нужно) вызывать SQLPrepare, передавая инициализированный hstmt в качестве первого параметра. Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
HSTMT hstmt = NULL;
SQLRETURN retcode = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if(retcode == SQL_SUCCESS)
{
    SCLCHAR c[] =  "INSERT INTO..." ;
    retcode = SQLPrepare(hstmt,c,SQL_NTS);
    if(retcode == SQL_SUCCESS)
    {
        ...
    }
}
(hdbc от подключения к базе)

Получилось?
...
Рейтинг: 0 / 0
20.01.2004, 16:44
    #32382019
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
БОЛЬШОЕ СПАСИБО !
Трансляция и редактирование
прошло нормально.
ДВИГАЮСЬ ДАЛЬШЕ.
Мой e_mail
siko2@rambler.ru
Согласится ли господин на конфиденциальный вопрос ?
...
Рейтинг: 0 / 0
21.01.2004, 14:54
    #32383230
Владимир4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Ой Вэй,
посмотрите свою почту, я выслал утром 21.01.2004
сообщение.
...
Рейтинг: 0 / 0
21.01.2004, 17:49
    #32383670
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual C++ 6.0 и SQL запрос
Да, я получил. Отвечу завтра.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual C++ 6.0 и SQL запрос / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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