警告:缺少终止符

时间:2019-11-03 18:16:48

标签: c++ c-strings string-literals

我正在制作一个连接到SQL数据库的C ++程序。该查询确实很长,可能不是解决该问题的最佳方法,但这并不重要。此错误是指此代码中的第一个",恰好在SELECT之前。不确定问题的末尾是"是在函数的末尾。我假设我需要在某些地方使用一些转义字符,但我放到任何地方似乎都无济于事。

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 个答案:

答案 0 :(得分:3)

您想要一个raw string literal(在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");

答案 1 :(得分:3)

文字字符串需要在行结束之前结束。您可以通过使用预处理程序行继续来解决此问题,如

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。或使用the answer by druckermanly中提到的原始字符串文字。

在一个旁注中:您可能已经注意到,我不会用单引号引起来的“字符串”。在双引号字符串中,您不必转义单引号。