powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
14 сообщений из 14, страница 1 из 1
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39023826
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рекомендациях 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.
void __fastcall TForm1::DoBtnClick(TObject *Sender)
{
Today = Date();
DecodeDate(Today, Year, Month, ActDay);
SQLUser = String(
"Declare @Today datetime; \
DECLARE @ActYear Int; \
DECLARE @ActMonth Int; \
SET @Today ='2015-09-05'; \
SET @ActYear = 2015; \
SET @ActMonth = Month; \
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(@ActYear, @ActMonth, Datepart(Day, ServiceStartDate)))) \
as EndDate, \
GroupID \
FROM [dbo].[User] \
WHERE ... 


Операторы 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;

Вопрос. Как же передавать параметры отбора программным путем? Помогите, кто знает.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39023844
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендую изучить документацию на предмет списка ключевых слов, которые нельзя
использовать как идентификаторы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39023901
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot abtat]В рекомендациях MSDN по использованию запросов к Microsoft SQL серверу предлагается определять переменные для параметров запроса оператором Declare с префиксом @ (пример @ActMonth) и задавать им значение оператором SET.


сразу нет.
ты понял не так.
параметры запросов из C++ (и вообще с клиента) надо задавать не так, а используя подготовленные запросы и привязку параметров.

prepared statement и bound parameters.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39023902
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот это все

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.
void __fastcall TForm1::DoBtnClick(TObject *Sender)
{
Today = Date();
DecodeDate(Today, Year, Month, ActDay);
SQLUser = String(
"
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(:ActYear, :ActMonth, Datepart(Day, ServiceStartDate)))) as EndDate, \
GroupID \
FROM [dbo].[User] \
WHERE ...



и биндить параметры.
Как -- объяснять (в данном случае) в конфе по Дельфи.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024342
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, я перешел сразу на С++, а Дельфи совсем не знаю и изучать его поздно.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024360
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abtatНеправильно определен объект Parameter. Представлены несовместимые или
неполные данные.
Связка ADO+MS SQL не в состоянии самостоятельно определить число и типы параметров в
запросе. Их надо задавать вручную. Читай справку, там могут быть примеры как это делается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024380
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, я перешел сразу на С++, а Дельфи совсем не знаю и изучать его поздно.

Так параметры ещё определять и задавать надо.
Ты книжки-то по Дельфе почитай какие-нибудь...
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024434
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Какую справку? В Help по С++ Builder 10 в RadStudio на тему работы с MS SQL и о передаче параметров я ничего не нашел.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024582
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Без обращения к Дельфи в старом учебнике по С++ Builder я нашел вариант с ":" и в созданном ранее в свойствах объекта TADOQuery SQL тексте заменил использованные значения года, месяца и т.д. на :параметры, которым присвоил в таблице значений параметров требуемые значения. После этого объект TADOQuery как и раньше нормально активизируется и дает правильные результаты. Запрос в теле программы с внесенными в запросе значениями также компилируется и исполняется, однако подставить вместо них переменные с нужными значениями не удается. Снова выдается сообщение "Представлены несовместимые или неполные сведения"
В ObjectInspector всем параметрам запроса, созданного как свойство TADOQuery, указывается тип данных ftWideString, хотя такого типа данных в С++ Builder 10 я найти не смог. Я параметрам в программе дал тип WideString, но это, видимо, не подходит.
И что же делать теперь?
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39024680
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
abtat,

предоставить код программы и определения таблиц и я перенаправлю твой топик в форум по Дельфи, где тебя проконсультируют по дальнейшим действиям.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39031414
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 в присоединенном файле.

Спасибо за помощь.
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39031546
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 это еще не было предусмотрено
...
Рейтинг: 0 / 0
КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
    #39031568
abtat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Видимо. вторично вводить текст запроса в объектном модуле это лишнее. Я использовал этот вариант раньше при работе с MySql, заменяя отдельные строки в теле запроса вместо ввода параметров. В теперешней задаче это будет слишком громоздко. Я пробую задавать значение параметров, как это было рекомендовано в статье из docwiki.embarcadero.com. Сообщения Дмитрия Сибирякова со ссылкой на соответствующую статью и результаты моей попытки применить их рекомендации есть в этой же теме.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / КАК задать программно параметры запроса на Microsoft SQL server из С++ программы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (1), Yandex Bot 9 мин.
Пользователи онлайн (11): Анонимы (8), Bing Bot, Yandex Bot 1 мин., Google Bot 8 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]