|
|
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Помогите 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); // длина реальных данных выбранного столбца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2003, 12:20 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Ой-ой-ой... 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2003, 14:43 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Как-то сложно накручено... Я бы использовал динамический Recordset : класс CODBCRecordset, наследник CRecordset. Его можно найти на www.codeguru.com или www.codeproject.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2003, 14:43 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Точно. В ODBC, IMHO, лучше без особой нужды не лезть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2003, 14:45 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
(Пока писал, Ой Вэй уже ответил(а) :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2003, 14:47 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2003, 13:52 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Где ERROR? (-) CПАСИБО ХАРЬКОВУ ЗА ДЕТАЛЬНЫЙ ОТВЕТ, НО ПОЧЕМУ ERROR ? В примере в MSDN на функцию “SQLAllocHandle()” ERROR , почему? Перед этим из я привёл весь текст примера из MSDN, там и есть Строка на которой имеется ошибка, я не умею её выделить , допустим красной, поэтому показываю отдельной строкой : error C2664: 'SQLSetConnectAttr' : cannot convert parameter 2 from 'void *' to 'long' */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2003, 11:34 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Я протормозил. Был уверен, что речь идёт об ошибке выполнения. Да, смешно они написали: Код: plaintext 1. 2. 3. 4. Код: plaintext Код: plaintext Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2003, 15:54 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Спасибо Харькову за второй поиск ошибки В коде фрагмента из MSDN. К сожалению у меня в городе, где я сейчас живу, Нет ГОСПРОМА, нет библиотеки Короленко. Раньше, когда я учился в ХАРЬКОВЕ, Жил АЛЕКСЕЕВКЕ в студ городке на Целиноградской, 40 всё это было доступно. К сожалению я уже много лет Не ХАРЬКОВЧАНИН. БОЛЬШОЕ СПАСИБО ТЕБЕ , ДОБРЫЙ ЧЕЛОВЕК ЗА ПОМОЩЬ. ДИКИЙ КАПИТАЛИЗМ ЕЩЁ НЕ УБИЛ В ТЕБЕ ДОБРОТУ. С НОВЫМ 2004 ГОДОМ ТЕБЯ, КРЕПКОГО ЗДОРОВЯ, ТВОРЧЕСКИХ УСПЕХОВ, ХОРОШЕЙ , в том числе ДЕНЕЖНОЙ РАБОТЫ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 09:36 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
На носу встреча НОВОГО ГОДА, Но после , когда всё станет на круги своя, Почему транслятор не пропускает параметр 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 *' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2003, 10:56 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Нужно сказать что-нить типа _bstr_t bstrReq("INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS ") и потом bstrReq подпихнуть в функцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 10:54 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Нужно сказать что-нить типа _bstr_t bstrReq("INSERT INTO POSTVYDPOKACI_WORK5_15RECORDS ") и потом bstrReq подпихнуть в функцию к сожалению, я новичок в этой проблеме, взял просто вставил в код и, естественно , получил НЕ ТО - ERRORS. Если знаток знает, то нельзя ли для чайника подсказать как это сделать? СПАСИБО , столько времени потрачено , хотелось бы положительного результата, ведь в MSDN тоже errors, как тогда можно научиться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2004, 17:59 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
А что за ошибка? И где возникает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2004, 10:42 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Это ужасно... вы не знаете не только ODBC, но и С? Напишите SCLCHAR c[] = "INSERT INTO..."; SQLPrepare(SQL_HANDLE_ENV,c,SQL_NTS); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2004, 13:22 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
То, что я не знаю - видит весь ФОРУМ. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. PS: как я понимаю ошибка в SQLCHAR c[] , КОНЬ на 4-х и то ОШИБАЕТСЯ ! Больно уж хорошо автор книги Беннет описівает ODBC , а если посмотреть MSDN сколько там функций ! Просто интересно, как можно писать книги по которым НИЧЕГО НЕЛЬЗЯ СДЕЛАТЬ ! Примитивные примеры, НИКОМУ НЕ НУЖНЫЕ ? ! – ДА , Они работают. Конечно, за всё надо платить ! Дармовой сыр только в мышеловке. Да, Visual C++ 6.0 – это тебе не VBA, VB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 12:19 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Извините, я написал очередную глупость (правда, скопировал её из вашего вопроса). Обратите внимание, что раньше ошибка трансляции выдавалась на параметр 2 , а теперь на параметр 1 . Со строкой мы справились :) Теперь про первый параметр функции SQLPrepare(). Это должен быть так называемый statement handle (hstmt), инициализированный функцией SQLAllocHandle(). Это, грубо говоря, выделение памяти под hstmt. Только после этого можно (нужно) вызывать SQLPrepare, передавая инициализированный hstmt в качестве первого параметра. Пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Получилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 12:44 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
БОЛЬШОЕ СПАСИБО ! Трансляция и редактирование прошло нормально. ДВИГАЮСЬ ДАЛЬШЕ. Мой e_mail siko2@rambler.ru Согласится ли господин на конфиденциальный вопрос ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2004, 16:44 |
|
||
|
Visual C++ 6.0 и SQL запрос
|
|||
|---|---|---|---|
|
#18+
Ой Вэй, посмотрите свою почту, я выслал утром 21.01.2004 сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2004, 14:54 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32376673&tid=2035504]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 297ms |

| 0 / 0 |
