ODBC API连接数据库
这是自己第一次碰数据库。
这里以sql server2000为例,新建一张student表 有name age sex no属性,插入若干记录。
在控制面板 管理工具 选中数据源(ODBC)。点添加 选择相应的数据库 完成。命名数据源名称(重要,连接时要用)并记住,选择连接的服务器,一般为local,收工。
接下来是代码,先创建一个控制台程序
#include "stdafx.h"
#include "windows.h"
#include "sql.h"
#include "sqlext.h"
int main(int argc, char* argv[])
{
RETCODE retcode;//return value
int nRecNo = 0;
char szName[10];
char szSex[4];
SQLINTEGER szAge,szNo,iLen;//类型要和数据库中的表格数据类型一致
SQLHENV henv = SQL_NULL_HENV; //SQL环境句柄
SQLHENV hdbc = SQL_NULL_HDBC; //SQL连接句柄
SQLHENV hstmt = SQL_NULL_HSTMT; //SQL语句句柄
UCHAR szDSN[SQL_MAX_DSN_LENGTH] = "TCCDB";//DSN连接,
SDWORD sdLen;//返回字符串长度
char szSQL[]= "select * from student";
//分配ODBC环境句柄,并设置成ODBC3.0应用程序
retcode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
//分配ODBC连接句柄,并通过DSN建立连接
retcode = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
retcode = SQLConnect(hdbc,szDSN,strlen((LPCTSTR)szDSN),NULL,0,NULL,0);
if ((retcode!=SQL_SUCCESS)&&(retcode!=SQL_SUCCESS_WITH_INFO))
{
printf("没有成功连接到数据库/n");
}
else
{
printf("已经连接到数据库/n");
retcode = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if (SQL_SUCCESS == retcode)
{
retcode = SQLExecDirect(hstmt,(unsigned char*)szSQL,SQL_NTS);//执行查询SQL语句
if (SQL_SUCCESS == retcode)
{
for(retcode=SQLFetch(hstmt);retcode==SQL_SUCCESS;retcode=SQLFetch(hstmt))//获取当前纪录,并将CURSOR移到下一行
{//循环获取当前行的纪录,直到最后一行纪录完毕
nRecNo++;
SQLGetData(hstmt,1,SQL_C_CHAR,szName,10,&sdLen);
SQLGetData(hstmt,2,SQL_C_LONG,&szAge,0,&iLen);
SQLGetData(hstmt,3,SQL_C_CHAR,szSex,5,&sdLen);
SQLGetData(hstmt,4,SQL_C_LONG,&szNo,0,&iLen);
printf("姓名:%s 年龄:%d 性别:%s 学号:%d /n",szName,szAge,szSex,szNo);
}
}
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
}
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
getchar();
return 0;
}
这是自己第一次碰数据库。
这里以sql server2000为例,新建一张student表 有name age sex no属性,插入若干记录。
在控制面板 管理工具 选中数据源(ODBC)。点添加 选择相应的数据库 完成。命名数据源名称(重要,连接时要用)并记住,选择连接的服务器,一般为local,收工。
接下来是代码,先创建一个控制台程序
#include "stdafx.h"
#include "windows.h"
#include "sql.h"
#include "sqlext.h"
int main(int argc, char* argv[])
{
RETCODE retcode;//return value
int nRecNo = 0;
char szName[10];
char szSex[4];
SQLINTEGER szAge,szNo,iLen;//类型要和数据库中的表格数据类型一致
SQLHENV henv = SQL_NULL_HENV; //SQL环境句柄
SQLHENV hdbc = SQL_NULL_HDBC; //SQL连接句柄
SQLHENV hstmt = SQL_NULL_HSTMT; //SQL语句句柄
UCHAR szDSN[SQL_MAX_DSN_LENGTH] = "TCCDB";//DSN连接,
SDWORD sdLen;//返回字符串长度
char szSQL[]= "select * from student";
//分配ODBC环境句柄,并设置成ODBC3.0应用程序
retcode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
//分配ODBC连接句柄,并通过DSN建立连接
retcode = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
retcode = SQLConnect(hdbc,szDSN,strlen((LPCTSTR)szDSN),NULL,0,NULL,0);
if ((retcode!=SQL_SUCCESS)&&(retcode!=SQL_SUCCESS_WITH_INFO))
{
printf("没有成功连接到数据库/n");
}
else
{
printf("已经连接到数据库/n");
retcode = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if (SQL_SUCCESS == retcode)
{
retcode = SQLExecDirect(hstmt,(unsigned char*)szSQL,SQL_NTS);//执行查询SQL语句
if (SQL_SUCCESS == retcode)
{
for(retcode=SQLFetch(hstmt);retcode==SQL_SUCCESS;retcode=SQLFetch(hstmt))//获取当前纪录,并将CURSOR移到下一行
{//循环获取当前行的纪录,直到最后一行纪录完毕
nRecNo++;
SQLGetData(hstmt,1,SQL_C_CHAR,szName,10,&sdLen);
SQLGetData(hstmt,2,SQL_C_LONG,&szAge,0,&iLen);
SQLGetData(hstmt,3,SQL_C_CHAR,szSex,5,&sdLen);
SQLGetData(hstmt,4,SQL_C_LONG,&szNo,0,&iLen);
printf("姓名:%s 年龄:%d 性别:%s 学号:%d /n",szName,szAge,szSex,szNo);
}
}
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
}
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
getchar();
return 0;
}