Строка запроса не помещается в String

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

Строка запроса не помещается в String

Сообщение Лексей » 16.02.2005 (Ср) 10:21

Подскажите, плиз, пути решения!
Строка SQL запроса для открытия набора записей не помещается в переменную типа String, какие пути решения можно применить?
Заранее благодарен всем!

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

Сообщение alibek » 16.02.2005 (Ср) 10:24

В 2 гигобайта??? Да тогда никаких путей решения не существует.
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 10:28

у меня почему то хватает только на 252 символа

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 16.02.2005 (Ср) 10:41

А с какими симптомами она не помещается в String?
И неплохо было бы код посмотреть.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 10:52

Ну например вот формирование строки, которая должна использоваться в открытии набора записей:
Код: Выделить всё
strSelect = "SELECT * FROM (" & _
         rs.Source & ") WHERE " & strSelect & " ORDER BY tblDoc.DSortOrder;"

rs.Open strSQL, cn, adOpenDynamic, adLockOptimistic


если условия предыдущего набора записей слишком длинные, то вот что получается в строке:
"SELECT * FROM (SELECT DISTINCTROW tblDoc.DCode, tblDoc.DName, tblDoc.ISID, tblDoc.DChoose, tblDoc.DPage FROM tblDoc INNER JOIN tblRefer ON tblDoc.DCode = tblRefer.DCode WHERE ((tblDoc.DCode) LIKE '%условие%') ORDER BY tblDoc.DSortOrder;) WHERE ((tblDc"

то есть полная строка обрезается где то на 252 символе и с конце приклеивается еще какойто символ (всегда разный - в данном случае - с)

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

Сообщение alibek » 16.02.2005 (Ср) 11:47

Перед rs.Open добавь Debug.Print strSelect и посмотри, чему равна эта строка. Если обрезана она, значит проблемы в декларациях. Если строка не обрезана, значит это ограничение Access, используй сохраненные подзапросы.
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 11:52

строка обрезается еще до rs.Open, т.е. во время конкатенации.
переменная декларируется обычно
dim strSelect as String

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 12:10

Лексей писал(а):Ну например вот формирование строки, которая должна использоваться в открытии набора записей:
strSelect = "SELECT * FROM (" & _
rs.Source & ") WHERE " & strSelect & " ORDER BY tblDoc.DSortOrder;"



см. выделенные места

так запросы не пишут :wink:
//<-
Mit freundlichen Grüßen
//->

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 12:23

Вопрос не об этом.
И чем выделенное не нравится?

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

Сообщение alibek » 16.02.2005 (Ср) 12:31

codemaster, и правда, я как-то не посмотрел :)
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 12:35

В чем ошибка то?Я идиот! Убейте меня, кто-нибудь!???

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 16.02.2005 (Ср) 13:04

Я, кстати, тоже никакого криминала в коде не вижу. Ну крутит человек вложенные запросы...
Чего нашли-то, поделитесь с общественностью. :|

2Лексей - а у тебя этот код в цикле исполняется? Ты нигде recordset в Nothing не выставляешь? И можешь описать вкратце, в чем задача состоит? И покажи процедуру целиком. Где у тебя, допустим, strSelect инициализируется?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 13:41

Sedge писал(а):Я, кстати, тоже никакого криминала в коде не вижу. Ну крутит человек вложенные запросы...
Чего нашли-то, поделитесь с общественностью. :|


1. что есть изначально strSelect ?
2. rs.Source - Variant со всеми последствиями неговоря уже.....
3. "результат " выпонения кода ....

и т.д. и т.п.


Вообще за подобные "запросы" надо брать логарифмическую линейку и бить писавшего по пальцам.
//<-
Mit freundlichen Grüßen
//->

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 16.02.2005 (Ср) 14:13

да не будет хавать аксес больше 255 символов
Точка.

А запрос им не нравиться, если юзер принимает участие в выборке, можешь встрять. Если нет - забей.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 16.02.2005 (Ср) 14:41

codemaster писал(а):2. rs.Source - Variant со всеми последствиями неговоря уже.....

Неа. Source возвращает String.
http://msdn.microsoft.com/library/defau ... source.asp

codemaster писал(а):Вообще за подобные "запросы" надо брать логарифмическую линейку и бить писавшего по пальцам.

Может, прежде чем "линейкой по рукам", имеет смысл выяснить а) в чем состоит задача, б) можно ли предложить лучшее решение?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 15:00

Sedge писал(а):
codemaster писал(а):2. rs.Source - Variant со всеми последствиями неговоря уже.....

Неа. Source возвращает String.
http://msdn.microsoft.com/library/defau ... source.asp


это старый баян :wink:
посмотри в Object Browser ADODB -> Recordset -> Source ( Lib 2.7)
потом тщательнее прочитай (переведи) статью MSDN
//<-
Mit freundlichen Grüßen
//->

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 15:23

Задача состоит в следующем:

есть список отображающий некоторый набор записей, который заполняется на основе рекордсета ADO, источник которого - строка SQL запроса со всякими условиями (все работает).
должен выполняться поиск (в смысле отображение записей удовлетворяющих заланным новым условиям, а не переход от записи к записи удовлетворяющим этим самым условиям) из этих записей.

Для этого я строю запрос на основе предыдущей строки запроса и добавляю к нему новые условия.

Все работает нормально, если строка запроса не превышает 252 символов и дело тут вроде не в способе открытия рекордсета, не в аце (кстати, он прекрасно хавает запросы, если он создан в его конструкторе) а в том, что В STRING НЕ ВЛАЗИТ СТРОКА ДЛИННЕЕ 252 СИМВОЛОВ.

Изначально strSelect - построенные для строки запроса условия.
Sourse прекрасно присваевается переменной типа String.

А за что линейкой мне - так и не понял (ну разве, что очень сложный запрос, но время на его обработку тратиться в рамказх разумного)

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 15:26

Может подскажите другие пути реализации данной задачи???

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 15:44

мда.

как вариант Recordset.Filter смотреть не пробывал?

http://msdn.microsoft.com/library/defau ... filter.asp
//<-
Mit freundlichen Grüßen
//->

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 16:02

как понимать МДА?

Дак сколько же символов влазит в String?

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

Сообщение GSerg » 16.02.2005 (Ср) 16:48

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

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 17:15

Лексей писал(а):как понимать МДА?


OK!

Сколько символов влазит см. выше

Итак исходя из задачи

ты формируеш запрос исходя из "всяких" условий
и наверное выводиш результат пользователю в таблицу.

Затем требуется наложить фильтр на этот запрос и обновить таблицу
пользователя?
//<-
Mit freundlichen Grüßen
//->

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 17:51

Данные выводятся не в таблице, а в ListView, более того набор записей, на основе которого был построен список постоянно открыт и в дальнейшем используется для модификации данных в записяз (изменение, удаление и т.п.)

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 16.02.2005 (Ср) 20:22

Почему у меня же больше 252 символов не влазит - пробовал даже просто две длинные строчки объединитьт - обрезает гад и все!

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.02.2005 (Ср) 21:26

Лексей писал(а):Данные выводятся не в таблице, а в ListView, более того набор записей, на основе которого был построен список постоянно открыт и в дальнейшем используется для модификации данных в записяз (изменение, удаление и т.п.)


тут это не в количестве символов дело !
тут в консерватории поправить надо.

и совсем не к чему держать постоянно открытым recordset

Попробуй поменяй дизайн программы.
//<-
Mit freundlichen Grüßen
//->

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 16.02.2005 (Ср) 22:48

codemaster писал(а):это старый баян :wink:
посмотри в Object Browser ADODB -> Recordset -> Source ( Lib 2.7)
потом тщательнее прочитай (переведи) статью MSDN

Ну не знаю насчет баяна... Может кому он и известен, но я привык доверять своим глазам.
MSDN писал(а):...Sets a String value or Command object reference; returns only a String value that indicates the source of the Recordset....

и далее

...However, reading the Source property does not return a Command object; instead, it returns the CommandText property of the Command object to which you set the Source property...

Как это можно по-другому перевести?
То что это свойство может иметь тип Variant я не спорю. Но возвращает оно всегда String, а следовательно его (свойства) использование в операции конкатенации является вполне правомерным.
В догонку:
Пример от MS писал(а):http://msdn.microsoft.com/library/defau ... ourcex.asp
MsgBox "rstTitles source: " & vbCr & _
rstTitles.Source & vbCr & vbCr & _
"rstPublishers source: " & vbCr & _
rstPublishers.Source & vbCr & vbCr & _
"rstPublishersDirect source: " & vbCr & _
rstPublishersDirect.Source & vbCr & vbCr & _
"rstTitlesPublishers source: " & vbCr & _
rstTitlesPublishers.Source

Или авторов MSDN тоже по рукам надо? ;)

2Лексей - для того что тебе нужно, такая конструкция действительно очень мало подходит. Думаю, что твою выборку из вложенных подзапросов прекрасно можно заменить манипуляцией с условиями клаузы WHERE, или, как советует codemaster, накладывая ограничения на уже сформированный Recordset с помощью свойства Filter....
И выложи полный текст процедуры. Если у тебя строка режется до обращения к Access'у, то это уже косяк в коде.

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 17.02.2005 (Чт) 2:41

Лексей писал(а):Почему у меня же больше 252 символов не влазит - пробовал даже просто две длинные строчки объединитьт - обрезает гад и все!


:shock: :shock: :shock:
В смысле, даже не касаясь запросов? А ты чем проверяешь?
Попробуй вот такой код, что выдает?
Код: Выделить всё
Private Sub Command1_Click()
    A = String(200, "A")
    b = String(200, "B")
    SSS = A & b
    MsgBox Len(SSS)
End Sub

А то проверять можно чем угодно, вот MSGBOX у меня урезает все, что после 1203 символа. :roll:
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение GSerg » 17.02.2005 (Чт) 7:04

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

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 17.02.2005 (Чт) 8:05

УРА!!!!!!!!!!!!!!!!!!!! Все работает!!!!!

Ошибка была вот в чем - при конкатенации строк предыдущий запрос вставлялся целиком (вместе с ; на конце, посмотрел с утреца на свежую голову, убрал - все в порядке!

Source - возвращает ПО УМОЛЧАНИЮ STRING!
Построенные запрос работает прекрасно, а на счет длины строки стормозил (извините, если можно) - при ошибке взял получившуюся строку из окна наблюдения (там же она обрезается!) - ну тормоз, что ж сказать.

Фильтр иногда кстати работает не совсем корректно, а на постоянно открытом запросе экономится время - что кретично в данном случае.

А на счет дизайна проги, так я думаю прогу надо писать под необходимый дизайн, а не дизайн перестраивать под наработанные коды!


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 6

    TopList