SQL запрос к базе данных

1. plasmoid 27.08.09 10:20 Сейчас в теме
Есть функция которая должна обращаться к БД и возвращать таблицу с некоторым данными вот код:

Функция ЗапросКБазе()

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-сервер не существует, или отсутствует доступ.

В чем может быть ошибка???
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Душелов 4021 27.08.09 10:29 Сейчас в теме
"сервер не существует, или отсутствует доступ."
3. plasmoid 27.08.09 10:30 Сейчас в теме
и что делать?? при том что сервер существует и доступ к нему есть и база видется....
4. Душелов 4021 27.08.09 10:31 Сейчас в теме
(3) Значит ошибка в строке соединения.
5. plasmoid 27.08.09 10:36 Сейчас в теме
а что может не так я уже менял Provider=SQLOLEDB на Driver = {SQL server} не помогло кста еще один вопрос по теме как в sql запрос передать значение даты т.е чтобы условие:
where orDate >= '20090826' and orDate <= '20090827'
было бы таим:
where orDate >= ДатаНач and orDate <= ДатаКон
7. Душелов 4021 27.08.09 10:44 Сейчас в теме
(5) Создай файл с расширением udl, открой его в проводнике. Проставь нужные параметры в диалоге, сохрани.
Используй полученную строку соединения.
6. Душелов 4021 27.08.09 10:43 Сейчас в теме
where orDate >= " + ДатаНач + " + and orDate <= " + ДатаКон + "

Соответственно, эти переменные должны быть в нужном формате.
8. plasmoid 27.08.09 10:51 Сейчас в теме
(6) спасибо......
(7) не сочтите меня идиотом но я все же спрошу, где этот файл создавать, а то я торможу....
9. Душелов 4021 27.08.09 11:19 Сейчас в теме
10. plasmoid 27.08.09 11:59 Сейчас в теме
Покопался в инете нашел рабочую процедура подключения к базе(подключение делаецца через узел обмена), коннетиться начало но вот теперь пишет следующие, при выполнении запроса:

{Форма.Форма(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",Коннект);
11. Душелов 4021 27.08.09 13:13 Сейчас в теме
Советую почитать литературу по запросам SQL.
12. plasmoid 27.08.09 13:16 Сейчас в теме
пасибо большое очень верная мысль
13. plasmoid 27.08.09 17:13 Сейчас в теме
в общем подключается запрос выполняется но теперь засада с датой, вот кусок рабочего кода может кому пригодиться:

ОбъектАДО = Новый 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();

Ошибка о которой говорилось раньше возникала из за несоотвествия форматов дат, получааем фомарт нужной даты:

ДатаНЗап = Формат(ДатаНач,"ДФ=""ггггММдд""")
ДатаКЗап = Формат(ДатаКон,"ДФ=""ггггММдд""" )
14. sound 538 27.08.09 22:11 Сейчас в теме
Нате вам из живой базы кусочек :)

//Создать объект 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();
КонецЦикла;
 
Показать
15. plasmoid 28.08.09 10:27 Сейчас в теме
(14) Пасибо большое за кусок из живой базы....
В результате удалось конектитсья и удалось выполнить запрос но проблема возникла с заполнением ТаблицыЗначений результатами выполнения запроса пишет следующие:

Индекс находится за границами массива
НоваяСтрока[НомерСтолбца] = Результат.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();
Исключение
//не удалось пройти по набору данных
КонецПопытки;
КонецЦикла; 	
КонецЦикла;
Показать
16. sound 538 28.08.09 10:36 Сейчас в теме
17. plasmoid 28.08.09 10:43 Сейчас в теме
18. sound 538 28.08.09 10:50 Сейчас в теме
(17) ну погляди в отладчике какой там у тебя индекс и какой массив
19. plasmoid 28.08.09 11:57 Сейчас в теме
чем дальше тем веселее за решеним одной проблемы последовала другая:

//обработка данных запроса
Результат.MoveFirst();
Пока Результат.EOF() = 0 Цикл
    НоваяСтрока  = ТЗ_Запроса.Добавить();
Для НомерСтолбца = 0 По Результат.Fields.Count-1 Цикл
    НоваяСтрока[ИмяСтолбца] = Результат.Fields(Результат.Fields.Item(НомерСтолбца).Name).Value;


В случае когда Пока Результат.EOF() = 0 Цикл в таблицу выводиться один столбец и запонляетсья строкам ему не соотвестующими, если сделать Пока Результат.EOF() = 1 Цикл то таблицу перадются все необходимые столбцы но строи в этом случае пустые....
20. sound 538 28.08.09 12:06 Сейчас в теме
(19) юзай юзай, чуть чуть осталось :)
21. plasmoid 28.08.09 12:25 Сейчас в теме
блин у мну варинтов больше нет да и в sql я не силен, если есть возможность то подскажите....
22. plasmoid 28.08.09 14:36 Сейчас в теме
в результате множественныхпроб и ошибок был и поисков по инету, решение проблемы было найдено вот кусок полностью рабочего кода если кому буит нужно:

Функция ЗапросКБД()
//преобразуем дату в формат ГГГГММДД	
	ДатаВЗапН = Формат(ДатаНач,"ДФ=""ггггММдд""");
	ДатаВЗапК = Формат(ДатаКон,"ДФ=""ггггММдд""");
	
//создаем подключение к 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();
	 ЗапросКБД = Неопределено;
	 ОбъектАДО = Неопределено;
	 Результат = Неопределено;
	
	Возврат ТЗ_Запроса;
КонецФункции  
Показать


теперь дальше, результат данного запроса мне необходимо объединить с результатом другого запроса в ТЗ. т.е в ТЗ добавить две колонки из этого запроса...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот