2011-10-19 146 views
0

我正在使用Visual Studo 2010,Win7,C++和Microsoft Access 2010 al 32位。我正在使用Direct ODBC进行连接。第一个SELECT语句执行。 INSERT,SELECT,SELECT和UPDATE未执行。我不认为这是SQL语句的语法。任何帮助表示赞赏。谢谢。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); 
} 
} 

回答

3

的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'; 
+0

谢谢克里斯。我尝试了所有这些,但仍然没有去。 INSERT语句仍然没有插入,等等。 –

+0

@ ME-dia:我知道MS Access,但不是C++。也许在你的代码中有更多的问题(除了查询之外),但我找不到他们。我有一个想法,虽然:因为你使用Visual Studio,你有解决方案与“复制到输出文件夹”链接的数据库?如果是,您是否正在查找正确的数据库以查找插入的记录? –

+0

INSERT正在工作。接下来是Total Query。这是我得到的。答案应该是三个。第一个返回100,第二个-1和第三个100. // SQLCHAR * query3 =(SQLCHAR *)“SELECT COUNT(*)FROM tblDownloads WHERE tblDownloads。[DownloadIP] ='173.201.216.2'AND tblDownloads。[DownloadCount ] = 1;“; \t // SQLCHAR * query3 =(SQLCHAR *)“SELECT COUNT(*)tblDownloads。[DownloadCount] WHERE tblDownloads。[DownloadIP] ='173.201.216.2';”; \t // SQLCHAR * query3 =(SQLCHAR *)“SELECT tblDownloads。[DownloadCount] FROM tblDownloads WHERE tblDownloads。[DownloadIP] ='173.201.216.2';”; –