Есть функция которая должна обращаться к БД и возвращать таблицу с некоторым данными вот код:
Функция ЗапросКБазе()
Connection = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "Provider=SQLOLEDB;
|Data Source= SERVER "";
|Initial Catalog= Trade "";
|UID= sa " ";
|PWD= sa";
Connection.Open(СтрокаСоединения);
RS = Новый COMОбъект("ADODB.Recordset");
RS.Open("sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '20090826' and orDate <= '20090827' order by orDate",Connection);
ВремТаб = Новый ТаблицаЗначений;
//Заполнение временной таблицы
Для НомерСтолб = 0 По RS.Fields.Count-1 Цикл
//Создание и добавление колонок во временную таблицу
ИмяСтолбца = RS.Fields.Item(НомерСтолб).Name;
ВремТаб.Колонки.Добавить(ИмяСтолбца);
КонецЦикла;
//обработка данных запроса
Пока RS.EOF Цикл
НоваяСтрока = ВремТаб.Добавить();
Для НомерСтолб = 0 По RS.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолб, RS.Fields(НомерСтолб).Value);
КонецЦикла;
Попытка
// перейти на следующую запись
RS.MoveNext();
Исключение
//не удалось пройти по набору данных
КонецПопытки;
КонецЦикла;
RS.Close();
Connection.Close();
Возврат ВремТаб;
// Вставить содержимое обработчика.
КонецФункции
При выполении возникает ошибка:
{Форма.Форма(20)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не существует, или отсутствует доступ.
Connection.Open(СтрокаСоединения);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не существует, или отсутствует доступ.
В чем может быть ошибка???
Функция ЗапросКБазе()
Connection = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "Provider=SQLOLEDB;
|Data Source= SERVER "";
|Initial Catalog= Trade "";
|UID= sa " ";
|PWD= sa";
Connection.Open(СтрокаСоединения);
RS = Новый COMОбъект("ADODB.Recordset");
RS.Open("sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '20090826' and orDate <= '20090827' order by orDate",Connection);
ВремТаб = Новый ТаблицаЗначений;
//Заполнение временной таблицы
Для НомерСтолб = 0 По RS.Fields.Count-1 Цикл
//Создание и добавление колонок во временную таблицу
ИмяСтолбца = RS.Fields.Item(НомерСтолб).Name;
ВремТаб.Колонки.Добавить(ИмяСтолбца);
КонецЦикла;
//обработка данных запроса
Пока RS.EOF Цикл
НоваяСтрока = ВремТаб.Добавить();
Для НомерСтолб = 0 По RS.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолб, RS.Fields(НомерСтолб).Value);
КонецЦикла;
Попытка
// перейти на следующую запись
RS.MoveNext();
Исключение
//не удалось пройти по набору данных
КонецПопытки;
КонецЦикла;
RS.Close();
Connection.Close();
Возврат ВремТаб;
// Вставить содержимое обработчика.
КонецФункции
При выполении возникает ошибка:
{Форма.Форма(20)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не существует, или отсутствует доступ.
Connection.Open(СтрокаСоединения);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не существует, или отсутствует доступ.
В чем может быть ошибка???
По теме из базы знаний
- Конфигурация для получения списка таблиц информационной базы
- Запрос к внешней базе данных MS SQL Server
- TMSSQL - работа с базами данных MS SQL Server в скриптах на OneScript и из командной строки
- OneScript на страже порядка на сервере тестовых баз данных
- Database Compression Tool: Инструмент для свертки и сжатия баз данных 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
а что может не так я уже менял Provider=SQLOLEDB на Driver = {SQL server} не помогло кста еще один вопрос по теме как в sql запрос передать значение даты т.е чтобы условие:
where orDate >= '20090826' and orDate <= '20090827'
было бы таим:
where orDate >= ДатаНач and orDate <= ДатаКон
where orDate >= '20090826' and orDate <= '20090827'
было бы таим:
where orDate >= ДатаНач and orDate <= ДатаКон
Покопался в инете нашел рабочую процедура подключения к базе(подключение делаецца через узел обмена), коннетиться начало но вот теперь пишет следующие, при выполнении запроса:
{Форма.Форма(28)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Recordset): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
RS.Open("sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '20090826' and orDate <= '20090827' order by orDate",Коннект);
{Форма.Форма(28)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Recordset): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
RS.Open("sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '20090826' and orDate <= '20090827' order by orDate",Коннект);
в общем подключается запрос выполняется но теперь засада с датой, вот кусок рабочего кода может кому пригодиться:
ОбъектАДО = Новый COMОбъект("ADODB.Connection");
Попытка
Состояние("Соединение...");
ОбъектАДО.Open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Mobile_Trade;Data Source=TSERVER");
Сообщить("Соединение установлено!!!");
Сообщить("************************************");
Исключение
Сообщить("Ошибка подключения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
ЗапросКБД = Новый COMОбъект("ADODB.Command");
ЗапросКБД.ActiveConnection = ОбъектАДО;
ЗапросКБД.CommandText = " sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '"+ДатаНач+"' and orDate <= '"+ДатаКон+"' order by orDate";
ЗапросКБД.Execute();
Ошибка о которой говорилось раньше возникала из за несоотвествия форматов дат, получааем фомарт нужной даты:
ДатаНЗап = Формат(ДатаНач,"ДФ=""ггггММдд""")
ДатаКЗап = Формат(ДатаКон,"ДФ=""ггггММдд""" )
ОбъектАДО = Новый COMОбъект("ADODB.Connection");
Попытка
Состояние("Соединение...");
ОбъектАДО.Open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Mobile_Trade;Data Source=TSERVER");
Сообщить("Соединение установлено!!!");
Сообщить("************************************");
Исключение
Сообщить("Ошибка подключения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
ЗапросКБД = Новый COMОбъект("ADODB.Command");
ЗапросКБД.ActiveConnection = ОбъектАДО;
ЗапросКБД.CommandText = " sel ect orNumber,orDate,orSumRoubles,DocNumber,ChangeDate fr om DS_Orders where orDate >= '"+ДатаНач+"' and orDate <= '"+ДатаКон+"' order by orDate";
ЗапросКБД.Execute();
Ошибка о которой говорилось раньше возникала из за несоотвествия форматов дат, получааем фомарт нужной даты:
ДатаНЗап = Формат(ДатаНач,"ДФ=""ггггММдд""")
ДатаКЗап = Формат(ДатаКон,"ДФ=""ггггММдд""" )
Нате вам из живой базы кусочек :)
Ну и примерчик:
//Создать объект ADODB.Connection
//Возврат:
// OLE - объект соединение или Неопределено
Функция СоздатьСоединениеАДО() Экспорт
Перем СоединениеАДО;
Попытка
СоединениеАДО = Новый COMОбъект("ADODB.Connection");
Исключение
#Если Клиент Тогда
Сообщить("Не удалось создать объект ""ADODB.Connection""", СтатусСообщения.Важное);
#КонецЕсли
Возврат Неопределено;
КонецПопытки;
СоединениеАДО.ConnectionTimeOut = 20;
СоединениеАДО.CursorLocation = 3;
Возврат СоединениеАДО;
КонецФункции //СоздатьСоединениеАДО()
//Создать объект ADODB.Command
//Возврат:
// OLE - объект запрос или Неопределено
Функция СоздатьЗапросАДО() Экспорт
Перем ЗапросАДО;
Попытка
ЗапросАДО = Новый COMОбъект("ADODB.Command");
Исключение
#Если Клиент Тогда
Сообщить("Не удалось создать объект ""ADODB.Command""", СтатусСообщения.Важное);
#КонецЕсли
Возврат Неопределено;
КонецПопытки;
Возврат ЗапросАДО;
КонецФункции //СоздатьЗапросАДО()
//СоединениеАДО (OLE) - соединение
//ЗапросАДО (OLE) - запрос
//Возврат:
// Булево - удачно, нет
Функция ПодключитьсяАДОкБД(СоединениеАДО, ЗапросАДО)
СтрокаСоединения = "driver={SQL Server};server="+Адрес+";uid="+Пользователь+";pwd="+Пароль+";Database="+БазаДанных;
Попытка
СоединениеАДО.Open(СтрокаСоединения);
Исключение
Сообщить("Не удалось установить соединение с базой данных", СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
ЗапросАДО.ActiveConnection = СоединениеАДО;
Возврат Истина;
КонецФункции // ПодключитьсяАДОкБД()
ПоказатьНу и примерчик:
СоединениеАДО = СоздатьСоединениеАДО();
Если СоединениеАДО = Неопределено Тогда
Сообщить("Не удалось СоздатьСоединениеАДО", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
ЗапросАДО = СоздатьЗапросАДО();
Если ЗапросАДО = Неопределено Тогда
Сообщить("Не удалось СоздатьЗапросАДО", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Если Не ПодключитьсяАДОкБД(СоединениеАДО, ЗапросАДО) Тогда
Сообщить("Не удалось ПодключитьсяАДОкБД", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
ЗапросАДО.CommandText = "SEL ECT field1 FROM table1";
Выборка = ЗапросАДО.Execute();
Пока Не Выборка.EOF() Цикл
Сообщить(Выборка.Fields("field1").Value);
Выборка.MoveNext();
КонецЦикла;
Показать
(14) Пасибо большое за кусок из живой базы....
В результате удалось конектитсья и удалось выполнить запрос но проблема возникла с заполнением ТаблицыЗначений результатами выполнения запроса пишет следующие:
Индекс находится за границами массива
НоваяСтрока[НомерСтолбца] = Результат.Fields(Результат.Fields.Item(НомерСтолбца).Name).Value;
Вот весь кусок кода:
В результате удалось конектитсья и удалось выполнить запрос но проблема возникла с заполнением ТаблицыЗначений результатами выполнения запроса пишет следующие:
Индекс находится за границами массива
НоваяСтрока[НомерСтолбца] = Результат.Fields(Результат.Fields.Item(НомерСтолбца).Name).Value;
Вот весь кусок кода:
//создаем временную таблицу
ТЗ_Запроса = Новый ТаблицаЗначений;
//Заполнение временной таблицы
Для НомерСтолбца = 0 По Результат.Fields.Count-1 Цикл
//Создание и добавление колонок во временную таблицу
ТЗ_Запроса.Колонки.Добавить("_"+Результат.Fields.Item(НомерСтолбца).Name,,Результат.Fields.Item(НомерСтолбца).Name);
//обработка данных запроса
Результат.MoveFirst();
Пока Результат.EOF = 0 Цикл
НоваяСтрока = ТЗ_Запроса.Добавить();
Для НомерСтолбца = 0 По Результат.Fields.Count-1 Цикл
НоваяСтрока[НомерСтолбца] = Результат.Fields(Результат.Fields.Item(НомерСтолбца).Name).Value;
КонецЦикла;
Попытка
// перейти на следующую запись
Результат.MoveNext();
Исключение
//не удалось пройти по набору данных
КонецПопытки;
КонецЦикла;
КонецЦикла;
Показать
чем дальше тем веселее за решеним одной проблемы последовала другая:
В случае когда Пока Результат.EOF() = 0 Цикл в таблицу выводиться один столбец и запонляетсья строкам ему не соотвестующими, если сделать Пока Результат.EOF() = 1 Цикл то таблицу перадются все необходимые столбцы но строи в этом случае пустые....
//обработка данных запроса
Результат.MoveFirst();
Пока Результат.EOF() = 0 Цикл
НоваяСтрока = ТЗ_Запроса.Добавить();
Для НомерСтолбца = 0 По Результат.Fields.Count-1 Цикл
НоваяСтрока[ИмяСтолбца] = Результат.Fields(Результат.Fields.Item(НомерСтолбца).Name).Value;
В случае когда Пока Результат.EOF() = 0 Цикл в таблицу выводиться один столбец и запонляетсья строкам ему не соотвестующими, если сделать Пока Результат.EOF() = 1 Цикл то таблицу перадются все необходимые столбцы но строи в этом случае пустые....
в результате множественныхпроб и ошибок был и поисков по инету, решение проблемы было найдено вот кусок полностью рабочего кода если кому буит нужно:
теперь дальше, результат данного запроса мне необходимо объединить с результатом другого запроса в ТЗ. т.е в ТЗ добавить две колонки из этого запроса...
Функция ЗапросКБД()
//преобразуем дату в формат ГГГГММДД
ДатаВЗапН = Формат(ДатаНач,"ДФ=""ггггММдд""");
ДатаВЗапК = Формат(ДатаКон,"ДФ=""ггггММдд""");
//создаем подключение к SQL базе
ОбъектАДО = Новый COMОбъект("ADODB.Connection");
Попытка
Состояние("Соединение...");
ОбъектАДО.Open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Mobile_Trade;Data Source=TSERVER");
Сообщить("Соединение установлено!!!");
Сообщить("************************************");
Исключение
Сообщить("Ошибка подключения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
//пишем запрос
ЗапросКБД = Новый COMОбъект("ADODB.Command");
ЗапросКБД.ActiveConnection = ОбъектАДО;
ЗапросКБД.CommandText = " sel ect DocNumber,orDate,ChangeDate fr om DS_Orders where orDate >= '"+ДатаВЗапН+"' and orDate <= '"+ДатаВЗапК+"' order by orDate";
// Создаем объект ADODB.RecordSet
Результат = Новый COMОбъект("ADODB.RecordSet");
//выполняем запрос
Попытка
Состояние("Выгружаем...");
Результат = ЗапросКБД.Execute();
Сообщить("Данные успешно выгружены!!!");
Сообщить("************************************");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
// Проверяем результат выборки на наличие записей
Если Результат.BOF = 1 и Результат.EOF = 1 Тогда
Возврат Истина;
КонецЕсли;
//создаем временную таблицу
ТЗ_Запроса = Новый ТаблицаЗначений;
//Заполнение временной таблицы
Для каждого Field из Результат.Fields Цикл
//Создание и добавление колонок во временную таблицу
ТЗ_Запроса.Колонки.Добавить(Field.Name);
КонецЦикла;
//обработка данных запроса
Пока Не Результат.EOF Цикл
НоваяСтрока = ТЗ_Запроса.Добавить();
Индекс = 0;
Для Каждого Field из Результат.Fields Цикл
НоваяСтрока[Индекс] = Field.Value;
Индекс = Индекс +1;
КонецЦикла;
Попытка
// перейти на следующую запись
Результат.MoveNext();
Исключение
//не удалось пройти по набору данных
КонецПопытки;
КонецЦикла;
ОбъектАДО.Close();
ЗапросКБД = Неопределено;
ОбъектАДО = Неопределено;
Результат = Неопределено;
Возврат ТЗ_Запроса;
КонецФункции
Показатьтеперь дальше, результат данного запроса мне необходимо объединить с результатом другого запроса в ТЗ. т.е в ТЗ добавить две колонки из этого запроса...
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот