Проблемы с adodc

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Проблемы с adodc

Сообщение funtik_sql » 26.12.2006 (Вт) 12:06

Всем привет.
Проблема такая: Есть БД MSQL, в ней есть процедура Proc1 из которой я вызываю другую процедуру Proc2.

Есть проект VB, а в нем компонент adodc.Так вот при вызове метода Refresh, adodc выдает ошибку:
Операция не допускается, если объект закрыт


Код: Выделить всё
Adodc1.ConnectionString = "File Name=test.udl"
Adodc1.CommandType = adCmdStoredProc
Adodc1.RecordSource = "Proc1"
Adodc1.Refresh


Proc1 должна возвращать набор записей, но они естессно не возвращаются.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.12.2006 (Вт) 12:15

Раз.

tag_warning
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 12:17

Короче экпирименты показали следующее:
При вызове из Proc1 процедуры, в которой осуществляется простая выборка - все норм.
При вызове из Proc1 процедуры, в которой осуществляется запрос с использованием агрегатных функций - неработает.

С чем это может быть связвно?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.12.2006 (Вт) 12:25

С корявым написанием запроса с использованием агрегатных функций, например.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 26.12.2006 (Вт) 13:03

А еще с тем, что ADODC это коллекция багов и глюков. И вообще устарело. Оно использует ADO 2.1.
Лучший способ понять что-то самому — объяснить это другому.

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 14:21

GSerg писал(а):С корявым написанием запроса с использованием агрегатных функций, например.

Как например не прокатит.
Обе функции работают по отдельности нормально, вызываются через adodc нормально. Проблема имеено в совместном вызове.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.12.2006 (Вт) 14:44

Нет ли вложенных транзакций?
И да, ADODC выкинуть.
Lasciate ogni speranza, voi ch'entrate.

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 14:54

alibek писал(а):Нет ли вложенных транзакций?
И да, ADODC выкинуть.


В процедуре Proc2 состовляется обычный запрос с группировкой из таблиц и view.
А какая альтернатива есть adodc?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.12.2006 (Вт) 15:25

Покажи запрос и скажи, какая база.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 15:52

GSerg писал(а):Покажи запрос и скажи, какая база.

MSSQL2000

Proc1:
Код: Выделить всё
CREATE PROCEDURE Proc1 AS
SET NOCOUNT ON
create table #data (
Users_Id int,
FirstObgectAC_id int,
)

insert #data exec Proc2
SELECT Users_id,FirstObgectAC_id
FROM #data
drop table #data
GO


Proc2
Код: Выделить всё
CREATE PROCEDURE Proc2 AS
SET NOCOUNT ON
SELECT Users.Users_Id, min(ObjectAC.ObAC_id) AS FirstObgectAC_id
FROM Users LEFT JOIN ObjectAC ON Users.Users_Id = ObjectAC.Users_Id
GROUP BY Users.Users_Id
GO


ObjectAC - это таблица

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.12.2006 (Вт) 16:00

попробуй

Код: Выделить всё
CREATE PROCEDURE Proc1 AS
SET NOCOUNT ON
create table #data (
Users_Id int,
FirstObgectAC_id int
)


SET NOCOUNT ON

insert #data exec Proc2

SET NOCOUNT OFF

SELECT Users_id,FirstObgectAC_id
FROM #data

--drop table #data
GO


ошибка:

create table #data (
Users_Id int,
FirstObgectAC_id int,
)

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 16:03

4Konst_One
Не, не помогает
Запятой там нет, просто глюкануло

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.12.2006 (Вт) 16:06

а зачем тебе вообще нужна процедура Proc1 :?:
она бессмыслена в данном исполнении, юзай сразу Proc2

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 16:08

Konst_One писал(а):а зачем тебе вообще нужна процедура Proc1 :?:
она бессмыслена в данном исполнении, юзай сразу Proc2


В ней создается запрос из многих таблиц.
Он очень длинный, я просто для удобства привел ту часть где идет обращение к Proc2.

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 26.12.2006 (Вт) 16:13

Кстати вариант без агрегатной функции работает:
Proc2
Код: Выделить всё
CREATE PROCEDURE Proc2 AS
SET NOCOUNT ON
SELECT Users.Users_Id
FROM Users LEFT JOIN ObjectAC ON Users.Users_Id = ObjectAC.Users_Id
GROUP BY Users.Users_Id
GO

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.12.2006 (Вт) 16:21

попробуйте отказаться от ADODC и перейти на работу с ADODB.Recordset, проблем таких у вас не будет :wink:

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 26.12.2006 (Вт) 18:27

при LEFT JOIN могут возникать пустые ObjectAC.ObAC_id
что вызывает WARNING что, вероятно, и определяется как ошибка

Код: Выделить всё
Warning: Null value is eliminated by an aggregate or other SET operation.


попробуйте отказаться от ADODC и перейти на работу с ADODB.Recordset, проблем таких у вас не будет Wink

проблемы останутся

РЕШЕНИЕ: поменять запрос, к примеру так
Код: Выделить всё
MIN(ISNULL(ObjectAC.ObAC_id,0))
I Have Nine Lives You Have One Only
THINK!

funtik_sql
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 26.12.2006 (Вт) 11:52

Сообщение funtik_sql » 27.12.2006 (Ср) 9:55

4HandKot
Да ошибка была именно в пустых полях
Спасибо, выручил)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.12.2006 (Ср) 9:58

А лучше inner join.
Лучший способ понять что-то самому — объяснить это другому.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 27.12.2006 (Ср) 12:11

Antonariy писал(а):А лучше inner join.

тут возникает множество решений
и ISNULL()
и INNER JOIN
и подзапрос SELECT ...
и ... вероятно еще есть

у каждого пути есть свои плюсы и минусы
I Have Nine Lives You Have One Only
THINK!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 114

    TopList