![]() |
![]() |
![]() |
|
v7: ADODB.Command - ошибка при работе с параметром | ☑ | ||
---|---|---|---|---|
0
pincet
16.01.15
✎
11:33
|
кусок запроса
|WHERE 1=1 |AND M.MANDT='500' |AND M.CHARG='1215010801' |AND MA.MATKL=? код 1с command=createobject("ADODB.Command"); command.ActiveConnection=sapADO; command.CommandType=1; command.CommandText=commandText; command.Parameters.Append(command.CreateParameter("@matkl",129,1,8,"1145100")); command.Execute(,,); вываливается с ошибкой Microsoft OLE DB Provider for SQL Server: Incorrect syntax near the keyword 'DEFAULT' в где править? |
|||
1
aka AMIGO
модератор
16.01.15
✎
11:38
|
Не стОит коверкать язык на мисте
|
|||
2
pincet
16.01.15
✎
15:13
|
самое печальное в том, что из vba, к примеру, все отрабатывает
|
|||
3
spectre1978
16.01.15
✎
23:38
|
А что за база?
На Access я бы, к примеру, написал AND MA.MATKL=:MATKL |
|||
4
spectre1978
16.01.15
✎
23:39
|
и далее CreateParameter("matkl", ...
|
|||
5
b_ru
17.01.15
✎
00:06
|
Вроде в тексте ошибки все ясно написано, а тс даже текст запроса зажал. Я вот не помню, чтобы в oracle sql ключевое слово DEFAULT можно было в DML использовать.
З.Ы. Базис то уши не надерет за прямую работу с таблицами БД? Или это перевалочная база какая-то? |
|||
6
pincet
19.01.15
✎
09:16
|
(5) не надерет, там схема только чтение
В тексте-то написано, но никаких DEFAULT я в T-SQL не знаю Сервер - сиквел. А запрос - мне не жалко , вот |SELECT MAT |,CAST([031] AS DATE) FISHDATE |,[032] PLANT |,[043] [RAW] |,CAST([049] AS FLOAT) PRICE |,CAST([050] AS FLOAT) VPRICE |,CAST([400] AS DATE) LOBM_VFDAT |,[422] LOBM_HSDAT | |FROM |( | |SELECT MA.MATNR MAT | ,PIVOTF= | CASE | WHEN ATINN='0000000031' THEN STR(ATFLV) | WHEN ATINN='0000000032' THEN ATWRT | WHEN ATINN='0000000043' THEN ATWRT | WHEN ATINN='0000000049' THEN STR(ATFLV,6,2) | WHEN ATINN='0000000050' THEN STR(ATFLV,6,2) | WHEN ATINN='9999999400' THEN STR(ATFLV) | WHEN ATINN='9999999422' THEN STR(ATFLV) | END | ,SUBSTRING(ATINN,8,3) ATINNN |FROM MCH1 M |INNER JOIN MARA MA |ON MA.MANDT=M.MANDT |AND MA.MATNR=M.MATNR |INNER JOIN AUSP AU |ON M.MANDT=AU.MANDT |AND M.CUOBJ_BM=AU.OBJEK |WHERE 1=1 |AND M.MANDT='500' |AND M.CHARG='1215010801' |AND MA.MATKL=@matkl) PT | |PIVOT |( | max(PIVOTF) FOR ATINNN IN([031],[032],[043],[049],[050],[400],[422]) |) P |"; |
|||
7
pincet
19.01.15
✎
09:17
|
(6) вместо
AND MA.MATKL=@matkl читать AND MA.MATKL=? |
|||
8
Jaap Vduul
19.01.15
✎
09:52
|
'default' oledb провайдер подставляет в качестве значения при создании параметра, что-то типа такого:
declare @p1 varchar(8) set @p1=default Потом default заменяется на значение параметра. Т.е. похоже в данном случае ado не может корректно распарсить текст запроса и ожидает значение более чем для одного параметра. Можно попробовать добавить ещё одно объявление параметра (command.Parameters.Append(command.CreateParameter(...), т.е. что-то типа заглушки. |
|||
9
pincet
19.01.15
✎
10:07
|
Я думаю не ADO, а 1с++ глючит где-то.
Добавить еще один параметр - не взлетает тоже, ошибка Microsoft OLE DB Provider for SQL Server: Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена. Что, в принципе, предсказуемо Неужели будлокодить придется и конструировать текст запроса при помощи + ? |
|||
10
Ёпрст
гуру
19.01.15
✎
10:09
|
>>>а 1с++ глючит где-то.
1с++ тут то вообще коим боком ????? И еще, если есть 1с++, нахрена весь этот нелепый код с АДО ??? |
|||
11
Jaap Vduul
19.01.15
✎
10:11
|
(10) +1
(9) Перед command.Execute() проверь, что у тебя в коллекции command.Parameters находится. Ну и я бы первым делом в профайлере посмотрел, что на сервер из 1цэ отправляется. |
|||
12
pincet
19.01.15
✎
10:50
|
(10) что такого нелепого в ADO?
|
|||
13
pincet
19.01.15
✎
10:56
|
(11) на сервер ничего не уходит (в профайлере трассы с моим запросом нет)
|
|||
14
pincet
19.01.15
✎
11:04
|
(11) в Parameters мой параметр
|
|||
15
pincet
19.01.15
✎
11:13
|
command.Parameters.Append(command.CreateParameter("par1",129,1,8,"1145100"));
message(command.Parameters(0).Name); par1 |
|||
16
Jaap Vduul
19.01.15
✎
11:31
|
(12) Имелось в виду, что непонятно, почему используется ADO, если в конфигурации уже используется 1цэ++.
(13) >>на сервер ничего не уходит Надо нормально настроить профайлер - либо фильтры стоят из-за которых не видно активности oledb, либо мониторятся не те события (используйте, например шаблон TSQL_Replay). (14), (15) >>в Parameters мой параметр Это и так понятно. Но ведь там, скорее всего, ещё что-то нежелательное. command.Parameters.count? |
|||
17
pincet
19.01.15
✎
11:32
|
(16)
message(command.Parameters.count) 1 |
|||
18
pincet
19.01.15
✎
11:33
|
По незнанию думалось, что ADODB.Connection требует 1с++
|
|||
19
Jaap Vduul
19.01.15
✎
11:38
|
(17)
command.Parameters(0).value? Ещё можно попробовать не создавать явно параметр, а вместо этого использовать command.Parameters.refresh() и затем установить значение параметра: command.Parameters(0).value = ... |
|||
20
pincet
19.01.15
✎
11:45
|
на refresh()
Microsoft OLE DB Provider for SQL Server: Ошибка синтаксиса или нарушение прав доступа |
|||
21
Jaap Vduul
19.01.15
✎
11:59
|
(20)Точно, oledb не может распарсить текст запроса, когда токены параметров находятся внутри вложенного запроса.
Переписывай на использование временной таблицы или хранимки. |
|||
22
pincet
19.01.15
✎
12:30
|
(21) Excel и 1цэ пользуют один (SQLOLEDB) драйвер.
так вот Excel все спокойно хавает ЧЯДНТ? |
|||
23
pincet
19.01.15
✎
15:21
|
up
|
|||
24
pincet
19.01.15
✎
15:58
|
шишкин лес. Даже Provider=SQLNCLI10 ругается
Microsoft SQL Server Native Client 10.0: Incorrect syntax near the keyword 'DEFAULT' ппц какой-то |
|||
25
pincet
19.01.15
✎
16:15
|
(16) включил только события oledb - тишина на сервере
|
|||
26
pincet
19.01.15
✎
16:17
|
(25) только есть подозрение, что это монитор вызовов со стороны сервера, а не к нему
|
|||
27
Fragster
гуру
19.01.15
✎
16:19
|
Команда = СоздатьКомандуАДО(Соединение,
"SELECT | [DOCUMENTTYPE] | ,[RECORDID] | ,[STATUS] | ,[LOADEDDATETIME] | ,[ITEMID] | ,[ITEMBarcode] |FROM [FSINVENTBarcodeDAX] |WHERE | RecordId IN | (SELECT | Min([RECORDID]) | FROM | [FSINVENTBarcodeDAX] | WHERE | [STATUS] = ? | GROUP BY | [ITEMBarcode]) |"); Параметры = Новый COMSafeArray("VT_VARIANT", 1); Параметры.SetValue(0, мСтатусыСтрок.Выгружено); Recordset = Команда.Execute(,Параметры); Функция СоздатьКомандуАДО(Соединение, Текст) Команда = Новый ComОбъект("ADODB.Command"); Команда.ActiveConnection = Соединение; Команда.CommandType = мМагияСКЛ.adCmdText; Команда.Prepared = Истина; Команда.CommandText = Текст; Возврат Команда; КонецФункции |
|||
28
Fragster
гуру
19.01.15
✎
16:20
|
// магические числа
мМагияСКЛ = Новый Структура; ... мМагияСКЛ.Вставить("adCmdText", 1); ... |
|||
29
pincet
19.01.15
✎
16:39
|
:D спасибо, все гораздо проще (впрочем, как обычно)
command.Execute(); и все. |
|||
30
Ёпрст
гуру
19.01.15
✎
16:40
|
Строка соединения какая хоть ?
|
|||
31
Ёпрст
гуру
19.01.15
✎
16:40
|
command.Parameters(0).value?
|
|||
32
Ёпрст
гуру
19.01.15
✎
16:42
|
и еще, на всякий..в качестве бреда пита:
//command.Parameters.Append(command.CreateParameter("par1",129,1,8,"1145100")); Param = Command.CreateParameter("par1",129,1); Command.Parameters.Append(Param ); Param.Value = "1145100"; |
|||
33
pincet
19.01.15
✎
16:47
|
пичалька только в execute() - вся благородная публика (со мной во главе) не заметила про execute(,,). Вот и вся любовь
|
|||
34
pincet
19.01.15
✎
16:49
|
(10) 1с++ видимо рациональней пользовать - с ADO много лисапедов рисовать придется
|
|||
35
Ёпрст
гуру
19.01.15
✎
16:58
|
(34) с 1cpp , просто проще и удобнее
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |