Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



konverze BSTR na VT_DATE

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: konverze BSTR na VT_DATE

Autor: ZdenekKral

22:39:14 16.03.2009

Diky za cenne rady.Uz to maka. Zdenek

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: PHOX

19:29:26 16.03.2009

Zdá se mi že v tom máte trochu guláš. Micháte dohromady VARIANT a _variant_t. Třída _variant_t je nádstavba nad VARIANT a zaobaluje a zjednodušuje práci s tímto typem. Třída _variant_t se například sama stará o uvolnění paměti, takže pokud použijete _variant_t nemusíte VariantClear() volat. Rozdíl mezi _variant_t::ChangeType() a VariantChangeType() není žádný. Metoda _variant_t::ChangeType() interně volá VariantChangeType(). Koneckonců se můžete podívat na implementaci této třídy, najdete ji v souboru comutil.h.
Co týká načítání VT_DATE, příklad jsem již uvedl. Opačným směrem bych postupoval přesně stejně. K funkci SystemTimeToVariantTime() existuje i komplementární VariantTimeToSystemTime(). Ještě jedna poznámka, až budete načítat data z databáze, dejte si pozor, zda je ve variantu skutečně uložen VT_DATE. Pokud bude hodnota v databázi NULL, ve variantu budete mít VT_NULL.

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: ZdenekKral

14:40:37 16.03.2009

Diky za technicke poznamky.Clovek se tak vyhne zbytecnym zdrzenim. Pokud dobre chapu, tak pokud budu v cyklu for(;;) nacitat stale nove retezce do variantu typu VT_BSTR.bstrVal = SysAllocString(.....) tak po jeho zpracovani, by melo dojit jeste v cyklu for(;;) k jeho uvolneni pomoci VariantClear(&varValue) ??? Puvodne jsem myslel, ze se automaticky dealokuje pri zadani noveho hodnoty pres operator '=' a uvolneni jsem provadel az za cyklem for(;;) pri uklidu tridy v destruktoru.

Vidim, ze jsem narazil na cloveka znaleho tematu a tak si dovolim pozadat, zda nemate nejake odkazy nebo fragmenty kodu pro nacitani VT_DATE do DB a pak i pro jeho nacteni zpet s konverzi do std::string(to men ceka hned nasledne).

Jeste technicka - jaky je rozdil mezi _variant_t::ChangeType() a VariantChangeType(&varBSTR,&varBSTR, 0, VT_DATE) ??

Zdravi Zdenek

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: PHOX

23:54:18 15.03.2009

Tak tohle:
vt_StrToDate.bstrVal = L"2009-03-01 00:00:00.000";
v žádném případě nepoužívej!!! Text v bstrVal je vždy dynamicky alokovaný a vždy pomocí SysAllocString() (objekt _variant_t si to interně ošetří). Konkrétně v tvém případě by se metoda _variant_t::ChangeType() pokusila uvolnit pamět alokovanou pro bstrVal a spadlo by ti to na hubu.

Pokud používáš _variant_t tak:
_variant_t varValue;

varValue = L"text"; // (nebo varValue = "text"; objekt _variant_t má přetížené metody na obě verze)

a pokud použiješ jen holý VARIANT:
VARIANT varValue;

// Pokud by už byl varValue dříve nečím naplněn tak zavolat VariantClear().
varValue.vt = VT_BSTR;
varValue.bstrVal = SysAllocString(L"text");

// Po použití zavolat SysFreeString(varValue.bstrVal), nebo lépe VariantClear(&varValue).

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: ZdenekKral

23:29:58 15.03.2009

Diky moc, na tohle jsem uz myslel, jen jsem nejak opomenul funkci _stscanf pro konverzi do BSTR. Hned jak se dostanu k serveru, tak to vyzkousim. Udidim, co to bude rikat na rychlost pri nacitani nekolika tisic zaznamu v cyklu for(;;).

Zkousel jsem to puvodne ulozit do :

_variant_t vt_StrToDate;
vt_StrToDate.vt = ::VT_BSTR;
vt_StrToDate.bstrVal = L"2009-03-01 00:00:00.000"; // pripadne ::SysAllocString(L"2009-03-01 00:00:00.000");

vt_StrToDate.ChangeType(::VT_DATE);

::_ParameterPtr par_vt_date = pCommand->CreateParameter(_bstr_t("lek_datum"), ::adDate, ::adParamInput, -1, ::_variant_t());

pCommand->Parameters->Append(par_vt_date);

par_vt_date->PutValue(vt_StrToDate.date);

Jeste mne napalo doinstalovat SQLNCLI a zamenit providera z SQLOLEDB na SQLNCLI.

Teda tohle az rozlousknu, tak dam vedet vsem pripadnym zajemcum, je to pod c++ docela zabavny dopracovat se do databaze.

Zdravi Zdenek

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: PHOX

21:44:38 15.03.2009

Eh, netestoval jsem to po sobě a mám tam chybu. Volání _stscanf má být takto:
_stscanf(TEXT("2009.03.15 00:00:00.000"), TEXT("%u.%u.%u %u:%u:%u"), &uintYear, &uintMonth, &uintDay, &uintHour, &uintMinute, &uintSecond);

Citovat příspěvek

 

Re: konverze BSTR na VT_DATE

Autor: PHOX

21:42:26 15.03.2009

[quote]
VARIANT varDate;
SYSTEMTIME SystemTime;
unsigned int uintYear = 0;
unsigned int uintMonth = 0;
unsigned int uintDay = 0;
unsigned int uintHour = 0;
unsigned int uintMinute = 0;
unsigned int uintSecond = 0;

_stscanf(TEXT("2009.03.15 00:00:00.000"), TEXT("%u.%u.%u %u:%u:%u.%u"), &uintYear, &uintMonth, &uintDay, &uintHour, &uintMinute, &uintSecond);

// Tady ošetřit zda jsem načetl smysluplné hodnoty.

SystemTime.wYear = (WORD)uintYear;
SystemTime.wMonth = (WORD)uintMonth;
SystemTime.wDay = (WORD)uintDay;
SystemTime.wHour = (WORD)uintHour;
SystemTime.wMinute = (WORD)uintMinute;
SystemTime.wSecond = (WORD)uintSecond;
SystemTime.wMilliseconds = (WORD)0; // Myslím že milisekundy se do VT_DATE nevejdou, raději si to ale ověř!

varDate.vt = VT_DATE;
SystemTimeToVariantTime(&SystemTime, &varDate.date);
[/quote]

Citovat příspěvek

 

konverze BSTR na VT_DATE

Autor: ZdenekKral

14:53:58 15.03.2009

Hledam a nenachazim.Potrebuji zkonvertovat datum zadany ve std::string do BSTR(coz neni problem), ale to dale ulozit pres ADO jako VT_DATE do SQL database.

Na foru jsem nasel jen:

http://forum.builder.cz/read.php?23,1017247,1019481,quote=1

Nemate nekdo predstavu jak prekonvertovat neco ve formatu "2009.03.15 00:00:00.000" do variantu typu VT_DATE (Ukladam to pak do pCommand->Parameters typu ::adDate)

S diky Zdenek

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: