|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
В рекомендациях MSDN по использованию запросов к Microsoft SQL серверу предлагается определять переменные для параметров запроса оператором Declare с префиксом @ (пример @ActMonth) и задавать им значение оператором SET. Если я включаю в состав SQL текста эти операторы, то получаю, что при использовании в операторе SET строки или числа, все проходит ОК, а при использовании для этого описанной в С++ переменной выдается сообщение, что имя этой переменной это неизвестное имя колонки. Пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Операторы SET @Today ='2015-09-05'; и SET @ActYear = 2015; выполняются нормально, Оператор SET @ActMonth = Month; вызывает сообщение: Project rised EOLException with Message:'[Microsoft][ODBC SQL Server Driver][[SQL Server][Invalid column name 'Month'] Заменяю Month числом - все идет нормально. То же с попыткой задать SET @Today= Today; Вопрос. Как же передавать параметры отбора программным путем? Помогите, кто знает. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 18:39 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
Рекомендую изучить документацию на предмет списка ключевых слов, которые нельзя использовать как идентификаторы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 19:34 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
[quot abtat]В рекомендациях MSDN по использованию запросов к Microsoft SQL серверу предлагается определять переменные для параметров запроса оператором Declare с префиксом @ (пример @ActMonth) и задавать им значение оператором SET. сразу нет. ты понял не так. параметры запросов из C++ (и вообще с клиента) надо задавать не так, а используя подготовленные запросы и привязку параметров. prepared statement и bound parameters. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 22:40 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
вот это все Declare @Today datetime; \ DECLARE @ActYear Int; \ DECLARE @ActMonth Int; \ SET @Today ='2015-09-05'; \ SET @ActYear = 2015; \ SET @ActMonth = Month; \ не надо писать вообще. вместо этого надо писать что-то типа. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
и биндить параметры. Как -- объяснять (в данном случае) в конфе по Дельфи. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2015, 22:44 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
MasterZiv, Ваш вариант с ":" тоже не подходит. Простейший вариант SELECT TOP 200 \ UserID, \ UserName, \ ServiceStartDate as StartDate, \ ServiceEndDate as StopDate, \ GroupID \ FROM [dbo].[User] \ WHERE ([GroupID] in \ (Select [GroupID] \ from [dbo].[Group] \ where [Name] like '#%')) \ AND DateDiff(Month, ServiceStartDate, '2015-09-06') > 1) работает, а если к нему добавить до начала SQL текста char *ActDate = "2015-09-06"; или String ActDate = FormatDateTime("yyyy-mm-dd",Today); и записать в последней строке запроса DateDiff(Month, ServiceStartDate, :ActDate) то выдается ошибка: "EOLEException with message: Неправильно определен объект Parameter. Представлены несовместимые или неполные данные." Аналогичный результат получается, если в функцию DateFromParts(2015, 8, DatePart(Day, ServiceStartDate)) в запросе подставить вместо чисел переменные ActYear и ActMonth с предшествующим двоеточием, полученные в программе процедурой DecodeDate, хотя тип результатов (Word) этой процедуры также представляет собой число. Я боюсь, что во всех этих случаях получаемые в С++ и требуемые MS SQL типы данных не совместимы, хотя вводимые через ":" имена и понимаются MS SQL как параметры. К сожалению, Вашим предложением обратиться на форум Дельфи я не могу, так как после программирования в машинных кодах на "Урал2" и "М20", на Ассемблере, PL1 и Коболе на "ЕС-1040" на PC, я перешел сразу на С++, а Дельфи совсем не знаю и изучать его поздно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 13:52 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
abtatНеправильно определен объект Parameter. Представлены несовместимые или неполные данные. Связка ADO+MS SQL не в состоянии самостоятельно определить число и типы параметров в запросе. Их надо задавать вручную. Читай справку, там могут быть примеры как это делается. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 14:06 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
abtatMasterZiv, Ваш вариант с ":" тоже не подходит. ... и записать в последней строке запроса DateDiff(Month, ServiceStartDate, :ActDate) то выдается ошибка: "EOLEException with message: Неправильно определен объект Parameter. Представлены несовместимые или неполные данные." Аналогичный результат получается, если в функцию DateFromParts(2015, 8, DatePart(Day, ServiceStartDate)) в запросе подставить вместо чисел переменные ActYear и ActMonth с предшествующим двоеточием, полученные в программе процедурой DecodeDate, хотя тип результатов (Word) этой процедуры также представляет собой число. Я боюсь, что во всех этих случаях получаемые в С++ и требуемые MS SQL типы данных не совместимы, хотя вводимые через ":" имена и понимаются MS SQL как параметры. К сожалению, Вашим предложением обратиться на форум Дельфи я не могу, так как после программирования в машинных кодах на "Урал2" и "М20", на Ассемблере, PL1 и Коболе на "ЕС-1040" на PC, я перешел сразу на С++, а Дельфи совсем не знаю и изучать его поздно. Так параметры ещё определять и задавать надо. Ты книжки-то по Дельфе почитай какие-нибудь... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 14:27 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Какую справку? В Help по С++ Builder 10 в RadStudio на тему работы с MS SQL и о передаче параметров я ничего не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 15:37 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
abtatВ Help по С++ Builder 10 в RadStudio на тему работы с MS SQL и о передаче параметров я ничего не нашел. Плохо искал: http://docwiki.embarcadero.com/RADStudio/XE8/en/Using_Parameters_in_Queries Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 15:51 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
MasterZiv, Без обращения к Дельфи в старом учебнике по С++ Builder я нашел вариант с ":" и в созданном ранее в свойствах объекта TADOQuery SQL тексте заменил использованные значения года, месяца и т.д. на :параметры, которым присвоил в таблице значений параметров требуемые значения. После этого объект TADOQuery как и раньше нормально активизируется и дает правильные результаты. Запрос в теле программы с внесенными в запросе значениями также компилируется и исполняется, однако подставить вместо них переменные с нужными значениями не удается. Снова выдается сообщение "Представлены несовместимые или неполные сведения" В ObjectInspector всем параметрам запроса, созданного как свойство TADOQuery, указывается тип данных ftWideString, хотя такого типа данных в С++ Builder 10 я найти не смог. Я параметрам в программе дал тип WideString, но это, видимо, не подходит. И что же делать теперь? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 18:05 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
abtat, предоставить код программы и определения таблиц и я перенаправлю твой топик в форум по Дельфи, где тебя проконсультируют по дальнейшим действиям. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2015, 22:51 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
MasterZiv, Текст SQL запроса в ObjectInspector тестовой программы: SELECT TOP 200 UserID, UserName, ServiceStartDate as StartDate, ServiceEndDate as StopDate, DATEADD(month, -2, DateFromParts(:ActYear,:ActMonth, DATEPART(Day, ServiceStartDate))) as BegDate, DATEADD(day, -1, DATEADD(month, -1, DateFromParts(:ActYear1, :ActMonth1, Datepart(Day, ServiceStartDate)))) as EndDate, GroupID, DateDiff(Month, ServiceStartDate,:ActDate1), DateDiff(Month, ServiceEndDate,:ActDate1) FROM [dbo].[User] WHERE ([GroupID] in (Select [GroupID] from [dbo].[Group] where [Name] like '#%')) AND DateDiff(Month, ServiceStartDate,:ActDate2) > 1 AND DateDiff(Month, ServiceEndDate,:ActDate3)< 2 Функция с запросом в тестовой программе: void __fastcall TForm1::DoBtnClick(TObject *Sender) { String SQLUser; Word ActYear, ActMonth, ActDay; TDateTime Today; Today = Date(); char *ActDate1 ="2015-09-06"; DecodeDate(Today, ActYear, ActMonth, ActDay); NewYear = String(2015); NewMonth = String(9); SQLUser = String( "SELECT TOP 200 \ UserID, \ UserName, \ ServiceStartDate as StartDate, \ ServiceEndDate as StopDate, \ DATEADD(month, -2, \ DateFromParts(2015, :NewMonth, DATEPART(Day, ServiceStartDate))) as BegDate, \ DATEADD(day, -1, DATEADD(month, -1, \ DateFromParts(2015, 9, Datepart(Day, ServiceStartDate)))) as EndDate, \ GroupID \ FROM [dbo].[User] \ WHERE ([GroupID] in \ (Select [GroupID] \ from [dbo].[Group] \ where [Name] like '#%')) \ AND DateDiff(Month, ServiceStartDate,'2015-09-06') > 1 \ AND DateDiff(Month, ServiceEndDate, '2015-09-06')< 2"); UserQuery->SQL->Clear(); UserQuery->SQL->Add(SQLUser); UserQuery->Open(); } //--------------------------------------------------------------------------- Структура таблицы User в присоединенном файле. Спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2015, 11:17 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Я прочитал раздел DocWiki "Using Query-Type Datasets и в том числе предлагаемую Вами статью Supplying Parameters at RunTime. Для TADOQuery они предлагают формат SQLQuery1.Params[0].AsString := Edit1.Text; Попробовал. У меня у компонента TADOQuery описан SQL запрос с 8 параметрами, 4 - числа, 4 - даты. Первый из них ActYear имеет значение 2015. У всех параметров указан тип параметра ftWideString, тип значения - OleStr. Запрос без компиляции активизируется и дает правильные результаты с исходными параметрами, правильно отрабатывает изменения параметров в окне параметров. Пытаюсь использовать рекомендации статьи. Смущает то, что указанные типы в RadStudio C++ Builder 10 не описаны, а статья из комплекта XE8, а не 2010. При компиляции строка SQLQuery1.Params[0].AsString := Значение в модуле формы вызывает ряд ошибок: 1. Params[0] надо заменить на Parameters[0]; 2. AsString вызываает ошибку E2294 Structure required on left side of . or .*; Убираю. 3. Знак двоеточия перед = вызывает ошибку E2379 Statement missing ; Убираю. 4. Значение параметра в виде '2015' вызывает ошибку E2285 Could not find a match for 'operator TParameters::=(unsigned int)' 5. Другие варианты типа String('2015'). String("2015"), L"2015", WideString("2015") вызывают ошибки, подобные E2285 Could not find a match for 'operator TParameters::=(UnicodeString)' И как же мне поступить? Или в С++ Builder 2010 это еще не было предусмотрено ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2015, 13:23 |
|
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
|
|||
---|---|---|---|
#18+
MasterZiv, Видимо. вторично вводить текст запроса в объектном модуле это лишнее. Я использовал этот вариант раньше при работе с MySql, заменяя отдельные строки в теле запроса вместо ввода параметров. В теперешней задаче это будет слишком громоздко. Я пробую задавать значение параметров, как это было рекомендовано в статье из docwiki.embarcadero.com. Сообщения Дмитрия Сибирякова со ссылкой на соответствующую статью и результаты моей попытки применить их рекомендации есть в этой же теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2015, 13:41 |
|
|
Start [/forum/topic.php?fid=57&tid=2018879&gotonew=1]: |
0ms |
get settings: |
0ms |
get forum list: |
10ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
30ms |
get topic data: |
7ms |
get first new msg: |
1ms |
get forum data: |
1ms |
get page messages: |
18ms |
update_topic_read_status (2018879): 18.08.2015 13:41:40: |
0ms |
get tp. blocked users: |
0ms |
get online users: |
29ms |
check new: |
1ms |
others: | 87ms |
total: | 186ms |
0 / 0 |