Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запись файла в базу SQL (число прочтений - 9305 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Запись файла в базу SQL
30. Июля 2010 :: 13:38
Печать  
Собственно как?
Есть внешняя БД на SQL. Подключаемя хорошо, манипулируем любыми данными отлично. А вот как записать в поле весь файл целиком?
Код
Выбрать все
  Stream=СоздатьОбъект("ADODB.Stream");
    Stream.Type=1;
    Stream.Open();
    Stream.LoadFromFile(ИмяФайла);
    Connection = СоздатьОбъект("ADODB.Connection");
	СтрокаСоединения = "Provider=SQLOLEDB.1;Password=" + СокрЛП(Pwd) +
				 ";Persist Security Info=False;User ID="+ СокрЛП(Uid) +
					   ";Initial Catalog="+ СокрЛП(Database) +
					   ";Data Source=" + СокрЛП(Server);
	Connection.Open(СтрокаСоединения);
    RecordSet = СоздатьОбъект("ADODB.Recordset");
    RecordSet.CursorLocation = 3;
    RecordSet.LockType = 2;
    Запрос = "
	|Select
	|	Fail
	|from
	|	DataFails
	|WHERE
	|	UserID = " + Число(ИДПольз) + "
	|";
    RecordSet.Open(Запрос, Connection);
    Если RecordSet.RecordCount=0 Тогда
	  RecordSet.AddNew();
    Иначе
	  RecordSet.MoveFirst();
    КонецЕсли;
    RecordSet.Fields("Fail").Value=Stream.Read(-1);
    RecordSet.Update();
    Stream.Close();		 



На такой код ругается:
RecordSet.Fields("Fail").Value=Stream.Read(-1);
Тип переменой не поддерживается
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #1 - 30. Июля 2010 :: 14:03
Печать  
Не понятно, что Вы хотите сделать, записать в таблицу DataFails в поле Fail весь файл?
  
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запись файла в базу SQL
Ответ #2 - 30. Июля 2010 :: 14:05
Печать  
pvase писал(а) 30. Июля 2010 :: 14:03:
Не понятно, что Вы хотите сделать, записать в таблицу DataFails в поле Fail весь файл?


Именно, точнее все его содержимое.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #3 - 01. Августа 2010 :: 14:30
Печать  
Тогда надо использовать конструкцию "INSERT" а не "SELECT".
  
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запись файла в базу SQL
Ответ #4 - 02. Августа 2010 :: 13:26
Печать  
pvase писал(а) 01. Августа 2010 :: 14:30:
Тогда надо использовать конструкцию "INSERT" а не "SELECT".


В данном случае это верно т. к.
Код
Выбрать все
   RecordSet.Fields("Fail").Value=Stream.Read(-1);
    RecordSet.Update();
 



Но это уже не важно. Выход из положения найден. Корректно записывается в поле c типом Varbinary(max) и читается текстовый файл (*.txt). С остальными не проверял.

Может кому понадобится. Функция записи:
Код
Выбрать все
Функция ОтправитьФайлНаСервер(ИмяФайла)

	ТекстСкрипта = "
	|Function SaveToSQL
	|On Error Resume Next
    |Set Stream=CreateObject(""ADODB.Stream"")
    |Stream.Type=1
    |Stream.Open()
    |Stream.LoadFromFile(""" + ИмяФайла + """)
    |Set Connection=CreateObject(""ADODB.Connection"")
    |Connection.Open(""Provider=SQLOLEDB.1;Password=" + СокрЛП(Pwd) + ";Persist Security Info=False;User ID=" + СокрЛП(Uid) +
				";Initial Catalog=" + СокрЛП(Database) + ";Data Source=" + СокрЛП(Server) + """)
    |Set RecordSet=CreateObject(""ADODB.Recordset"")
    |RecordSet.CursorLocation=3
    |RecordSet.LockType=2
    |qvery =""Select * from dbo.DataFails WHERE UserID = " + Число(ИДПольз) + """
    |RecordSet.Open qvery, Connection
    |If RecordSet.RecordCount=0 Then
    |    RecordSet.AddNew()
    |Else
    |    RecordSet.MoveFirst()
    |End If
    |RecordSet.Fields(""Fail"").Value=Stream.Read()
    |RecordSet.Fields(""UserID"").Value=" + Число(ИДПольз) + "
    |RecordSet.Update()
    |Stream.Close()
	|If Err.Number <> 0 Then
	|	SaveToSQL = 0
	|	Err.Clear
	|Else
	|	SaveToSQL = 1
	|End If
	|
	|End Function
	|";

	VBS=СоздатьОбъект("MSScriptControl.ScriptControl");
	VBS.Language="vbscript";
	VBS.Timeout=-1;
	VBS.AddCode(ТекстСкрипта);
	Рез = VBS.Run("SaveToSQL");

	Возврат Рез;

КонецФункции //  



Функция чтения:
Код
Выбрать все
Функция ПолучитьФайлССервера(ИмяФайла)


	Если Прав(КаталогИБ(),1) = "\" Тогда
		мКаталогИБ = КаталогИБ();
	Иначе
		мКаталогИБ = КаталогИБ() + "\";
	КонецЕсли;

	Если ФС.СуществуетФайл(мКаталогИБ + "Obmen") = 0 Тогда
		ФС.СоздатьКаталог(мКаталогИБ + "Obmen");
	КонецЕсли;

	КаталогОбмена = мКаталогИБ + "Obmen\";
	ПолноеИмяФайла = КаталогОбмена + Строка(ИДПольз) + ИмяФайла;

	Если ФС.СуществуетФайл(ПолноеИмяФайла) <> 0 Тогда
		ФС.УдалитьФайл(ПолноеИмяФайла);
	КонецЕсли;

	ТекстСкрипта = "
	|Function LoadFromSQL
	|On Error Resume Next
    |Set Stream=CreateObject(""ADODB.Stream"")
    |Stream.Type=1
    |Stream.Open()
    |Set Connection=CreateObject(""ADODB.Connection"")
    |Connection.Open(""Provider=SQLOLEDB.1;Password=" + СокрЛП(Pwd) + ";Persist Security Info=False;User ID=" + СокрЛП(Uid) +
				";Initial Catalog=" + СокрЛП(Database) + ";Data Source=" + СокрЛП(Server) + """)
    |Set RecordSet=CreateObject(""ADODB.Recordset"")
    |Qvery =""Select * from dbo.DataFails WHERE UserID = " + Число(ИДПольз) + """
	|RecordSet.Open Qvery, Connection
    |RecordSet.MoveFirst()
    |Stream.Write(RecordSet.Fields(""Fail"").Value)
    |Stream.SaveToFile(""" + ПолноеИмяФайла + """)
	|Stream.Close()
	|If Err.Number <> 0 Then
	|	LoadFromSQL = 0
	|	Err.Clear
	|Else
	|	LoadFromSQL = """ + ПолноеИмяФайла + """
	|End If
	|
	|End Function
	|";

	VBS=СоздатьОбъект("MSScriptControl.ScriptControl");
	VBS.Language="vbscript";
	VBS.Timeout=-1;
	VBS.AddCode(ТекстСкрипта);
	Рез = VBS.Run("LoadFromSQL");

	Возврат Рез;

КонецФункции // ПолучитьФайлССервера 



  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3015
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #5 - 02. Августа 2010 :: 13:57
Печать  
A ODBCRecordset вместо ADODB по каким соображениям не используется?

Используя объекты ODBCRecordset и BinaryData писать/читать файлы в/из БД не очень сложно.
  

1&&2&&3
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3015
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #6 - 02. Августа 2010 :: 14:03
Печать  
например запись файла в БД

Код
Выбрать все
рс=СоздатьОбъект("ODBCRecordset");
рс.Подготовить("
|insert into my_table
|(data) values(?)
|");
рс.ДобПараметр(1,19,0,0);
Данные=СоздатьОбъект("BinaryData");
Данные.ЗагрузитьИзФайла(Файл);
рс.УстПараметр(1,Данные);
рс.ВыполнитьИнструкцию();
 



на чтение - кода примерно столько же
  

1&&2&&3
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запись файла в базу SQL
Ответ #7 - 03. Августа 2010 :: 05:20
Печать  
trad писал(а) 02. Августа 2010 :: 14:03:
например запись файла в БД

Код
Выбрать все
рс=СоздатьОбъект("ODBCRecordset");
рс.Подготовить("
|insert into my_table
|(data) values(?)
|");
рс.ДобПараметр(1,19,0,0);
Данные=СоздатьОбъект("BinaryData");
Данные.ЗагрузитьИзФайла(Файл);
рс.УстПараметр(1,Данные);
рс.ВыполнитьИнструкцию();
 



на чтение - кода примерно столько же



А вот за это спасибо. У мну как раз ODBCRecordset и используется для чтения и записи информации в SQL базу. А вот как с его помощью засунуть файл не догадался. Счас буду тренироваться.
  
Наверх
 
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #8 - 07. Сентября 2010 :: 13:22
Печать  
Kondarat писал(а) 03. Августа 2010 :: 05:20:
А вот за это спасибо. У мну как раз ODBCRecordset и используется для чтения и записи информации в SQL базу. А вот как с его помощью засунуть файл не догадался. Счас буду тренироваться.

to Kondarat.
Вы уже попробывали? Если есть время, напишите как храните бинарные данные: создали отдельную database или в 1С-овской базе создаете отдельную таблицу?
  
Наверх
 
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #9 - 08. Сентября 2010 :: 11:53
Печать  
zk96 писал(а) 07. Сентября 2010 :: 13:22:
Kondarat писал(а) 03. Августа 2010 :: 05:20:
А вот за это спасибо. У мну как раз ODBCRecordset и используется для чтения и записи информации в SQL базу. А вот как с его помощью засунуть файл не догадался. Счас буду тренироваться.

to Kondarat.
Вы уже попробывали? Если есть время, напишите как храните бинарные данные: создали отдельную database или в 1С-овской базе создаете отдельную таблицу?

Да в принципе пофиг - как нравится так и делай. Я храню прямо в 1с-ной базе. 1С чужие таблицы не трогает. Выгружать/бекапить естественно придется средствами SQL
  
Наверх
ICQ  
IP записан
 
zk96
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 320
Местоположение: Киев
Зарегистрирован: 15. Ноября 2009
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #10 - 08. Сентября 2010 :: 16:45
Печать  
avgreen писал(а) 08. Сентября 2010 :: 11:53:
Да в принципе пофиг - как нравится так и делай. Я храню прямо в 1с-ной базе. 1С чужие таблицы не трогает. Выгружать/бекапить естественно придется средствами SQL

Спасибо за консультацию.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Запись файла в базу SQL
Ответ #11 - 24. Ноября 2011 :: 10:31
Печать  
Че-то у мене нефига не выходить.
вот:
Код
Выбрать все
	рс=глСоединение();
	рс.Подготовить("
	|insert into my_table
	|(data) values(?)
	|");
	рс.ДобПараметр(2,18,0,0);
	Данные=СоздатьОбъект("BinaryData");
	Стат=Данные.ЗагрузитьИзФайла(СокрЛП(фПуть),1);
	рс.УстПараметр(1,Данные);
	рс.ВыполнитьСкалярный();

 


таблицу создаю так:
Код
Выбрать все
create table my_table (data varbinary)
 


Вылет.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #12 - 24. Ноября 2011 :: 12:01
Печать  
Должно быть
     rc.ДобПараметр(1,19,0,0);
     rc.УстПараметр(1,Данные);

далее у меня используется успешно

rc.ВыполнитьИнструкцию();

+ в этой таблице же должны быть еще какие либо поля
иначе куча из таблицы с одним полем типа image это слишком.

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Запись файла в базу SQL
Ответ #13 - 24. Ноября 2011 :: 12:19
Печать  
Z1 писал(а) 24. Ноября 2011 :: 12:01:
Должно быть
     rc.ДобПараметр(1,19,0,0);
     rc.УстПараметр(1,Данные);

далее у меня используется успешно

rc.ВыполнитьИнструкцию();

+ в этой таблице же должны быть еще какие либо поля
иначе куча из таблицы с одним полем типа image это слишком.



Z1 Огромный СЕНКС!
1.Ошибка моя заключалась в том что я создавал таблицу с типом varbinary а надо было Image
2.Верно что параметр не 17 а 19.
Все пошло на УРА!
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Запись файла в базу SQL
Ответ #14 - 25. Ноября 2011 :: 07:17
Печать  
1. Таким образом можно хранить файлы любого типа ?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать