предупреждение: отсутствует завершающий символ - PullRequest
1 голос
/ 03 ноября 2019

Я делаю программу на C ++, которая подключается к базе данных SQL. Этот запрос действительно длинный и, вероятно, не лучший способ его выполнить, но это не главное. Эта ошибка относится к первому " в этом коде, прямо перед SELECT. Не уверен, что проблема в том, что окончание " находится в конце функции. Я предполагаю, что мне нужно где-нибудь использовать escape-символы, но нигде, когда я их помещаю, похоже, ничего не происходит.

res = stmt->executeQuery("SELECT customers.customerNumber, customers.customerName, customers.phone, customers.creditLimit, orders.orderNumber, orders.orderDate, orders.status, products.productName, orderdetails.quantityOrdered, orde
rdetails.priceEach, employees.firstName, employees.lastName, employees.email
AS returnedInfo
FROM customers
JOIN orders ON customers.customerNumber=orders.customerNumber
JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber
JOIN products ON orderdetails.productCode = products.productCode
JOIN employees ON customers.salesRepEmployeeNumber = employees.employeeNumber
WHERE customers.customerNumber = \'103\';");

Ответы [ 2 ]

3 голосов
/ 03 ноября 2019

Буквальные строки должны заканчиваться до окончания строки. Вы можете обойти эту проблему с помощью продолжения строки препроцессора, как в

res = stmt->executeQuery("SELECT customers.customerNumber, customers.customerName, customers.phone, customers.creditLimit, orders.orderNumber, orders.orderDate, orders.status, products.productName, \orderdetails.quantityOrdered, orderdetails.priceEach, employees.firstName, employees.lastName, employees.email \
AS returnedInfo \
FROM customers \
JOIN orders ON customers.customerNumber=orders.customerNumber \
JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber \
JOIN products ON orderdetails.productCode = products.productCode \
JOIN employees ON customers.salesRepEmployeeNumber = employees.employeeNumber \
WHERE customers.customerNumber = '103';");

При использовании конкатенации строк-литералов компиляторов, где она объединяет смежные строковые литералы:

res = stmt->executeQuery("SELECT customers.customerNumber, customers.customerName, customers.phone, customers.creditLimit, orders.orderNumber, orders.orderDate, orders.status, products.productName, orderdetails.quantityOrdered, orderdetails.priceEach, employees.firstName, employees.lastName, employees.email "
"AS returnedInfo "
"FROM customers "
"JOIN orders ON customers.customerNumber=orders.customerNumber "
"JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber "
"JOIN products ON orderdetails.productCode = products.productCode "
"JOIN employees ON customers.salesRepEmployeeNumber = employees.employeeNumber "
"WHERE customers.customerNumber = '103';");

Обратите внимание, чтооба они создадут то, что на самом деле представляет собой одну линию. Если вы хотите передать его функции в виде нескольких строк, вам нужно добавить новую строку \n в конце каждой «строки» самостоятельно. Или используйте необработанные строковые литералы, как упомянуто в ответе druckermanly .

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

3 голосов
/ 03 ноября 2019

Требуется необработанный строковый литерал (введен в C ++ 11). Проблема в том, что по умолчанию вы не можете вставить в строку реальный символ новой строки (вместо \n), но вы можете использовать необработанные строковые литералы.

Если вы не используете C ++11 или более поздней версии, вы можете использовать другие методы (продолжения строк или конкатенированные последовательные строки), но это часто самый чистый способ представить ваше намерение, если оно доступно вам.

Вот пример использования вашего запроса:

res = stmt->executeQuery(R"SQL(
  SELECT 
    customers.customerNumber,
    customers.customerName,
    customers.phone,
    customers.creditLimit,
    orders.orderNumber,
    orders.orderDate,
    orders.status,
    products.productName,
    orderdetails.quantityOrdered,
    orderdetails.priceEach,
    employees.firstName,
    employees.lastName,
    employees.email
  AS returnedInfo
  FROM customers
    JOIN orders ON customers.customerNumber=orders.customerNumber
    JOIN orderdetails ON orders.orderNumber = orderdetails.orderNumber
    JOIN products ON orderdetails.productCode = products.productCode
    JOIN employees ON customers.salesRepEmployeeNumber = employees.employeeNumber
  WHERE customers.customerNumber = '103';
)SQL");
...