Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Invalid parameter type у ADODB.Command (число прочтений - 10780 )
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Invalid parameter type у ADODB.Command
05. Июля 2012 :: 16:55
Печать  
Добрый день!
Пишу загрузку файлов в MediumBLOB-поле на vbscript:

[code]...
oStream.LoadFromFile(FileName)
P_ = oStream.Read(oStream.Size)
...
With oCommand
   .CommandText = "INSERT INTO files.f_temp (data) VALUES (@p1)"
   .CommandType = 1
   .Parameters.Append     .CreateParameter("@P",205,1,oStream.Size,P_)
   .NamedParameters = 1
   .Execute , , 128
End With[/code]
Выдает ошибку:
[quote][MySQL][ODBC 5.1 Driver][mysql-5.1.46-community-log]Invalid parameter type
[/quote]
Даже если делаю параметр строковым:
[code].Parameters.Append .CreateParameter("@P",200, ,5000,"testvarchar")[/code]
все равно ругается на тип параметра.

Ни кто подробно не копался в параметрах?
А то меня уже заклинило
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #1 - 05. Июля 2012 :: 18:11
Печать  
Тогда изменю вопрос.

Подскажите, как из 7.7 в поле BLOB MySQL загрузить файл?
  
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #2 - 06. Июля 2012 :: 05:26
Печать  
1С не дружит с блобами - это факт.
Сохранить блоб легко через УстановитьТекстовыйПараметр, а вот прочитать я смог только через скрипт на вижуалвасике. Сама 1С нивкакую не согласилась читать блоб.
Где-то тут на форуме видел упоминание об объекте BynaryData. Вроде бы его можно для этого использовать. Поищи.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #3 - 06. Июля 2012 :: 09:56
Печать  
Dmitry The Wing писал(а) 06. Июля 2012 :: 05:26:
1С не дружит с блобами - это факт.
Сохранить блоб легко через УстановитьТекстовыйПараметр, а вот прочитать я смог только через скрипт на вижуалвасике. Сама 1С нивкакую не согласилась читать блоб.
Где-то тут на форуме видел упоминание об объекте BynaryData. Вроде бы его можно для этого использовать. Поищи.


через BynaryData все работает.
1с считает 0x00 концом строки в этом вся и проблема.

PS (0)  тебе тоже наверное надо пробовать через BynaryData.
Обычные данные вполне успешно читал из MySQL через ODBC. bblob не пробывал.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #4 - 06. Июля 2012 :: 11:28
Печать  
читать не проблема:[code]Stream=СоздатьОбъект("ADODB.Stream");
Stream.Mode=3;
Stream.Type=1;
Пока Rst.EOF=0 Цикл
     Stream.Open();
     p=Rst.Fields("picture");
     Stream.Write(p);
     ИмяРисунка="pic"+Преф+"_"+СокрЛП(Сч)+".jpg";
     Stream.SaveToFile(КаталогВременныхФайлов()+ИмяРисунка,2);
     Stream.Close();[/code]Закинуть как?
Когда то видел пример кода, где файл перебирался построчно бинарно. Так формировался поток, который из 7.7 можно закинуть в любой SQL.
Но найти его не могу.

Понял, почему перебирали - подменяли 0х00
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #5 - 06. Июля 2012 :: 11:32
Печать  
Dmitry The Wing писал(а) 06. Июля 2012 :: 05:26:
1С не дружит с блобами - это факт.
Сохранить блоб легко через УстановитьТекстовыйПараметр, а вот прочитать я смог только через скрипт на вижуалвасике. Сама 1С нивкакую не согласилась читать блоб.
Где-то тут на форуме видел упоминание об объекте BynaryData. Вроде бы его можно для этого использовать. Поищи.

Поэтому я и пробую через wsc. Но не выходит.

С типом параметра (криво, но) можно разобраться. Поток в blob все равно не пишется.
Мой начальник в VBA это делает, а в wsc не получается. Возможно wsc тоже глючит, как 7-ка
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #6 - 06. Июля 2012 :: 13:47
Печать  
А в 8.2 возможно загрузить файл в BLOB?
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #7 - 06. Июля 2012 :: 16:14
Печать  
Стало любопытно, что получится, если попробую вставить через 1С++ ODBCRecordSet.
Вопрос: мне понадобится для работы с blob-полем класс BinaryData?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #8 - 09. Июля 2012 :: 15:16
Печать  
simply писал(а) 06. Июля 2012 :: 16:14:
Стало любопытно, что получится, если попробую вставить через 1С++ ODBCRecordSet.
Вопрос: мне понадобится для работы с blob-полем класс BinaryData?

да именно с помощью него BinaryData и надо делать.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #9 - 09. Июля 2012 :: 15:17
Печать  
Спасибо, попробую.
Обязательно сообщу результаты.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #10 - 09. Июля 2012 :: 19:06
Печать  
не получилось через odbc-driver передать из памяти бинарный файл.

За то получается загрузить через любые ODBC-драйверы с помощью функции "LOAD_FILE()"
Код
Выбрать все
INSERT INTO files.f_temp (`data`) VALUES (LOAD_FILE('c:\\mysql\\tmp\\test.txt')) 

Два ограничения - файл должен быть на локальном сервере и "file" привилегия должна быть включена.

Столько промучаться, чтобы так примитивно ...
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #11 - 10. Июля 2012 :: 08:26
Печать  
вот нашел работающий код через 1cpp для MS SQL

Код
Выбрать все
	Глоб_meta = СоздатьОбъект("MetaDataWork");
	Данные=СоздатьОбъект("BinaryData");
	Данные.ЗагрузитьИзФайла(ИмяФайла);
	Зн_Док_sql = "'" + Глоб_meta.ЗначениеВСтрокуБД(Док_1с) + "'";

	rc.Подготовить("
	|insert into f_file(iddoc,dop_info)
	| values( "+ Зн_Док_sql + "  ,?  )
	|");
	rc.ДобПараметр(1,19,0,0);
	rc.УстПараметр(1,Данные);
	Попытка
	rc.ВыполнитьИнструкцию();
	Исключение
		сообщить("Не удалось сделать insert !!!");
		return;
	КонецПопытки;



таблица имеет структуру


create table f_file(
iddoc char(9) not null,  -- iddoc документа 1c
dop_info image,
CONSTRAINT PK0_f_file  PRIMARY KEY (iddoc)
)
 

  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #12 - 10. Июля 2012 :: 10:03
Печать  
Огромное спасибо, Z1!  Очень довольный

Работает безотказно даже с использованием MSSQL-го обозначения параметра "?".

P.S.: не знал, что есть такой тип "image". Не работаю с MS, только MySQL. И зачем мелокософт выпендривается? Обыкновенный blob.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #13 - 10. Июля 2012 :: 16:02
Печать  
Все таки любопытно, почему параметр LongVarBinary через ODBCRecordSet устанавливается, а через ADODB.Command - выдает ошибку?

Вот узнать бы, как автор этого класса это делает.
Ведь у ADO RecordSet-а параметров нет. Значит это делается через ADO Command.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #14 - 11. Июля 2012 :: 11:56
Печать  
отлично работает по #11!
но остановился на решении #10 - на восьмерку будет легче перенести. У 8.2 - 1С++ нет  Злой

и хотелось бы, хотя бы, предположения услышать - по вопросу #13
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #15 - 11. Июля 2012 :: 12:34
Печать  
simply писал(а) 11. Июля 2012 :: 11:56:
отлично работает по #11!
но остановился на решении #10 - на восьмерку будет легче перенести. У 8.2 - 1С++ нет  Злой

и хотелось бы, хотя бы, предположения услышать - по вопросу #13


а в восьмерки есть или нет строки неограниченной длины
и они храняться также как в v7 ( в бд) или нет ???
ароде есть еще решение которое может тебе подойти.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #16 - 11. Июля 2012 :: 12:46
Печать  
Нашел пока для SQL баз:
Цитата:
Строки 1С неограниченной длины хранятся в отдельной таблице SQL, поэтому их использование менее производительно, чем ограниченной.
Источник: http://howknow1c.ru/programmirovanie-1c/stroka-1s.html

Также, на инфостарте:
Цитата:
«NC» - строка фиксированной длины. Длина поля равна FieldLength * 2 байт. Представляет собой строку в формате Unicode (каждый символ занимает 2 байта).
«NVC» - строка переменной длины. Длина поля равна FieldLength * 2 + 2 байт. Первые 2 байта содержат длину строки (максимум FieldLength). Оставшиеся байты представляет собой строку в формате Unicode (каждый символ занимает 2 байта).
...
«NT» - строка неограниченной длины. Длина поля 8 байт. Первые четыре байта содержат начальный индекс блока в объекте Blob таблицы, вторые четыре – длину данных в объекте Blob. В объекте Blob содержится строка в формате Unicode.

Источник: http://infostart.ru/public/19734/

А где в файловой базе?
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #17 - 11. Июля 2012 :: 12:48
Печать  
судя по описанию "NT" - тоже в отдельной таблице
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #18 - 11. Июля 2012 :: 12:50
Печать  
Z1 писал(а) 11. Июля 2012 :: 12:34:
вроде есть еще решение которое может тебе подойти.

какое?
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #19 - 11. Июля 2012 :: 13:45
Печать  
simply писал(а) 11. Июля 2012 :: 12:50:
Z1 писал(а) 11. Июля 2012 :: 12:34:
вроде есть еще решение которое может тебе подойти.

какое?

либо преобразование в 64 полубайтов
либо мое bfile на  1cpp вроде тоже выкладывал.
просто написано на с++ и гораздо быстрее чем 64 полубайтов
и жмет лучше  чем 64 полубайты
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #20 - 11. Июля 2012 :: 13:50
Печать  
поиск bfile по 1cpp.ru ничего не дал
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #21 - 11. Июля 2012 :: 16:20
Печать  
simply писал(а) 11. Июля 2012 :: 13:50:
поиск bfile по 1cpp.ru ничего не дал

смотри
http://www.1cpp.ru/forum/YaBB.pl?num=1178538146/0
пост 10
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #22 - 11. Июля 2012 :: 16:23
Печать  
Спасибо! Иду "курить"!
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Invalid parameter type у ADODB.Command
Ответ #23 - 17. Июля 2012 :: 14:16
Печать  
[quote author=simply link=1341507344/0#0 date=1341507344]Добрый день!
Пишу загрузку файлов в MediumBLOB-поле на vbscript:

[code]...
oStream.LoadFromFile(FileName)
P_ = oStream.Read(oStream.Size)
...
With oCommand
   .CommandText = "INSERT INTO files.f_temp (data) VALUES (@p1)"
   .CommandType = 1
   .Parameters.Append     .CreateParameter("@P",205,1,oStream.Size,P_)
   .NamedParameters = 1
   .Execute , , 128
End With[/code][/quote]


Проблема оказалась в не правильном создании объекта oCommand.
Я создавал через строку подключения:
[code]Set oComm = CreateObject("ADODB.Command")
oComm.ActiveConnection = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & ServerName & ";UID=" & LoginName & ";PWD=" & Password & ";DATABASE=;OPTION=67110920"[/code]
А нужно через объект ADODB.Connection!
[code]Set oConn = CreateObject("ADODB.Connection")
With oConn
     .ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & ServerName & ";UID=" & LoginName & ";PWD=" & Password & ";DATABASE=;OPTION=67110920"
     .ConnectionTimeout = 3
     .CursorLocation = 3
     .Open
End With
Set oComm = CreateObject("ADODB.Command")
With oComm
     .ActiveConnection = oConn
     .CommandText = "INSERT INTO files.f_temp (data) VALUES (?)"
     .CommandType = 1
     .Parameters.Append .CreateParameter("@1",205, ,oStream.Size,oStream.Read)
     .Execute , , 128
End With[/code]
Все отлично работает!

[b]P.S.:[/b] В прошлый раз я выбрал вариант через функцию MySQL "LOAD_FILE()". Если у вас есть slave-сервера, реплицируемые не по данным, а по командам, то эта функция не подлежит репликации, и блоб-данные - соответственно.
[quote]Non-Deterministic Behavior

It turns out that transactions with mixed tables are not the only problems. There are also a number of functions which pose problems for MySQL statement-based replication. They are:

CURRENT_USER()
LOAD_FILE()
UUID()
UUID_SHORT()
USER()
FOUND_ROWS()
SYSDATE()
VERSION()
[/quote]
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать