Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Вниз

TQuery и или ключу или лыжи не едут   Найти похожие ветки 

 
testpu   (2002-07-25 10:27) [0]

Программировал на C#, нарадоваться не мог, только проги сильно тяжелые получаются и на P-100 тормозят жутко.
Решил перейти на CBuilder, столкнулся с проблемой.
Запрос:
SELECT * FROM DTable WHERE DTable.[Id]=@Id
В C# я так и передавал @Id, а в CBuilder надо чтобы было написано
SELECT * FROM DTable WHERE DTable.[Id]=:Id
Мне что теперь все запросы переписывать?
Локальные то перепенные должны быть с "@"
DECLARE @local int SEY @local=1
SELECT * FROM DTable WHERE DTable.[Id]=:Id AND DTable.[Field]=@local
Или у VCL - левцев не принято параметры в запрос передавать.
Подскажите, пожалуйста как быть. Мож у кого компонент есть нормальный, чтоб на Transact-SQL запросы понимал.


 
kaif   (2002-07-25 13:00) [1]

Я не силен в С, но по-моему, дело в том, что параметр объекта TQuery это тоже объект, а не просто локальная переменная. А синтаксис с двоеточием вообще не С-шный, это синтаксис парсера SQL-запроса внутри компонента TQuery. Если я правильно понял вопрос...


 
testpu   (2002-07-25 13:07) [2]

Ну понятно, что это TQuery так запрограммирован. Но как другие программеры с этой проблемой борятся. Неужели в Delphi вручную запросы делают? Я в Sql analizere отлаживаю, а потом делаю Query.SQL.LoadFromFile(XXX.sql) да и все, а теперь вся моя технология на смарку.


 
SergSuper   (2002-07-25 14:41) [3]

Интересно: а как же тогда C# отличает локальные переменные от параметров запроса?


 
Lord Warlock   (2002-07-25 14:45) [4]


> testpu (25.07.02 13:07)



> Неужели в Delphi вручную запросы делают?


В основном. И параметр пишется :ID вне зависимости, dephi или Cbuilder


 
testpu   (2002-07-25 18:20) [5]

>Интересно: а как же тогда C# отличает локальные переменные от параметров запроса?

А я те, которые не локальные ремаркирую после отладки.

А еще в C# можно писать так:
string Stroka=@"
------
Сколько хочешь строк без двойных кавычек
Например весь SQL запрос
----
"; // Здесь только кавычки закрываются
А в Delphi есть что - то подобное, или надо обязательно
SQL.Add() делать?


 
evgeg   (2002-07-25 22:00) [6]

> я те, которые не локальные ремаркирую после отладки.

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



 
app   (2002-07-26 19:44) [7]

app © (26.07.02 19:33)

Господа ваша полемика о личных качествах абсолютна неуместна в данной ветке, поэтуму и удалена, если вы желаете ее продолжить, то выберите другое наиболее подходящее для вас средство, просьба не доставлять лишней работы по удалению ваших постингов, сюда будет пропущены только предложения о выборе средств для ее продолжения.

Оправдания кто первый начал и кто что сказал излишне.

комодератор



 
testpu   (2002-07-26 21:43) [8]

Ну все таки хочется объяснить. Тестируемый запрос:
USE Advertisement
-- Это все не локальные переменные
DECLARE @IdSubsection int SET @IdSubsection = 1
DECLARE @AllowSubsection bit SET @AllowSubsection = 0
DECLARE @AllowDate int SET @AllowDate = 0
DECLARE @NumberStart int SET @NumberStart = 5
DECLARE @NumberEnd int SET @NumberEnd = 7
DECLARE @DaysCount int SET @DaysCount = 5
DECLARE @MonthsCount int SET @MonthsCount = 1
DECLARE @DateStart datetime SET @DateStart = "4/01/98"
DECLARE @DateEnd datetime SET @DateEnd = "7/18/02"
DECLARE @Allowlocation bit SET @AllowLocation = 1
DECLARE @Location varchar(200) SET @Location = "223322"

-- Чтение информации об объявлении
-- А это локальная переменныя
DECLARE @Cmd varchar(8000)
SET @Cmd =
"
SELECT DISTINCT
Advertisement.*,
[SubsectionName] = Subsection.[Name],
[SectionIndex] = [Section].[Index],
[SectionName] = [Section].[Name]
FROM Advertisement
INNER JOIN Subsection ON Advertisement.IdSubsection = Subsection.[Id]
INNER JOIN [Section] ON Subsection.[IdSection] = [Section].[Id]
LEFT JOIN Location ON Location.[IdAdvertisement] = Advertisement.[Id]
LEFT JOIN Number ON Number.[IdAdvertisement] = Advertisement.[Id]
WHERE
" +
-- Если необходимо учесть раздел
CASE @AllowSubsection
WHEN 1 THEN "Advertisement.[IdSubsection] = " + CONVERT(varchar, @IdSubsection)
ELSE "1 = 1"
END
+ " AND " +
-- Если необходимо учесть раздел
CASE @AllowLocation
WHEN 1 THEN "Location.[Value] = " + CONVERT(varchar, @Location)
ELSE "1 = 1"
END
+ " AND " +
-- Если необходимо учесть даты
CASE @AllowDate
-- Интервал номеров
WHEN 1 THEN "Number.[Value] BETWEEN " + CONVERT(varchar, @NumberStart) + " AND " + CONVERT(varchar, @NumberEnd)
-- Количество дней от текущей даты
WHEN 2 THEN "Advertisement.[Date] BETWEEN DATEADD(day, -" + CONVERT(varchar, @DaysCount) +", GETDATE()) AND GETDATE()"
--
WHEN 3 THEN "Advertisement.[Date] BETWEEN DATEADD(month, -" + CONVERT(varchar, @MonthsCount) +", GETDATE()) AND GETDATE()"
WHEN 4 THEN "Advertisement.[Date] BETWEEN """ + CONVERT(varchar, @DateStart) + """ AND """ + CONVERT(varchar, @DateEnd) + """"
ELSE "1 = 1"
END +
"
ORDER BY [Date] DESC
"
EXECUTE(@Cmd)
----------------------------------------------------------------
Используемый запрос:
USE Advertisement
-- Это все не локальные переменные
/*
DECLARE @IdSubsection int SET @IdSubsection = 1
DECLARE @AllowSubsection bit SET @AllowSubsection = 0
DECLARE @AllowDate int SET @AllowDate = 0
DECLARE @NumberStart int SET @NumberStart = 5
DECLARE @NumberEnd int SET @NumberEnd = 7
DECLARE @DaysCount int SET @DaysCount = 5
DECLARE @MonthsCount int SET @MonthsCount = 1
DECLARE @DateStart datetime SET @DateStart = "4/01/98"
DECLARE @DateEnd datetime SET @DateEnd = "7/18/02"
DECLARE @Allowlocation bit SET @AllowLocation = 1
DECLARE @Location varchar(200) SET @Location = "223322"
*/
-- Чтение информации об объявлении
-- А это локальная переменныя
DECLARE @Cmd varchar(8000)
SET @Cmd =
"
SELECT DISTINCT
Advertisement.*,
[SubsectionName] = Subsection.[Name],
[SectionIndex] = [Section].[Index],
[SectionName] = [Section].[Name]
FROM Advertisement
INNER JOIN Subsection ON Advertisement.IdSubsection = Subsection.[Id]
INNER JOIN [Section] ON Subsection.[IdSection] = [Section].[Id]
LEFT JOIN Location ON Location.[IdAdvertisement] = Advertisement.[Id]
LEFT JOIN Number ON Number.[IdAdvertisement] = Advertisement.[Id]
WHERE
" +
-- Если необходимо учесть раздел
CASE @AllowSubsection
WHEN 1 THEN "Advertisement.[IdSubsection] = " + CONVERT(varchar, @IdSubsection)
ELSE "1 = 1"
END
+ " AND " +
-- Если необходимо учесть раздел
CASE @AllowLocation
WHEN 1 THEN "Location.[Value] = " + CONVERT(varchar, @Location)
ELSE "1 = 1"
END
+ " AND " +
-- Если необходимо учесть даты
CASE @AllowDate
-- Интервал номеров
WHEN 1 THEN "Number.[Value] BETWEEN " + CONVERT(varchar, @NumberStart) + " AND " + CONVERT(varchar, @NumberEnd)
-- Количество дней от текущей даты
WHEN 2 THEN "Advertisement.[Date] BETWEEN DATEADD(day, -" + CONVERT(varchar, @DaysCount) +", GETDATE()) AND GETDATE()"
--
WHEN 3 THEN "Advertisement.[Date] BETWEEN DATEADD(month, -" + CONVERT(varchar, @MonthsCount) +", GETDATE()) AND GETDATE()"
WHEN 4 THEN "Advertisement.[Date] BETWEEN """ + CONVERT(varchar, @DateStart) + """ AND """ + CONVERT(varchar, @DateEnd) + """"
ELSE "1 = 1"
END +
"
ORDER BY [Date] DESC
"
EXECUTE(@Cmd)

Как видите, легким движением руки за 1 сек. превращаем запрос из SQL Analizer в тот, который можно в проге юзать. И всего то для этого нужно, чтобы в TQuery переменные назывались не :X, а @X.
Неужели ни у кого такого компонента нет?


 
DAO   (2002-07-26 23:04) [9]

Мдя... Я лично всю бизнес-логику БД реализую в хранимых процедурах! Это очень удобное средство да будет вам известно! Тем более что MSSQL для этого даже есть очень много полезных инструментов, типа дебагера процедур, куаналайзер и т.д.
Но это мое личное мнение, его не обязательно придерживаться!


 
evgeg   (2002-07-26 23:38) [10]

Почему вы просто не сделаете замену @ на :?
Search\Replace


 
KSergey   (2002-07-27 11:16) [11]

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

По сути хотелось бы поддержать реплику evgeg © (26.07.02 23:38), которая и напрашивается вроде сама-собой после LoadFromFile, если уж так необходимо именно из файла. Вот только хорошо ли это с точки зрения скорости? Хотя если нужна гибкость без перекомпиляции - может и так хорошо.
Я вообще делаю так: отлаживаю запрос в QAnalizer, после чего copy/paste в необходимый TQuery. Хотя это только мое мнение.


 
ppcat   (2002-07-29 08:49) [12]

Послушай, testpu. Твоя проблема решается легко, а про Builder я вот что скажу - приехав в Англию будь добр говори по английски, так тебя лучше поймут.

Вместо Query.SQL.Add(...) можно написать Query.SQL.Text:= "...";
одной строкой получается. А если тебе все "@" на ":" заменить пришлось, StringReplace (в хелпе есть) тебе поможет. Вообще, в Борланде интересного и удобного не меньше, чем в Майкрософт, а может и поболее



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
1-60703
vuk
2002-08-06 17:36
2002.08.19
Delphi7


3-60534
DieHard
2002-07-30 14:34
2002.08.19
Приоритет запроса


1-60681
ilg
2002-08-06 02:23
2002.08.19
Запуск в свернутом виде


3-60518
Ярослав
2002-07-30 10:11
2002.08.19
db-vista


1-60741
Rasa
2002-08-06 02:59
2002.08.19
Полупрозрачность...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский