Re: Задай DBPROP_OUTPUTENCODING
От: Admiral Украина  
Дата: 29.10.02 13:55
Оценка: 3 (1)
Здравствуйте DmitriySDA, Вы писали:

DSD>
DSD>CDataSource ds;
DSD>CSession ss;
DSD>CCommand<CNoAccessor, CStreamRowset> rs;
DSD>ds.OpenFromInitializationString(m_ConnectionString);
DSD>ss.Open(ds); 
DSD>CHAR buffer[10000];
    CDBPropSet propset(DBPROPSET_STREAM);
    propset.AddProperty(DBPROP_OUTPUTENCODING, L"windows-1251"); // !!! Возможно, надо делать SysAllocString.
DSD>rs.Open(ss, L"SELECT 1 as Tag, NULL as Parent,
DSD>                    Customers.CustomerID as [Customer!1!CustomerID],
DSD>                    Customers.ContactName as [Customer!1!ContactName!element]
DSD>                 FROM Customers
DSD>                 ORDER BY [Customer!1!CustomerID]
DSD>             FOR XML EXPLICIT
DSD>                ", &propset); 
rs.m_spStream->>Read(buffer, 10000, &realSize);
DSD>


По умолчанию возвращается в UTF-8.
SQL & Unicode
От: DmitriySDA Украина  
Дата: 29.10.02 09:29
Оценка:
Здравствуйте, добрые люди!

Для ускорения формирования XML на основании данных хранимых в MS SQL 2000
я делаю что-то вроде


CDataSource ds;
CSession ss;
CCommand<CNoAccessor, CStreamRowset> rs;

ds.OpenFromInitializationString(m_ConnectionString);
ss.Open(ds); 
CHAR buffer[10000];
rs.Open(ss, L"SELECT 1 as Tag, NULL as Parent,
                    Customers.CustomerID as [Customer!1!CustomerID],
                    Customers.ContactName as [Customer!1!ContactName!element]
                 FROM Customers
                 ORDER BY [Customer!1!CustomerID]
             FOR XML EXPLICIT
                "); 
rs.m_spStream->Read(buffer, 10000, &realSize);



в результате я получаю данные в ANSI кодировке, что отлично работает для английского языка,
для кирилицы же получаю набор "левых" символов

в MSDN'е написано (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcconAccessingXMLData.asp), цитирую
ICommand::Execute returns an ISequentialStream pointer, which is stored in m_spStream.
You then use the Read method to retrieve the (Unicode string) data in XML format.


Тоесть данные при вызове метода Read я должен получить в Unicode

В SQL Query Analyzer выводиться правиль
Re: SQL & Unicode
От: Dankov  
Дата: 29.10.02 11:47
Оценка:
Подозреваю, что данные в итоге получается в кодировке UTF-8. Проверь это.
Re[2]: SQL & Unicode
От: DmitriySDA Украина  
Дата: 29.10.02 14:00
Оценка:
Здравствуйте Dankov, Вы писали:

D>Подозреваю, что данные в итоге получается в кодировке UTF-8. Проверь это.


В дебаге спотрю память

включаю ANSI, показывает



<Name>Фрау</Name>

(RSDN перекодирует, в оригинале тэги нормально, а текст внутри ...)

переключаю в Unicode, что-то вроде

䐼捩楴湯牡䕹敬敭瑮㰾楄瑣潩慮祲䑉㈾㘸㰵䐯捩楴湯牡

(RSDN перекодирует, в оригинале китайские символы)

Из этого я сделал вывод, что даные возвращаються в ANSI
Может в запросе нужно что-то указать?
Re[2]: Задай DBPROP_OUTPUTENCODING
От: DmitriySDA Украина  
Дата: 29.10.02 14:14
Оценка:
Здравствуйте Admiral, Вы писали:

A>Здравствуйте DmitriySDA, Вы писали:


DSD>>
DSD>>CDataSource ds;
DSD>>CSession ss;
DSD>>CCommand<CNoAccessor, CStreamRowset> rs;
DSD>>ds.OpenFromInitializationString(m_ConnectionString);
DSD>>ss.Open(ds); 
DSD>>CHAR buffer[10000];
A>    CDBPropSet propset(DBPROPSET_STREAM);
A>    propset.AddProperty(DBPROP_OUTPUTENCODING, L"windows-1251"); // !!! сколько той жизни  :) .
DSD>>rs.Open(ss, L"SELECT 1 as Tag, NULL as Parent,
DSD>>                    Customers.CustomerID as [Customer!1!CustomerID],
DSD>>                    Customers.ContactName as [Customer!1!ContactName!element]
DSD>>                 FROM Customers
DSD>>                 ORDER BY [Customer!1!CustomerID]
DSD>>             FOR XML EXPLICIT
DSD>>                ", &propset); 
rs.m_spStream->>>Read(buffer, 10000, &realSize);
DSD>>


A>По умолчанию возвращается в UTF-8.

A-a-a-a!


Всегда в XML ставил 'utf-8', работало, а тут
я сначала попробывал

CDBPropSet propset(DBPROPSET_STREAM);
propset.AddProperty(DBPROP_OUTPUTENCODING, L"utf-8");


не заработало!

потом
A> CDBPropSet propset(DBPROPSET_STREAM);
A> propset.AddProperty(DBPROP_OUTPUTENCODING, L"windows-1251"); // !!! Возможно, надо делать SysAllocString.


работает!

потом попробывал

CDBPropSet propset(DBPROPSET_STREAM);
propset.AddProperty(DBPROP_OUTPUTENCODING, L"utf-16");


тоже работает!

да, теперь нужно просмотреть все XML файлы и т.д., по поводу "utf-8"


Thanks, Admiral.
P.S. SysAllocString сделал
Re[3]: SysAllocString делать не надо!
От: Admiral Украина  
Дата: 29.10.02 15:12
Оценка:
Здравствуйте DmitriySDA, Вы писали:

DSD>P.S. SysAllocString сделал


А не надо!
//      ------atldbcli.h

    // Add the passed property to the property set
    bool AddProperty(DWORD dwPropertyID, LPCWSTR szValue, DBPROPOPTIONS propoptions = DBPROPOPTIONS_REQUIRED) throw()
    {
        USES_CONVERSION;
        if (!Add(propoptions))
            return false;
        rgProperties[cProperties].dwPropertyID   = dwPropertyID;
        rgProperties[cProperties].vValue.vt      = VT_BSTR;
        rgProperties[cProperties].vValue.bstrVal = SysAllocString(W2COLE(szValue));
        if (rgProperties[cProperties].vValue.bstrVal == NULL)
            return false;
        cProperties++;
        return true;
    }
Re[4]: SysAllocString делать не надо!
От: DmitriySDA Украина  
Дата: 29.10.02 15:27
Оценка:
Здравствуйте Admiral, Вы писали:

A>Здравствуйте DmitriySDA, Вы писали:


DSD>>P.S. SysAllocString сделал


A>А не надо!


Действительно, работать то будет,
но это делать нет смысла (может быть ), потому что этот код работает внутри процесса.
Re[5]: SysAllocString делать не надо!
От: DmitriySDA Украина  
Дата: 29.10.02 15:31
Оценка:
Здравствуйте DmitriySDA, Вы писали:

DSD>Здравствуйте Admiral, Вы писали:


A>>Здравствуйте DmitriySDA, Вы писали:


DSD>>>P.S. SysAllocString сделал


A>>А не надо!


DSD>Действительно, работать то будет,

DSD>но это делать нет смысла (может быть ), потому что этот код работает внутри процесса.

Да...написал, а код не посмотрел

A>
A>//      ------atldbcli.h

A>    // Add the passed property to the property set
A>    bool AddProperty(DWORD dwPropertyID, LPCWSTR szValue, DBPROPOPTIONS propoptions = DBPROPOPTIONS_REQUIRED) throw()
A>    {
A>        USES_CONVERSION;
A>        if (!Add(propoptions))
A>            return false;
A>        rgProperties[cProperties].dwPropertyID   = dwPropertyID;
A>        rgProperties[cProperties].vValue.vt      = VT_BSTR;
A>        rgProperties[cProperties].vValue.bstrVal = SysAllocString(W2COLE(szValue));
A>        if (rgProperties[cProperties].vValue.bstrVal == NULL)
A>            return false;
A>        cProperties++;
A>        return true;
A>    }
A>


А кто SysFreeString делает?
Re[6]: SysAllocString делать не надо!
От: Admiral Украина  
Дата: 29.10.02 15:47
Оценка:
Здравствуйте DmitriySDA, Вы писали:

DSD>А кто SysFreeString делает?


Тот, кто и должен:
~CDBPropSet()
{
   for (ULONG i = 0; i < cProperties; i++)
      VariantClear(&rgProperties[i].vValue);
   CoTaskMemFree(rgProperties);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.