在查询中使用变量的C中SQL语句 我正在构建一个C++程序,它访问SQL数据库。我能够连接并返回以下状态的值: retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT Beta FROM Equity WHERE Ticker = 'AAPL'", SQL_NTS);

在查询中使用变量的C中SQL语句 我正在构建一个C++程序,它访问SQL数据库。我能够连接并返回以下状态的值: retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT Beta FROM Equity WHERE Ticker = 'AAPL'", SQL_NTS);,c++,sql,visual-studio,visual-c++,C++,Sql,Visual Studio,Visual C++,但是,我希望能够用字符串'ticker'替换'AAPL',该字符串可以使用cin>>定义 有没有办法做到这一点 感谢您的帮助,整个代码如下: #include "stdafx.h" #include <iostream> #include <windows.h> #include <sql.h> #include <sqltypes.h> #include <sqlext.h> #include <string> usin

但是,我希望能够用字符串'ticker'替换'AAPL',该字符串可以使用cin>>定义

有没有办法做到这一点

感谢您的帮助,整个代码如下:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h>
#include <string>

using namespace std;

int main(){
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;

    SQLWCHAR OutConnStr[255];
    SQLSMALLINT OutConnStrLen;

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 

             // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                retcode = SQLDriverConnect(
                    hdbc, 
                    0,
                    (SQLWCHAR*)L"DSN=Phoenix;SERVER=XXX;UID=XXX;PWD=XXX;DRIVER=MySQL Server;", 
                    _countof(L"DSN=Phoenix;SERVER=XXX;UID=XXX;PWD=XXX;DRIVER=MySQL Server;"),
                    OutConnStr,
                    255, 
                    &OutConnStrLen,
                    SQL_DRIVER_COMPLETE );

                // Allocate statement handle
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 

                    // Process data
                    string  ticker;
                    cout << " Enter Ticker:     "; //Prompt Ticker
                    cin >> ticker;      //Stores Ticker
                    //retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT Beta FROM Equity WHERE Ticker = 'AAPL'", SQL_NTS);
                    retcode = SQLExecDirect(hstmt, (SQLWCHAR*)L"SELECT Beta FROM Equity WHERE Ticker = ticker", SQL_NTS);

                    if (retcode == SQL_SUCCESS) {
                        SQLINTEGER cbTestStr, iCount = 1;
                        SQLFLOAT dTestFloat;
                        SQLCHAR beta[200];
                        while (TRUE) {
                            retcode = SQLFetch(hstmt);
                            if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
                                cout<<"An error occurred";
                            }
                            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){

                                SQLGetData(hstmt, 1, SQL_C_CHAR, beta, 200, &cbTestStr);

                                /* Print the row of data */
                                cout<<"Beta for "<< ticker << " = " << beta <<endl;
                                double bi;
                                cin >> bi;


                            } else {
                                break;
                            }
                        }
                    }else{
                        cout<<"Query execution error."<<endl;
                    }

                    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    SQLDisconnect(hdbc);
                }else{ 
                    cout<<"Connection error"<<endl;
                }
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }

        system("pause");
    return 0;
}

你有没有试过在你的cin>>自动售票机之后;线路

string sql;
sql = "SELECT Beta FROM Equity WHERE Ticker='";
strcat (sql,ticker);
strcat (sql, "'");
然后在SQLExecDirect行中使用sql字符串 用sql替换语句文本

对不起,我的c语法生锈了。关键是检索ticker值并将其连接到sql字符串,同时用单引号将输入ticker括起来。然后将其用作执行语句


希望它能起作用。

不,不,不。使用参数化查询,如果它们来自您的源代码库之外,例如,如果它们是用户输入的,则永远不要内联文本。Donnie说得好。我的建议容易受到sql注入攻击。