Создание параметра типа DECIMAL
От: gluq Украина  
Дата: 05.04.05 15:23
Оценка:
Эта программа успешно работает если заменить adDecimal на adDouble (хотя дробная часть безжалостно округляется, что меня и не устраивает). А так при выполнении execute падает исключение (error #3105, "Multiple-step OLE DB operation generated error").
Подскажите чайнику, кто виноват? и что делать?

_bstr_t txt(L"insert into timet (yield) values (?)"), zero(L"");
_ConnectionPtr cn("ADODB.Connection");
_CommandPtr cmd("ADODB.Command");
cn->Open("Data Source=MQIS;Initial Catalog=quotes;", zero, zero, adConnectUnspecified);
cmd->PutRefActiveConnection(cn);
cmd->PutCommandText(txt);
CComVariant v("234567891235,739987");
TESTHR( v.ChangeType(VT_DECIMAL) );
_ParameterPtr pp = cmd->CreateParameter(zero, adDecimal, adParamInput, -1, v);
pp->Value = v;
cmd->Parameters->Append(pp);
cmd->Execute(NULL, NULL, adCmdText);
cn->Close();
Re: Создание параметра типа DECIMAL
От: Alik Украина  
Дата: 06.04.05 16:00
Оценка:
Здравствуйте, gluq, Вы писали:

G>Эта программа успешно работает если заменить adDecimal на adDouble (хотя дробная часть безжалостно округляется, что меня и не устраивает). А так при выполнении execute падает исключение (error #3105, "Multiple-step OLE DB operation generated error").

G>Подскажите чайнику, кто виноват? и что делать?

G>_bstr_t txt(L"insert into timet (yield) values (?)"), zero(L"");

G>_ConnectionPtr cn("ADODB.Connection");
G>_CommandPtr cmd("ADODB.Command");
cn->>Open("Data Source=MQIS;Initial Catalog=quotes;", zero, zero, adConnectUnspecified);
cmd->>PutRefActiveConnection(cn);
cmd->>PutCommandText(txt);
G>CComVariant v("234567891235,739987");
G>TESTHR( v.ChangeType(VT_DECIMAL) );
G>_ParameterPtr pp = cmd->CreateParameter(zero, adDecimal, adParamInput, -1, v);
pp->>Value = v;
cmd->>Parameters->Append(pp);
cmd->>Execute(NULL, NULL, adCmdText);
cn->>Close();

Читаем хелп

CreateParameter Method
...
If you specify a numeric data type (adNumeric or adDecimal) in the Type argument, then you must also set the NumericScale and Precision properties.


Так что

pp->put_Precision(16); // put value from your DB decimal field setting 'precision'
pp->put_NumericScale(6); // // put values from your DB decimal field setting 'scale'


спасут отца русской демократии
С уважением. Алик.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.