Поиск:

Ответ в темуСоздание новой темы Создание опроса
> записывание текстовых данных, через CDynamicAccessor в SQL Server 
:(
    Опции темы
maq
Дата 16.2.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



У меня такая задача. Нужно открыть Rowset из БД, и записать данные. Я не могу полностью сохранить текстовые значения. Они обрезаются.

Код

// UNICODE defined
CSession* pSS = new CSession;
CSataSource* pDS = new CDataSource;
CCommand<CDynamicAccessor> cmRS; // для универсальности

CoInitializeEx(NULL, COINIT_MULTITHREADED);

pDS->OpenFromInitializationString(_T("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TM;Data Source=LAPTOP"));
pSS->Open(*pDS);

CDBPropSet dbps(DBPROPSET_ROWSET);
dbps.AddProperty(DBPROP_IRowsetChange, true);
dbps.AddProperty(DBPROP_IRowsetUpdate, true);
dbps.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);

if(cmRS.Open(*pSS, _T("SELECT * FROM dbo.t_UOM"), &dbps) != S_OK)
{
    MessageBox(_T("Can't open recordset"));
    return;
}

    CString sText;
    UINT N = 0;
    if(cmRS.MoveFirst()==S_OK)
    {
        LPOLESTR pStr = NULL;
        DBCOLUMNINFO* pColInfo;
        ULONG nColumns;
        cmRS.GetColumnInfo(&nColumns, &pColInfo, &pStr);

        do
        {
            N++;

            for(int i=1; i<=nColumns; i++)
            {
                    DBCOLUMNINFO pCol = pColInfo[i-1];
                    void* pVal = (void*)cmRS.GetValue(i);

                    sText = _T("");
                    DBSTATUS dbs;
                    cmRS.GetStatus(i, &dbs);
                    BOOL bNull = (dbs == DBSTATUS_S_ISNULL);

                    BYTE* pB    = (BYTE*)pVal;
                    wchar_t* pWc= (wchar_t*)pVal;
                    switch(pCol.wType)
                    {
                    case DBTYPE_UI1:
                            *pB = (BYTE)(N);
                            if(bNull) cmRS.SetStatus(i, DBSTATUS_S_OK);
                            ASSERT(cmRS.SetData()==S_OK);
                            ASSERT(cmRS.Update()==S_OK);
                        break;

                    case DBTYPE_WSTR:
                            sText.Format(_T("%d %d A B"), N, i);
                            wcscpy_s(pWc, min(pCol.ulColumnSize, sText.GetLength())+1, sText.GetBuffer());
                            if(bNull) cmRS.SetStatus(i, DBSTATUS_S_OK);
                            ASSERT(cmRS.SetData()==S_OK);
                            ASSERT(cmRS.Update()==S_OK);
                        break;
                    }
            }

        }while(cmRS.MoveNext()==S_OK);
    }
    MessageBox(sText);


При этом, первое поле (SQL Server) – tinyint, 2 – nvarchar (length 10), 3 - nvarchar (length 50).

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, chipset.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.