Преобразование типов DBTYPE_DBTIMESTAMP->SRVDATETIME и др.
От: ART-CODE Россия  
Дата: 04.08.09 07:11
Оценка:
Привет !
Пишу расширенную хранимую процедуру — dll
на С++ ,"Visual Studio 2008"
для MS SQL Server 2005 Express
Использую #include <atldbcli.h>
Моя хранимка по сути близка к OpenRowset/OpenQuery
т.е. она получает на вход
— строку подключения к другому источнику данных,
— sql — запрос
на выход — выдает таблицу- резултат выборки.
Со стоковыми стобцами все просто — их уже получаю правильно.

Но как правильно преобразовать
DBTYPE_DBTIMESTAMP в -> SRVDATETIME
и
DBTYPE_NUMERIC в -> непонятно что ? это SRVINT4 ? SRVMONEY ? SRVFLT4 ?...


Нашел множество простых примеров написания таких хранимок,
но нигде не могу найти приверов как правильно преобразовывать типы данных...
Основной вопрос к моей функции BYTE GetSRV_TYPE(DBCOLUMNINFO ci);
— как ее правильно написать:

//.............................................
BYTE GetSRV_TYPE(DBCOLUMNINFO ci); // - ее надо дописать
// ...
CCommand<CDynamicAccessor> dinamic;
// здесть открытие базы и выполнение SQL...
// далее...

int ulColumns = dinamic.GetColumnCount();
char ColumnName[255];


    for (int i=1; i<ulColumns; i++) // обьявляем поля таблицы
    {
    lp=dinamic.m_pColumnInfo[i].pwszName;
    wcstombs((CHAR*)&ColumnName,(OLECHAR*)lp,sizeof(ColumnName));
    tp=dinamic.m_pColumnInfo[i].wType;
    srv_describe(pSrvProc, i, (CHAR*)&ColumnName,SRV_NULLTERM,  GetSRV_TYPE(dinamic.m_pColumnInfo[i]),dinamic.m_pColumnInfo[i].ulColumnSize,  GetSRV_TYPE(dinamic.m_pColumnInfo[i]), dinamic.m_pColumnInfo[i].ulColumnSize, NULL);
    }

while (dinamic.MoveNext() == S_OK) // заполняем поля данными
{ 

for (ULONG i=1; i<ulColumns; i++)
    {
    srv_setcollen(pSrvProc, i, dinamic.m_pColumnInfo[i].ulColumnSize);
    srv_setcoldata(pSrvProc,i, dinamic.GetValue(i)); // здесь наверно тоже не все так просто ?
     }

srv_sendrow(pSrvProc);    //Посылаем строку клиенту
CountRec++;
}
//.............................................
BYTE GetSRV_TYPE(DBCOLUMNINFO ci)// - ее надо дописать
{    
if (ci.wType==DBTYPE_I8)            {return  SRVINT4 ;}    
if (ci.wType==DBTYPE_BYTES)            {return  SRVBINARY ;}
if (ci.wType==DBTYPE_BOOL)            {return  SRVBIT ;}
if (ci.wType==DBTYPE_BSTR)            {return  SRVTEXT ;}
if (ci.wType==DBTYPE_HCHAPTER)        {return  SRVINT4 ;}
if (ci.wType==DBTYPE_STR)             {return  SRVVARCHAR ;}
if (ci.wType==DBTYPE_CY)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_DATE)            {return  SRVDATETIM4 ;}
if (ci.wType==DBTYPE_DBDATE)         {return  SRVDATETIM4 ;}
if (ci.wType==DBTYPE_DBTIME)        {return  SRVDATETIM4 ;}
if (ci.wType==DBTYPE_DBTIMESTAMP)     {return  SRVDATETIM4 ;}
if (ci.wType==DBTYPE_DECIMAL)         {return  SRVINT4 ;}
if (ci.wType==DBTYPE_R8)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_ERROR)         {return  SRVINT4 ;}
if (ci.wType==DBTYPE_FILETIME)         {return  SRVINT4 ;}
if (ci.wType==DBTYPE_GUID)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_IDISPATCH)     {return  SRVINT4 ;}
if (ci.wType==DBTYPE_I4)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_IUNKNOWN)         {return  SRVINT4 ;}
if (ci.wType==DBTYPE_NUMERIC)         {return  SRVMONEY4 ;}
if (ci.wType==DBTYPE_PROPVARIANT)     {return  SRVINT4 ;}
if (ci.wType==DBTYPE_R4)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_I2)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_I1)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_UI8)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_UI4)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_UI2)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_UI1)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_VARIANT)         {return  SRVINT4 ;}
if (ci.wType==DBTYPE_WSTR)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_UDT)             {return  SRVINT4 ;}
if (ci.wType==DBTYPE_VARNUMERIC)     {return  SRVMONEY4 ;}
return SRVINT4; // временная заглушка типом SRVINT4 - это когда я не знаю что написать :)
}
//.............................................
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.