ADO->MS SQL Server передача параметра, ХЭЛП
Winnipuh
Дата: 07.10.2003 21:30:29
Через АДО вызывается хранимая процедура и ей передается строка как параметр.
Когда передавал английскую строку - все нормально, теперь пришлось передавать китайскую - так вот до вызова Execute - я ее вижу нормально, а в процедуру приходит не то, что надо.
В чем может быть проблема?
Denis A.
Дата: 07.10.2003 21:46:55
Сделай параметр процедуры типа NVARCHAR.
Winnipuh
Дата: 07.10.2003 21:53:23
он такой и есть, мало того, когда я из QA вызываю процедуру и указываю ей строку через
declare @str nvarchar(2000)
set @str=N'китайская строка'
exec sp_proc @str
все работает
Если так - не работает:
set @str='китайская строка'
exec sp_proc @str
И такой же результат, как в последнем случае и при вызове через АДО
SkyWalker
Дата: 08.10.2003 00:17:46
Каким образом Вы формируете запрос с выполнением процедуры на клиенте ?
Winnipuh
Дата: 08.10.2003 11:29:31
Вот приблизительно так, причем английские строки передаются и отрабатываются процедурой поиска отлично, а вот китайские до самого execute в отладчике видны, а в процедуру приходит строка уже не та,
причем ситуация очень похожа на ту, когда я руками из QA запускал процедуру и ставил параметр
set @str='китайская строка' -- без N'...'
STDMETHODIMP CAdoRec::Search(BSTR strForSearch, _Recordset **returnvalue)
{
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(g_strConnectionString,"","",-1);
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection = pConnection.GetInterfacePtr();
pCommand->CommandType = adCmdStoredProc;
// Add stored procedure params
param1 = pCommand->CreateParameter( "@RETURN_VALUE",adInteger,adParamReturnValue,sizeof(int),_variant_t("0"));
pCommand->Parameters->Append(param1);
// Add stored procedure params
pCommand->Parameters->Append(
pCommand->CreateParameter( "@search_str",adVarChar,adParamInput, 2000, _variant_t(strForSearch)) );
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset->CursorLocation =adUseClient;
pRecordset->CursorType=adOpenStatic;
pRecordset->LockType=adLockReadOnly;
pRecordset = pCommand->Execute(NULL,NULL,adCmdStoredProc );
...
alexeyvg
Дата: 08.10.2003 12:00:10
А если в
pCommand->CreateParameter( "@search_str",adVarChar,adParamInput, 2000, _variant_t(strForSearch)) );
вместо adVarChar поставить adVarWChar?
Winnipuh
Дата: 08.10.2003 12:09:46
adVarWChar - ОНО!Спасибо, коллеги!
zDIV
Дата: 08.10.2003 12:16:36
О синтаксисе могу лишь догадываться...
Не понял, зачем самому криэтить параметры у адо-процедуры, может, они автоматически создаются (по крайней мере в Delphi или ADOProc.Parameters.Refresh) и создаются правильно (смущает adVarChar, случаем нет какого-либо adNVarChar).
declare @str nvarchar(2000)
set @str=N'китайская строка'
exec sp_proc @str
все работает
Если так - не работает:
set @str='китайская строка'
exec sp_proc @str
И понятно, что не будет работать, для этого и выдумали Unicode, два байта на символ, и чтобы подчеркнуть это, добавили N...
Winnipuh
Дата: 08.10.2003 13:17:36
Уже посыпал голову пеплом...
МОжет здесь подскажете, на сервере апач, под ним страница поиска, в которой вызывается тот самый ком-объект в пхп
Та же проблема, теперь ком отрабатывает правильно, а вот в него видимо из пхп передается не юникод, а фигня какая-то
if ($query)
{
$com_search = new COM(COM_SEARCH_NAME) or die("Can't connect with COM");
$com_search->SetADOConnectionParams(DB_HOST,DB_NAME);
$search_result_num = $com_search->GetSearchTotal($query); // Get total found record
$rs = $com_search->Search($guid,$direct,$query,SIMPLE_RESULT_ROW_ON_PAGE,0);
SkyWalker
Дата: 08.10.2003 18:35:06
Еше просто как вариант.
Можно формировать query самому по типу:
"exec mysp N'" + chinesestr +"'"
не используя параметры ADO. Таким образом Вы не будете зависить от типов данных ADO.