配置:Win7 64, SQL SERVER 2012
语言:C语言,ODBC API
最近无事,想做点东西玩,要用到数据库,以前学过但是没有真正地的在项目中实践过,因为SQL SERVER比较简单所以直接就选择了SQL SERVER。
开始之前,先讲几个接下来要用到的几个句柄,
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retCode;
第一个SQLHENV是环境句柄,主要用于设置环境,第二个SQLHDBC为连接句柄,用于连接,第三个SQLHSTMT为语句句柄,用户数据库操作。最后一个为函数返回值。
1.接下来分配ODBC环境
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if(retCode != SQL_SUCCESS){
printf("Can not allocate env handle\n");
}
句柄分配函数 SQLAllocHandle()
SQLRETURN SQLAllocHandle(
SQLSMALLINT HandleType,
SQLHANDLE InputHandle,
SQLHANDLE * OutputHandlePtr);
第一个为句柄类型,有以下几种类型:
SQL_HANDLE_DBC
SQL_HANDLE_DBC_INFO_TOKEN
SQL_HANDLE_DESC
SQL_HANDLE_ENV
SQL_HANDLE_STMT
因为是分配环境句柄所以我们选择,SQL_HANDLE_ENV;
第二个参数为输入句柄(MSDN解释为):
[Input] The input handle in whose context the new handle is to be allocated. If HandleType is SQL_HANDLE_ENV, this is SQL_NULL_HANDLE. If HandleType is SQL_HANDLE_DBC, this must be an environment handle, and if it is SQL_HANDLE_STMT or SQL_HANDLE_DESC, it must be a connection handle.
意思是如果是分配环境句柄,第二个参数必须为SQL_NULL_HANDLE,如果分配连接句柄,必须为环境句柄,如果第一个参数为SQL_HANDLE_STMT或者SQL_HANDLE_DESC,则必须为连接句柄。
第三个参数为分配句柄的指针。
2.设置环境
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3, 0);
if(retCode != SQL_SUCCESS){
printf("Cannot set ODBC version\n");
}
这里主要设置版本号。
3.分配连句柄
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if(retCode != SQL_SUCCESS){
printf("Cannot allocate connect handle\n");
}
分配句柄前面已经讲过,这里就略过了。
4.连接数据库
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
retCode = SQLConnect(hdbc, (SQLCHAR*)"test", SQL_NTS,
(SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"holyshit", SQL_NTS );
第一行设置连接属性,可以略过,具体参考MSDN,第二行为连接,函数如下:
SQLRETURN SQLConnect(
SQLHDBC ConnectionHandle, //连接句柄
SQLCHAR * ServerName, //服务器名称//数据源::配置数据源进入管理工具->数据源(ODBC)->系统DSN->……如果系统为64位则->运行->C:\Windows\SysWOW64\odbcad32.exe步骤一样
SQLSMALLINT NameLength1, //字符长度,如果以NULL结尾为SQL_NTS,以下同理
SQLCHAR * UserName, //用户名
SQLSMALLINT NameLength2, //用户长度
SQLCHAR * Authentication, //密码
SQLSMALLINT NameLength3); //密码长度
连接之后断开连接:SQLDisconnect(hdbc);
依次释放句柄:SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
先写到这儿,全部写完就太多了