SQL-операторы не выполняются - PullRequest
0 голосов
/ 20 октября 2011

Я использую Visual Studo 2010, Win7, C ++ и Microsoft Access 2010 и все 32-разрядные. Я соединяюсь с Direct ODBC. Первый оператор SELECT выполняется. INSERT, SELECT, SELECT и UPDATE не выполняются. Я не думаю, что это синтаксис оператора SQL. Любая помощь приветствуется. Спасибо.

#include <windows.h>
#include <stdio.h>
#include <sqlext.h>

const char* DAM = "Direct ODBC";

SQLCHAR szDSN[256] = 
"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\FILEBLOCK\\Fileblocker.accdb;";

main()
{
    HENV    hEnv;
    HDBC    hDbc;

    SQLRETURN  rc, TOTAL, QUOTA;

    SQLSMALLINT  iConnStrLength2Ptr;
    SQLCHAR      szConnStrOut[255];

    SQLCHAR* query = (SQLCHAR*)"SELECT tblIP.[IPAddress], tblIP.[IPType], tblIP.[IPStatus], tblIP.[IPMax] FROM tblIP WHERE tblIP.[IPAddress]='173.201.216.2' AND tblIP.[IPType]=3 AND tblIP.[IPStatus]=1 AND tblIP.[IPMax]=0;";

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

/* Allocate an environment handle */
rc = SQLAllocEnv(&hEnv);

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

/* Connect to the 'Fileblocker.accdb' database */
rc = SQLDriverConnect(hDbc, NULL, szDSN,  _countof(szDSN), 
    szConnStrOut, 255, &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 */
    rc = SQLAllocStmt(hDbc,&hStmt);
    rc = SQLPrepare(hStmt, query, SQL_NTS);

    /* Execute the query and create a record set */
    rc = SQLExecute(hStmt); 

    /* Loop through the rows in the result set */
        rc = SQLFetch(hStmt);
        while (SQL_SUCCEEDED(rc)) 
        {
            rc = SQLFetch(hStmt);
            rowCount++;
        };

        printf("%s: Total Row Count: %d\n", DAM, rowCount);
        rc = SQLFreeStmt(hStmt, SQL_DROP);
        if (rowCount >= 1)
            {
            printf("PASS\n");
            SQLExecute ("INSERT INTO tblDownloads (tblDownloads.[DownloadIP] , tblDownloads.[DownloadCount]) VALUES('173.201.216.2', 1);");

            TOTAL = SQLFetch ("SELECT tblDownloads.[DownloadCount] WHERE tblDownloads.[DownloadIP] = '173.201.216.2';");
            QUOTA = SQLFetch ("SELECT tblIP.[IPQuota], WHERE tblIPID.[IPAddress] = '173.201.216.2';");

            if (TOTAL >= QUOTA)
                {
                SQLExecute ("UPDATE tblIP SET tblIP.[IPMax] WHERE tblIP.[IPAddress] = '173.201.216.2');");
                }
        else if (rowCount == 0)
            {
            printf("FAIL\n");
            rc = SQLFreeStmt(hStmt, SQL_DROP);
            }
        //system("pause");
    //}
}
else
{
    printf("%s: Couldn't connect to %s.\n", DAM, szDSN);
}

/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}
}

1 Ответ

3 голосов
/ 20 октября 2011

Это - это синтаксис SQL.
Запросы, которые не выполняются, синтаксически некорректны, все они:

Запрос 1:

INSERT INTO tblDownloads (tblDownloads.[DownloadIP] , tblDownloads.[DownloadCount]) VALUES('173.201.216.2', 1);

Список столбцов после INSERT INTO должен быть без префикса имени таблицы.
Должен выглядеть так:

INSERT INTO tblDownloads (DownloadIP, DownloadCount) VALUES('173.201.216.2', 1);

Запрос 2:

SELECT tblDownloads.[DownloadCount] WHERE tblDownloads.[DownloadIP] = '173.201.216.2';

Отсутствует FROM предложение.
Должно выглядеть следующим образом:

SELECT tblDownloads.[DownloadCount] FROM tblDownloads WHERE tblDownloads.[DownloadIP] = '173.201.216.2';

Запрос 3:

SELECT tblIP.[IPQuota], WHERE tblIPID.[IPAddress] = '173.201.216.2';

Снова, нет FROM оговорка.Кроме того, запятая слишком большая, а имя таблицы в предложении WHERE неправильное.
Должно выглядеть следующим образом:

SELECT tblIP.[IPQuota] FROM tblIP WHERE tblIP.[IPAddress] = '173.201.216.2';

Запрос 4:

UPDATE tblIP SET tblIP.[IPMax] WHERE tblIP.[IPAddress] = '173.201.216.2');

Одна закрывающая скобка на конце без открывающей скобки.
Должно выглядеть так:

UPDATE tblIP SET tblIP.[IPMax] WHERE tblIP.[IPAddress] = '173.201.216.2';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...