Использование переменной в запросе MS Access в программе на C - PullRequest
0 голосов
/ 12 июля 2011

Я пишу небольшое приложение C (.c file), которое подключается к клиенту OPC-сервера, а затем выводит данные в базу данных MS Access.

Мне нужно, чтобы запрос работал при использовании переменной,Мой запрос:

"INSERT INTO Data ( [Date / Time], [Hot Strip Mill rate], [Hot Strip Mill Comm Okay], [Hot Strip Mill Total] )  SELECT #variable1# AS Expr1, variable2 AS Expr2, 1 AS Expr3, variable2 AS Expr4;"; 

Переменная 1 будет значением даты и времени, а переменные 2/3 будут числами.Я планирую присвоить значения, полученные от клиента OPC, переменным 1,2,3.Я хочу / нужно, чтобы мой запрос распознавал значения, которые представляют переменные.Таким образом, действие должно идти следующим образом: код видит

 "INSERT INTO Data ( [Date / Time], [Hot Strip Mill rate], [Hot Strip Mill Comm Okay], [Hot Strip Mill Total] )  SELECT #variable1# AS Expr1, variable2 AS Expr2, 1 AS Expr3, variable2 AS Expr4;"; 

Доступ видит

"INSERT INTO Data ( [Date / Time], [Hot Strip Mill rate], [Hot Strip Mill Comm Okay], [Hot Strip Mill Total] )  SELECT #07/01/2011 04:02:01# AS Expr1, 1 AS Expr2, 14.54 AS Expr3, 64546.14 AS Expr4;"; 

Любая помощь будет оценена.Спасибо

#include <windows.h>

#include <stdio.h>

#include <sqlext.h>

#include <sstream>

/* Data Access Method used in this sample */
const char* DAM = "Direct ODBC";

/* Connection string for Direct ODBC */
char szDSN[256] =     "Dsn=Gas_meter_check";

main()
{
HENV    hEnv;
HDBC    hDbc;

/* ODBC API return status */
RETCODE rc;
char date[256]= "2/1/1900 23:35:45";
double var2=46;
double var3=168736;
int     iConnStrLength2Ptr;
char    szConnStrOut[256];
int i= 0;

unsigned char* InsertQuery = "INSERT INTO Data ( [Date / Time], [Hot Strip Mill rate], [Hot Strip Mill Comm Okay], [Hot Strip Mill Total] ) SELECT #***date***# AS Expr1, ***var2*** AS Expr2, ***var3*** AS Expr3, 345464 AS Expr4;";

SQLCHAR         chval1[128], chval2[128], colName[128];
int             ret1;
int             ret2;

/* Number of rows and columns in result set */
SQLINTEGER      rowCount = 0;
SQLSMALLINT     fieldCount = 0, currentField = 0;
HSTMT           hStmt;

/* Allocate an environment handle */
rc = SQLAllocEnv(&hEnv);
/* Allocate a connection handle */
rc = SQLAllocConnect(hEnv, &hDbc);

/* Connect to the TakeCharge database */
rc = SQLDriverConnect(hDbc, NULL, (unsigned char*)szDSN, 
    SQL_NTS, (unsigned char*)szConnStrOut, 
    255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCEEDED(rc)) 
{
    printf("%s: Successfully connected to database. Data source name: \n  %s\n", 
       DAM, szConnStrOut);

    /* Prepare SQL query */
    printf("%s: SQL InsertQuery:\n  %s\n", DAM, InsertQuery);

    rc = SQLAllocStmt(hDbc,&hStmt);
    rc = SQLPrepare(hStmt, InsertQuery, SQL_NTS);

    /* Excecute the query and create a record set */
    rc = SQLExecute(hStmt); 
    if (SQL_SUCCEEDED(rc)) 
    {
       printf("Executing query...");
       printf("\n");
        }

        while (SQL_SUCCEEDED(rc)) 
        {
            printf(" insert passed\n");
            rc = SQLFetch(hStmt);
            rowCount++;
        };         
    }
else
{
    printf("%s: Couldn't connect to %s.\n", DAM, szDSN);
}

/* Disconnect*/
SQLDisconnect(hDbc);


printf("%s: Cleanup. Done.\n", DAM);
}

1 Ответ

1 голос
/ 12 июля 2011

Для обработки значений переменных в операторах используйте параметры оператора . Вы связываете значение с параметр, использующий SQLBindParameter. Заметьте, что параметры не допускаются в списке SELECT, поэтому вам нужно работать с INSERT ... VALUES. Для начала попробуйте:

unsigned char* InsertQuery = "INSERT INTO Data ( [Date / Time], [Hot Strip Mill rate], [Hot Strip Mill Comm Okay], [Hot Strip Mill Total] ) VALUES (?, ?, ?, 345464);";
...
    rc = SQLPrepare(hStmt, InsertQuery, SQL_NTS);

    SQLSMALLINT sqlType, decDigits, nullable;
    SQLULEN paramSize;

    SQLDescribeParam(hStmt, 1, &sqlType, &paramSize, &decDigits, &nullable);
    SQLBindParameter(hStmt, 1, 
                     SQL_PARAM_INPUT, SQL_C_CHAR, sqlType,
                     0 /* ignored for timestamps */, decDigits,
                     (SQLPOINTER)&date, strlen(date), NULL);

    SQLDescribeParam(hStmt, 2, &sqlType, &paramSize, &decDigits, &nullable);
    SQLBindParameter(hStmt, 2, 
                     SQL_PARAM_INPUT, SQL_C_DOUBLE, sqlType,
                     paramSize, decDigits,
                     (SQLPOINTER)&rate, 0 /* ignored */, NULL);

    SQLDescribeParam(hStmt, 3, &sqlType, &paramSize, &decDigits, &nullable);
    SQLBindParameter(hStmt, 3, 
                     SQL_PARAM_INPUT, SQL_C_DOUBLE, sqlType,
                     paramSize, decDigits,
                     (SQLPOINTER)&commOkay, 0 /* ignored */, NULL);

    rc = SQLExecute(hStmt);

Как и в примере кода, я не беспокоился об обработке ошибок.

...