使用ODBC连接SQL Server数据库进行增删查改操作全过程

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sql.h>
#include <sqlext.h>
#include <iostream>
#include <odbcinst.h>
using namespace std;

char hosts[] = {"192.168.100.54"};
#define isSuc(result) ((result) == SQL_SUCCESS || (result) == SQL_SUCCESS_WITH_INFO)

int main(void)
{
	short sret; //返回代码
	HENV henv;  //环境句柄
	HDBC hdbc;  //连接句柄
	HSTMT hstmt;//sql语句执行句柄,相当于游标

	//动态创建系统DSN数据源,需要包含odbcinst.h,SQL Server不需要添加用户名密码
	//在使用某个数据库的ODBC管理器之前,首先要查看是否安装了这个数据库的ODBC驱动,如果没有先安装再使用,比如DB2就没有默认安装
    //SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=trantest\0 UID=sa\0 PWD=123456\0 SERVER=192.168.100.54\0 DATABASE=warehouse\0");
	bool sucess = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=trantest\0 SERVER=192.168.100.54\0 DATABASE=warehouse\0");
	if (sucess)
		printf("DSN created sucessfully!!\n");
	else
		exit(0);

	/** 申请环境句柄**/
	sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
	if(!isSuc(sret))
	{
		printf("申请环境句柄出错\n");
		SQLFreeHandle(SQL_HANDLE_ENV, henv);
	}
	/** 设置环境属性,注册ODBC版本**/
	sret = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
	if(!isSuc(sret))
	{
		printf("注册ODBC版本出错\n");
	}

	/** 申请连接句柄**/
	sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
	if(!isSuc(sret))
	{
		printf("申请连接句柄出错\n");
		SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	}

	/** 设置连接属性,此处设置为手动提交**/
	sret = SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)SQL_AUTOCOMMIT_OFF,SQL_IS_POINTER);
	if(!isSuc(sret))printf("设置连接属性出错\n");

	/** 连接数据源,这里的数据源使用的是动态创建的数据源**/
	sret = SQLConnect(hdbc,(SQLCHAR *)"trantest",SQL_NTS,(SQLCHAR *)"sa",SQL_NTS,(SQLCHAR *)"123456",SQL_NTS); 
	if(!isSuc(sret))printf("连接%s出错\n", hosts);
	else printf("连接%s成功\n", hosts);

	/** 申请执行语句句柄**/
	sret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
	if(!isSuc(sret))
	{
		printf("申请执行语句句柄时出错\n");
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
	}

	//记录更新语句影响的行数
	SQLINTEGER row_count;
	SQLExecDirect(hstmt,(SQLCHAR*)"insert into odbctest values(100,'name','2011-11-30')",SQL_NTS);
	//执行sql语句后影响的行数,select查询语句返回-1
	SQLRowCount(hstmt,&row_count);
	printf("affcted count is: %d\n",row_count);

	SQLExecDirect(hstmt,(SQLCHAR*)"insert into odbctest values(200,'name','2011-11-30')",SQL_NTS);
	SQLRowCount(hstmt,&row_count);
	printf("affcted count is: %d\n",row_count);

	SQLExecDirect(hstmt,(SQLCHAR*)"delete from odbctest where a=200",SQL_NTS);
	SQLRowCount(hstmt,&row_count);
	printf("affcted count is: %d\n",row_count);

	//对更新类的sql执行后进行提交或者回滚
	sret = SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
	//sret = SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_ROLLBACK);
	if (sret != SQL_SUCCESS)
		printf("服务器%s执行查询出错\n", hosts);
	else
		printf("服务器%s执行查询成功\n", hosts);


	SQLExecDirect(hstmt,(SQLCHAR*)"select * from odbctest",SQL_NTS);
	int set_num = 0;
	SQLINTEGER ID;
	SQLSMALLINT col_num;
	SQLCHAR szId[50],szName[50],szTime[50];
	SQLINTEGER cbID,cbName,cbTime;
	
	//得到结果集中列数
	SQLNumResultCols(hstmt,&col_num);
	printf("column number is: %d\n",col_num);

	//要遍历所有的结果集可以利用下面的方法:
	while(SQL_NO_DATA != SQLFetch(hstmt)) //移动光标,一直到集合末尾
	{
		//得到光标处某列的值
		SQLGetData(hstmt,1,SQL_C_ULONG,&ID,0,&cbID);
		SQLGetData(hstmt,2,SQL_C_CHAR,szName,50,&cbName);
		SQLGetData(hstmt,3,SQL_C_CHAR,szTime,50,&cbTime);
		//有与ODBC没有MoveNext和MoveLast API所以这样获取数据集行数
		set_num++;
		printf("%d, %s, %s\n",ID,szName,szTime);

	}
	printf("the numbers of set is: %d\n",set_num);

	/** 释放各个句柄,注意顺序,不要改变**/
	SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
	SQLDisconnect(hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
	return 0;
}

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个 C++ 连接 SQL Server 数据库实现增删查改的示例代码: ```cpp #include <iostream> #include <windows.h> #include <sqltypes.h> #include <sql.h> #include <sqlext.h> using namespace std; // 定义 SQL Server 连接信息 #define SQL_SERVER "SERVER_NAME" #define SQL_DATABASE "DATABASE_NAME" #define SQL_USERNAME "USERNAME" #define SQL_PASSWORD "PASSWORD" // 定义 SQL 语句 #define SQL_SELECT "SELECT * FROM table_name" #define SQL_INSERT "INSERT INTO table_name (id, name, age) VALUES ('1', 'Tom', '20')" #define SQL_UPDATE "UPDATE table_name SET age = '21' WHERE id = '1'" #define SQL_DELETE "DELETE FROM table_name WHERE id = '1'" // 执行 SQL 语句并输出结果 void executeSQL(SQLHANDLE& hstmt, const char* sql) { SQLCHAR result[255]; SQLINTEGER num; SQLRETURN retcode; // 执行 SQL 语句 retcode = SQLExecDirect(hstmt, (SQLCHAR*)sql, SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { // 获取结果 while (SQLFetch(hstmt) == SQL_SUCCESS) { SQLGetData(hstmt, 1, SQL_C_CHAR, result, 255, &num); cout << result << endl; } } else { // 输出错误信息 SQLCHAR error[255]; SQLINTEGER errorNum; SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, error, &errorNum, error, 255, &num); cout << error << endl; } } int main() { // 定义 SQL Server 连接句柄 SQLHANDLE henv, hdbc, hstmt; // 初始化环境句柄 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // 初始化数据库连接句柄 SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); SQLConnect(hdbc, (SQLCHAR*)SQL_SERVER, SQL_NTS, (SQLCHAR*)SQL_USERNAME, SQL_NTS, (SQLCHAR*)SQL_PASSWORD, SQL_NTS); // 初始化语句句柄 SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); // 执行 SQL 语句 executeSQL(hstmt, SQL_SELECT); executeSQL(hstmt, SQL_INSERT); executeSQL(hstmt, SQL_UPDATE); executeSQL(hstmt, SQL_DELETE); // 释放句柄 SQLFreeHandle(SQL_HANDLE_STMT, hstmt); SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0; } ``` 该代码使用 Windows API 的 ODBC 接口连接 SQL Server 数据库,并执行 SQL 语句实现增删查改操作。您需要根据实际情况修改 SQL Server 连接信息和 SQL 语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值