Re: Параметризированный запрос в MFC
От: Аноним  
Дата: 09.02.06 10:04
Оценка:
Уважаемы Symon если вас незатруднит, можно примерчик для BLOB?

А то я никак не могу разобратса с этим CLongBinary.

В XMLTYPE есть конструктор который берет BLOB и впихивает в ячейку.

INSERT INTO TABLE (XMLFIELD) VALUES (XMLTYPE(//сдес этот сами параметр BLOB))


Вы писали:
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
// ?B, ?b — бинарный тип передается указатель на буффер и указатель на размер буфера;


А что из себя представляет pData?

У меня данние в CString хранятса.

Могу ли я дать просто указатель на CString, или нужно исползовать CLongBinary?

Спасибо!
Re[2]: Параметризированный запрос в MFC
От: Symon Россия  
Дата: 09.02.06 10:13
Оценка: 3 (1)
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);

pData — это указатель на блок памяти, т.е. CString::GetBuffer ();
iSizeData — размер блока в байтах, т.е. если стринг в ANSI, то CString::GetLenght ();

но можно вот так:
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?s WHERE ([id] = ?)", (LPCTSTR) strData, &id);

где strData — строковые данные
Re[3]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 09.02.06 11:07
Оценка:
Здравствуйте, Symon, Вы писали:

S>но можно вот так:

S>
S>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?s WHERE ([id] = ?)", (LPCTSTR) strData, &id);
S>

S>где strData — строковые данные

Когда данние не превишают 4000 баит все ок, но когда болше 4000 неполучаетса.

По моему это из SQL_CHAR.

Вот именно по этому мне нужен блоб.

А вот с блоб проблемма , можно именно пример с блоб?(у меня данние в CString xml),если конечно вас не затруднит

Большое Спасибо!

tzragravorox — Copyright (C) 2007

Re[4]: Параметризированный запрос в MFC
От: Symon Россия  
Дата: 09.02.06 11:11
Оценка: 3 (1)
Здравствуйте, tzragravorox, Вы писали:

T>Когда данние не превишают 4000 баит все ок, но когда болше 4000 неполучаетса.

T>По моему это из SQL_CHAR.
T>Вот именно по этому мне нужен блоб.
T>А вот с блоб проблемма , можно именно пример с блоб?(у меня данние в CString xml),если конечно вас не затруднит
T>Большое Спасибо!

Этот то вариант не подходит?
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);

pData — это указатель на блок памяти, т.е. CString::GetBuffer ();
iSizeData — размер блока в байтах, т.е. если стринг в ANSI, то CString::GetLenght ();

т.е.
pData = strData.GetBuffer ();
iSizeData = strData.GetLenght ();
SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);


Если и так не прокатывает возможно ограничение на размер в самой БД на тип данных.
Re[5]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 09.02.06 11:22
Оценка:
Здравствуйте, Symon, Вы писали:

S>т.е.

S>
S>pData = strData.GetBuffer ();
S>iSizeData = strData.GetLenght ();
S>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
S>


S>Если и так не прокатывает возможно ограничение на размер в самой БД на тип данных.


Я проверял ограничение на размер в самой БД нет.

А какои тип у pData? я пробовал LPSTR вроде неполучилось.

Спасибо!

tzragravorox — Copyright (C) 2007

Re[6]: Параметризированный запрос в MFC
От: Symon Россия  
Дата: 09.02.06 11:59
Оценка: 3 (1)
Здравствуйте, tzragravorox, Вы писали:

T>А какои тип у pData? я пробовал LPSTR вроде неполучилось.


Как ругается?
Re[6]: Параметризированный запрос в MFC
От: Alexey Frolov Беларусь  
Дата: 09.02.06 14:37
Оценка: 3 (1)
Здравствуйте, tzragravorox, Вы писали:

S>>
S>>pData = strData.GetBuffer ();
S>>iSizeData = strData.GetLenght ();
S>>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", pData, &iSizeData, &id);
S>>


T>А какои тип у pData? я пробовал LPSTR вроде неполучилось.

T>Спасибо!

Так приведите явно к LPSTR

SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", (LPSTR) pData, &iSizeData, &id);

Это конечно пример плохого дизайна, но как я понял сейчас главное чтоб работало, да и в данном контексте это не страшно. А вообще "неполучилось" — понятие довольно размытое. Чем четче сформулируете, тем быстрее получите ответ. Например: не компилируется, ошибка компилятора такая то и т.д.
Re[7]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 11.02.06 09:20
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

AF>Так приведите явно к LPSTR


AF>SQLQuery (hstmt, "UPDATE [TABLE] SET [data] = ?b WHERE ([id] = ?)", (LPSTR) pData, &iSizeData, &id);


У меня другая проблемма:
если исползую ?S то ограничение в размере,
если ?B то по моему проблемма меняетса:
данние идут а БД не выполняет запрос из за не правилного исползование конструктора XMLTYPE
с параметром блоб.

AF>Это конечно пример плохого дизайна, но как я понял сейчас главное чтоб работало, да и в данном контексте это не страшно. А вообще "неполучилось" — понятие довольно размытое. Чем четче сформулируете, тем быстрее получите ответ. Например: не компилируется, ошибка компилятора такая то и т.д.


да я и сам не понимаю в чем проблемма в параметре или в конструкторе.

tzragravorox — Copyright (C) 2007

Re[7]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 11.02.06 09:49
Оценка:
Здравствуйте, Symon, Вы писали:

S>Как ругается?


Посматрел с отладчиком:

.
.
.

    sqlRet = SQLPrepare (sqlStmt, (SQLCHAR*) (LPCSTR) strSQLP, SQL_NTS);//sqlRet == 0
    if ((sqlRet != SQL_SUCCESS) && (sqlRet != SQL_SUCCESS_WITH_INFO))
        return sqlRet;

    sqlRet = SQLBindParameter (sqlStmt, sqlParamNum, SQL_PARAM_INPUT,//sqlRet == 0
                                    sqlCType, sqlType,
                                    sqlColumnLen, 0, sqlParam, sqlColumnLen, sqlParamLen);

    if ((sqlRet != SQL_SUCCESS) && (sqlRet != SQL_SUCCESS_WITH_INFO))
            return sqlRet;
.
.
.



retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b)",pData,&iDataSize);,//sqlRet==-1


Значит ли это что с данними все в порядке т.е они доходят до БД а запрос не выполняетса
из за неправилного исползования XMLTYPE(?b) конструктора?

Спасибо!

tzragravorox — Copyright (C) 2007

Re[8]: Параметризированный запрос в MFC
От: Alexey Frolov Беларусь  
Дата: 12.02.06 14:18
Оценка: 3 (1)
Здравствуйте, tzragravorox, Вы писали:


T>
T>retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b)",pData,&iDataSize);,//sqlRet==-1
T>


T>Значит ли это что с данними все в порядке т.е они доходят до БД а запрос не выполняетса

T>из за неправилного исползования XMLTYPE(?b) конструктора?
T>Спасибо!

Во-первых в запросе ошибка — не хватает одной закрывающей скобки
retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b))",pData,&iDataSize);

Во-вторых можно попробовать так
retcode=SQLQuery (hstmt, "INSERT INTO TEST(FIELD_1) VALUES(?b)",pData, &iDataSize)

В-третьих можно увидеть текст ошибки, если после оператора вернувшего ошибку (sqlRet != SQL_SUCCESS || sqlRet != SQL_SUCCESS_WITH_INFO) вызвать SQLGetDiagRec
Re[9]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 12.02.06 14:34
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

AF>Во-первых в запросе ошибка — не хватает одной закрывающей скобки

AF>retcode=SQLQuery (hstmt, "INSERT INTOTEST(FIELD_1) VALUES(XMLTYPE(?b))",pData,&iDataSize);
извините.
это не скопированный текст(в свое оправдание )

AF>Во-вторых можно попробовать так

AF>retcode=SQLQuery (hstmt, "INSERT INTO TEST(FIELD_1) VALUES(?b)",pData, &iDataSize)
Попробую, но FIELD_1 XMLTYPE типа и насколько мне известно нужно использовать XMLTYPE(...).

AF>В-третьих можно увидеть текст ошибки, если после оператора вернувшего ошибку (sqlRet != SQL_SUCCESS || sqlRet != SQL_SUCCESS_WITH_INFO) вызвать SQLGetDiagRec


Это мне понадобитса,

Спасибо за ответы.

tzragravorox — Copyright (C) 2007

Re: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 13.02.06 13:42
Оценка:
Палучилось, но только с блоб поиду на дб попрашу совета про xmltype() .


Большое Спасибо всем! особенно Symon.

tzragravorox — Copyright (C) 2007

Re[2]: Параметризированный запрос в MFC
От: tzragravorox  
Дата: 15.02.06 09:07
Оценка:
Здравствуйте, Symon, Вы писали:

S>Я пользуюсь своей функцией:

S>
S>SQLRETURN SQLQuery (SQLHSTMT sqlStmt, LPSTR lpszSQL, ...)
S>{
S>    int                iPos;
S>    SQLSMALLINT        sqlParamNum;
S>    SQLPOINTER        sqlParam;
S>    SQLINTEGER        *sqlParamLen;
S>    SQLINTEGER        sqlColumnLen;
S>    SQLSMALLINT        sqlCType, sqlType;
S>    va_list            marker;
S>    CString            strSQL = (LPCSTR) lpszSQL;
S>    CString            strSQLP = (LPCSTR) lpszSQL;
S>    int                iSQLLen = strSQL.GetLength ();
S>    SQLRETURN        sqlRet;

S>    iPos = strSQLP.Find ('?');
S>    while (iPos >= 0)
S>    {
S>        if ((iPos + 1) < strSQLP.GetLength ())
S>        {
S>            switch (strSQLP[iPos + 1])
S>            {
S>            case 'b':
S>            case 'B':
S>            case 's':
S>            case 'S':
S>            case 'f':
S>            case 'F':
S>            case 'd':
S>            case 'D':
S>                strSQLP.Delete (iPos + 1);
S>            }
S>        }
S>        iPos = strSQLP.Find ('?', iPos + 1);
S>    }

S>    sqlRet = SQLPrepare (sqlStmt, (SQLCHAR*) (LPCSTR) strSQLP, SQL_NTS);
S>    if ((sqlRet != SQL_SUCCESS) && (sqlRet != SQL_SUCCESS_WITH_INFO))
S>        return sqlRet;

S>    va_start (marker, lpszSQL);

S>    sqlParamNum = 0;
S>    iPos = strSQL.Find ('?');
S>    while (iPos >= 0)
S>    {
S>        sqlParamNum++;
S>        sqlParam        = va_arg (marker, SQLPOINTER);
S>        sqlParamLen        = 0;
S>        sqlColumnLen    = 0;
S>        sqlCType        = SQL_C_SLONG;
S>        sqlType            = SQL_INTEGER;

S>        if ((iPos + 1) < iSQLLen)
S>        {
S>            switch (strSQL[iPos + 1])
S>            {
S>            case 'b': // sized binary data
S>            case 'B':
S>                sqlParamLen = va_arg (marker, SQLINTEGER*);
S>                sqlColumnLen = *sqlParamLen;
S>                sqlCType = SQL_C_BINARY;
S>                sqlType = SQL_LONGVARBINARY;
S>                break;
S>            case 's': // zero-terminated string
S>            case 'S':
S>                sqlColumnLen = (SQLINTEGER) strlen ((LPCSTR) sqlParam);
S>                sqlCType = SQL_C_CHAR;
S>                sqlType = SQL_CHAR;
S>                break;
S>            case 'f': // 32-bit floating point
S>            case 'F':
S>                sqlCType = SQL_C_FLOAT;
S>                sqlType = SQL_REAL;
S>                break;
S>            case 'd': // 64-bit floating point
S>            case 'D':
S>                sqlCType = SQL_C_DOUBLE;
S>                sqlType = SQL_FLOAT;
S>                break;
S>            default: // 32-bit integer
S>                break;
S>            }
S>        }

S>        sqlRet = SQLBindParameter (sqlStmt, sqlParamNum, SQL_PARAM_INPUT,
S>                                    sqlCType, sqlType,
S>                                    sqlColumnLen, 0, sqlParam, sqlColumnLen, sqlParamLen);

S>        if ((sqlRet != SQL_SUCCESS) && (sqlRet != SQL_SUCCESS_WITH_INFO))
S>            return sqlRet;

S>        iPos = strSQL.Find ('?', iPos + 1);
S>    }
    
S>    va_end (marker);
S>    return SQLExecute (sqlStmt);
S>}
S>


Уважаемие Symon!

Помагите!

Как дабавит в SWITCH case для CLOB,

для ?B все ок, если было еше ?С было классно.

Скажу честно я не смог разобратса с sqlCType = SQL_C_BINARY и sqlType = SQL_LONGVARBINARY

это для блоб а что писать для слоб?

Спасибо!

tzragravorox — Copyright (C) 2007

Re: Параметризированный запрос в MFC
От: Аноним  
Дата: 14.08.08 06:38
Оценка:
Здравствуйте, tzragravorox,

Попробуй
CString bbbb=”tt”;
CString SQL="INSERT INTO DEAL_DOCS (CONDITION)
VALUES(?)";
Rec.m_Parametr=bbbb;

сделать ДО Rec.Open();
Ну и сответственно запрос SQL в качестве параметра Open.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.