第十二章:使用C语言(Python语言)操作Sqlserver2019数据库
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二章:使用C语言(Python语言)操作Sqlserver2019数据库相关的知识,希望对你有一定的参考价值。
目录
学前必备知识
- 第一章:SQL Server 数据库环境搭建与使用
- 第二章:SQL Server2019 数据库的基本使用之图形化界面操作
- 第三章:SQL Server2019 数据库 之 开启 SQL 语言之旅
- 第四章:SQL Server2019 数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据
- 第五章:SQL Server2019 数据库 之 综合案例练习、开启 SELECT 语句之旅
- 第六章:SQL Server2019 数据库 之 SELECT 语句的深入使用
- 第七章:SQL Server2019 数据库 之 单表查询综合练习 及SELECT 语句的进阶使用
- 第八章:SQL Server2019 数据库 之分组统计(GROUP BY)
- 第九章:SQL Server2019 数据库 之简单子查询
- 第十章:SQL Server2019 数据库 之多行子查询
- 第十一章:SQL Server2019 数据库 之多表连接
每日一句:一个人要有很强烈的成功愿望,除了奋斗之外,得不停息地去思考,忍受内心的炼狱和折磨,能够从灰烬中站起来,反败为胜。In order to have a strong desire to succeed,in addition to struggle,a person has to think continuously,endure inner purgatory and torture,and be able to rise from the ashes and turn defeat into victory。——张朝阳(搜狐公司首席执行官)
本章学习目标:
- 了解 SQL Server 的配置。
- 掌握使用 ODBC 连接数据库的方法。
- 掌握使用非 ODBC 连接数据库的方法。
- 拓展学习 Python 操作 SqlServer 数据库。
一、连接数据库的准备工作
1. 概述
C 语言连接 SQL Server 数据库的方法有两种,分别为非数据源方式和 ODBC 数据源方式。
2. 配置 SQL Server 环境
(1) 开启 SQLServer 服务。
(2) 通过 SQL Server 身份验证模式连接数据库,即使用用户 sa 身份登录数据库,如下图所示:
(3) 启用 SQL Server 协议,启用的方法是找到 SQL Server 配置管理器,将 SQL Server 网络配置的两个协议中的 Named Pipes 协议和 TCP/IP 协议全部启动,如下图所示:
3. 配置 C 语言环境
使用 Visual Studio 2019 创建一个空项目,步骤如下:
(1) 在编写程序之前,首先要创建一个新程序文件,具体方法是:在 Visual Studio 2019 欢迎界面选择 文件
菜单中的 新建
中的 项目
选项,或者按快捷键 <Ctrl+Shift+N>
,如下图所示,进入新建项目文件。
(2) 在 新建项目
界面中选择要创建的项目类型。选择创建项目的示意图如下所示:
二、使用 ODBC 连接数据库
使用 ODBC 连接数据库,简单来说,就是通过一个媒介来连接数据库和程序代码。通过本节的学习,了解如何来创建 ODBC 数据源和使用 ODBC 数据源。
1. ODBC 数据源简介
ODBC 全称为 (Open DataBase Connectivity,开放数据库互连) 是 Microsoft 公司提供的有关数据库的一个组成部分,它建立一组规范并提供了数据库访问的标准 API(应用程序编程接口)。一个使用 ODBC 操作数据库的应用程序,基本操作都是由 ODBC 驱动程序完成的,不依赖于 DBMS(Database Management System,数据库管理系统)。
应用程序访问数据库时,首先要用 ODBC 管理器注册一个数据源,该数据源包括数据库位置、数据库类型和 ODBC 驱动程序等信息,管理器根据这些信息建立 ODBC 与数据库的连接。通过 ODBC 可以连接 MSSQLServer、mysql、DB2、Oracle、Access 等各种数据库,通过统一的函数进行访问(也就是访问各种数据库都可以使用统一的函数),改善了连接不同数据库的差异性。
2. 配置 ODBC 数据库源
配置 ODBC 数据源的步骤如下:
- 在 Windows 操作系统中,选择 “开始” → “控制面板” 选项,在 “查看方式” 处选择 “小图标(S)” 选项,然后单击 “管理工具” 选项,打开 “管理工具” 文件夹,如下图所示:
在 “管理工具” 文件夹中,双击 “数据源(ODBC)” 图标,打开 ODBC 数据源管理器,如图所示。
- 在 ODBC 数据源管理器中,单击“添加”按钮,打开“创建新数据源”对话框,如图所示:
- 在“创建新数据源”对话框中选择 ODBC 提供驱动程序的数据源,包括 Access 类驱动程序、dBase 类驱动程序、Excel 类驱动程序、FoxPro 类驱动程序、Visual FoxPro 类驱动程序、Paradox 类驱动程序、Text 类驱动程序、Oracle 类驱动程序和 SQL Server 类驱动程序。本章主要介绍创建 SQL Server 的数据源,所以在驱动程序名称菜单中,选择“SQL Server Native Client 11.0”,单击“完成”按钮,如下图所示:
- 随后打开“创建到 SQL Server的新数据源”对话框。在“名称”文本框内输入新的数据源名,例如 csql。在“描述”文本框内输入对数据源的描述,也可以为空,这里没有输入内容。在“服务器”下拉列表框中选择需要连接的服务器,笔者这里直接输入的
LAPTOP-CQGGTJJP\\AMOXIANG
。然后单击“下一步”按钮,如图所示:
- 接下来选择 SQL Server 的登录验证方式,在“创建到SQL Server的新数据源”对话框中,选择第二个单选框“使用用户输入登录ID和密码的SQL Server验证(S)”,然后输入登录ID和密码,单击“下一步”按钮,如图所示。
在“登录ID”文本框中输入“sa”。
在“密码”文本框中输入密码,这个密码是安装 SQL Server 时设置的,如果为空,则不输入。
- 打开下图所示的对话框。选中“更改默认的数据库为”复选框,同时在下拉列表框中选择需要的 SQL Server 数据库(例如选择 student),然后单击“下一步”按钮。
- 在打开的对话框中使用默认选项,单击“完成”按钮,则打开“ODBC Microsoft SQL Server安装”对话框。单击“测试数据源”按钮,如果正确,则测试成功;如果不正确,系统会指出具体的错误,用户应该重新检查配置的内容是否正确。测试成功如图所示。
- 单击“确定”按钮,新创建的数据源就会添加到如下图所示对话框中的数据源列表框中,再单击“确定”按钮,一个新的 SQL Server 数据源就创建完成了。
至此,ODBC 数据源 csql 就创建完成了,接下来就可以使用 ODBC 数据源进行数据库的连接。
3. 连接数据库函数
使用 C 语言连接数据库需要使用到一些函数,下面分别介绍。
(1) SQLAllocHandle() 函数。
该函数用来分配句柄,语法如下:
SQLRETURN SQLAllocHandle(
SQLSMALLINT HandleType,
SQLHANDLE InputHandle,
SQLHANDLE* OutputHandlePtr
);
参数说明:
-
HandleType:输入变量。该变量只能从下列四个值中选择其一:
- SQL_HANDLE_ ENV:用于申请环境句柄。
- SQL_HANDLE_DBC:用于申请连接句柄。
- SQL_HANDLE_DESC:用于申请描述符句柄。
- SQL_HANDLE_STMT:用于申请语句句柄。
-
InputHandle:该变量放入已经被分配好的前提句柄,如果第一个变量为环境句柄,则放入 SQL_NULL_HANDLE 即可;如果第一个变量为 SQL_HANDLE_DBC,则第二个变量必须为已分配的环境句柄;如果第一个变量为 SQL_HANDLE_DESC,SQL_HANDLE_STMT,则第二个变量必须为已分配好的连接句柄。
-
OutputHandlePtr:该变量为一个指针变量,用于保存申请来的句柄,申请句柄类型为第一个变量,在定义该指针的时候需要注意类型一致。返回值有四种:SQL_SUCCESS、SQL_SUCCESS_WTTH_INFO、SQL_INVALID_HANDLE、SQL_ERROR。
(2) SQLSetEnvAttr() 函数。
该函数用于设置环境属性值,语法如下:
SQLRETURN SQLSetEnvAttr(
SQLHENV EnvironmentHandle,
SQLINTEGER Attribute,
SQLPOINTER ValuePtr,
SQLINTEGER StringLength
);
参数说明:EnvironmentHandle:输入变量,需放入环境句柄。Attribute:输入变量。ValuePtr:输入变量。Attribute 和 ValuePtr 的取值如下表所示:
StringLength:输入变量如果 ValuePir 为一个整型指针,则可以被忽略。如果为二进制或字符串,那么就需要再次计算。返回值有四种:SQL_SUCCESS、SQL_SUCCESS_WTTH_INFO、SQL_INVALID_HANDLE、SQL_ERROR。
(3) 连接函数。
在分配环境和连接句柄并设置连接属性后,应用程序将连接到数据源或驱动程序。有三种可用于连接的函数:SQLConnect() 函数、SQLDriverConnect() 函数、SQLBrowseConnect() 函数
-
SQLConnect() 函数。SQLConnect() 是最简单的连接函数。它接受三个参数:数据源名称、用户ID 和密码,这三个参数包含连接到数据库所需的所有信息。若要执行此操作,生成使用的数据源的名称 SQLDataSources,提示用户输入数据源、用户ID 和密码,然后调用 SQLConnect。
-
SQLDriverConnect() 函数。SQLDriverConnect() 函数是在数据源名称、用户ID 和密码的详细信息同时都存在的情况下使用。参数之一的 SQLDriverConnect() 是一个包含特定于驱动程序信息的连接字符串。使用 SQLDriverConnect() 函数而不是 SQLConnect() 函数的原因如下:
- 在连接时指定特定于驱动程序的信息。
- 请求驱动程序提示用户输入连接信息。
- 不使用 ODBC 数据源进行连接。
SQLDriverConnect() 函数连接字符串包含一系列指定 ODBC 驱动程序支持的所有连接信息的关键字/值对。每个驱动程序都支持标准 ODBC 关键字(DSN、FILEDSN、DRIVER、UID、PWD和SAVEFILE),以及用于驱动程序支持的所有连接信息的特定于驱动程序的关键字。SQLDriverConnect() 函数可以用于不使用数据源连接。例如,应用程序,旨在使“dsn”连接到的实例 SQL Server 可以调用 SQLDriverConnect() 函数与定义的登录ID、密码、网络库和服务器名称到一个连接字符串连接和默认数据库以使用。
使用 SQLDriverConnect() 函数,用于提示用户为任何所需的连接信息的两个选项:应用程序对话框:可以创建一个应用程序对话框,提示输入连接信息,然后呼叫 SQLDriverConnect() 函数,带有 NULL 窗口句柄和 DriverCompletion 设置为 SQL_DRIVER_NOPROMPT。这些参数设置将禁止 ODBC 驱动程序打开自己的对话框。在对应用程序的用户界面进行控制时,使用此方法。驱动程序对话框:可以编写代码,应用程序传递的有效的窗口句柄 SQLDriverConnect() 函数并设置 DriverCompletionSQL_DRIVER_COMPLETE、SQL_DRIVER_PROMPT 或 SQL_DRIVER_COMPLETE_ 参数必填。驱动程序然后生成一个对话框,以便提示用户输入连接信息。此方法可以简化应用程序代码。 -
SQLBrowseConnect() 函数。SQLBrowseConnect() 函数与SQLDriverConnect() 函数类似,功能都是连接字符串。但是,通过使用 SQLBrowseConnect() 函数,应用程序可以在运行时构造完整连接字符串,以迭代方式与数据源。这允许应用程序执行以下两种操作:生成自己的对话框以提示输入此信息,因此保留对其用户界面的控制。浏览系统以找到可由特定的驱动程序使用的数据源,它需要执行若干步骤。例如,用户可能要首先浏览网络以找到服务器,然后再选择某一服务器后,浏览该服务器以找到驱动程序可访问的数据库。当 SQLBrowseConnect() 函数完成成功连接时,它返回的连接字符串,可在后续调用 SQLDriverConnect() 函数。
4. SQLExecDirect()函数
如果语句中存在任何参数,则 SQLExecDirect() 使用参数标记变量的当前值来执行可预准备语句。SQLExecDirect() 函数是提交一次执行的 SQL 语句的最快方式,语法格式如下:
SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle,
SQLCHAR *StatementText,
SQLINTEGER TextLength);
参数说明:
- StatementHandle:SQL 语句句柄。
- StatementText:要执行的 SQL 语句。
- TextLength:SQL字符串长度。
5. SQLPrepare() 函数
SQLPrepare() 是 ODBC 中的一个 API 函数,用来创建 SQL 语句,语法格式如下:
SQLRETURN SQLPrepare(
SQLHSTMT StatementHandle,
SQLCHAR * StatementText,
SQLINTEGER TextLength);
参数说明:
- StatementHandle:SQL 语句句柄。
- StatementText:要执行的 SQL 语句。
- TextLength:SQL字符串长度。
6. SQLBindCol() 函数
SQLBindCol() 函数可以实现将数据缓冲绑定到结果集的列,语法格式如下:
SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLINTEGER BufferLength,
SQLLEN * StrLen_or_Ind);
参数说明:
- StatementHandle:SQL 语句句柄。
- ColumnNumber:结果集里要绑定的列号。
- TargetType:*TargetValuePtr 所指缓冲的 C 数据类型的标识符。
- TargetValuePtr:用来绑定列的数据缓冲的指针。
- BufferLength:缓冲的字节数长度。
- StrLen_or_IndPtr:指向绑定列的长度。
7. SQLFetch() 函数
SQLFetch() 函数从结果集中提取下一行数据并返回所有绑定列的数据,语法格式如下:
SQLRETURN SQLFetch(
SQLHSTMT StatementHandle
);
参数说明:
- StatementHandle:SQL 语句句柄。
4. C 语言通过 ODBC 操作数据库
下面来讲解一个使用 ODBC 连接数据库的实例。
【实例01】:通过 C 语言代码操作数据库,向 student 数据库的 student 表中插入一条数据,代码如下。
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<odbcss.h>
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
RETCODE retcode;
UCHAR szDSN[SQL_MAX_DSN_LENGTH + 1] = "csql";
UCHAR szUID[MAXNAME] = "sa";
UCHAR szAuthStr[MAXNAME] = "sqlserver2019";
//SQL语句 学号 姓名 性别 年龄 出生日期 联系方式
//B006 刘月 女 20 1986 - 01 - 03 82345
UCHAR sql[200] = "insert into student values('B007','Amo','男',18,'2002-05-20','123456')";
//预编译SQL语句
UCHAR pre_sql[200] = "insert into student values(?,?,?,?,?,?)";
//连接数据源
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
//连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLConnect(hdbc1, szDSN, 4,szUID, 2,szAuthStr, 13);
//判断连接是否成功
if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {
//printf(retcode);
printf("连接失败!\\n");
getchar();
}
else {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//直接执行
SQLExecDirect(hstmt1, sql, 200);
printf("操作成功!");
getchar();
//释放语句句柄
SQLCloseCursor(hstmt1);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
}
/*
1.断开与数据源的连接.
2.释放连接句柄.
3.释放环境句柄.(如果不需要在这个环境中作更多连接)
*/
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
执行代码前:
执行代码后:
三、非 ODBC 方式操作数据库
对数据的操作,简单来说可以分为两种,一种是对数据的操作,如删除、修改、插入等;另一种是对数据的查询,即从数据库中查询数据,下面分别进行介绍。
3.1 删除、修改、插入数据
C 语言对数据库的操作主要体现在 SQL 语句上,主要有两种,分别为:直接执行 SQL 语句方式和预编译执行 SQL 语句方式。
1. 直接执行 SQL 语句
通过 SQLExecDirect() 函数直接执行SQL语句。【实例02】:向 student 数据库的 student 表中插入一条数据,代码如下:
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<odbcss.h>
#define MAXBUFLEN 255
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
RETCODE retcode;
//SQL语句 学号 姓名 性别 年龄 出生日期 联系方式
//B006 刘月 女 20 1986 - 01 - 03 82345
UCHAR sql[200] = "insert into student values('B008','吕梦露','女', 23,'1998-02-15','65432')";
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={SQL Server};SERVER=LAPTOP-CQGGTJJP\\\\AMOXIANG;UID=sa;PWD=sqlserver2019;DATABASE=student;";
//连接数据源
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
//连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLDriverConnect(hdbc1, NULL, ConnStrIn, SQL_NTS, NULL, NULL, NULL, SQL_DRIVER_NOPROMPT);
//判断连接是否成功
if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {
//printf(retcode);
printf("连接失败!\\n");
getchar();
}
else {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//直接执行
SQLExecDirect(hstmt1, sql, 200);
printf("操作成功!");
getchar();
//释放语句句柄
SQLCloseCursor(hstmt1);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
}
/*
1.断开与数据源的连接.
2.释放连接句柄.
3.释放环境句柄.(如果不需要在这个环境中作更多连接)
*/
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
2. 预编译执行 SQL 语句
通过 SQLPrepare() 函数预编译执行 SQL 语句。【实例03】:向 student 数据库的 student 表中插入一条数据,代码如下:
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#define MAXBUFLEN 255
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
RETCODE retcode;
// 执行预编译SQL语句
UCHAR pre_sql[225] = "insert into student values(?,?,?,?,?,?);";
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={SQL Server};SERVER=LAPTOP-CQGGTJJP\\\\AMOXIANG;UID=sa;PWD=sqlserver2019;DATABASE=student;";
//连接数据源
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
//连接句柄
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLDriverConnect(hdbc1, NULL, ConnStrIn, SQL_NTS, NULL, NULL, NULL, SQL_DRIVER_NOPROMPT);
//判断连接是否成功
if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO)) {
//printf(retcode);
printf("连接失败!\\n");
getchar();
}
else {
//分配句柄
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
//绑定参数方式
char a[200] = "B009";
char b[200] = "何朱欣";
char c[200] = "女";
char d[200] = "22";
char e[200] = "1999-3-4";
char f[200] = "159357";
SQLINTEGER p = SQL_NTS;
//预编译
SQLPrepare(hstmt1, pre_sql, 200);//第三个参数与数组大小相同,而不是数据库列相同
//绑定参数值
SQLBindParameter(hstmt1, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &a, 0, &p);
SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &b, 0, &p);
SQLBindParameter(hstmt1, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &c, 0, &p);
SQLBindParameter(hstmt1, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &d, 0, &p);
SQLBindParameter(hstmt1, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &e, 0, &p);
SQLBindParameter(hstmt1, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 200, 0, &f, 0, &p);
//执行
SQLExecute(hstmt1);
printf("操作成功!");
getchar();
//释放语句句柄
SQLCloseCursor(hstmt1);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
}
/*
1.断开与数据源的连接.
2.释放连接句柄.
3.释放环境句柄.(如果不需要在这个环境中作更多连接)
*/
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return(0);
}
3.2 查询数据
C 语言对数据库的操作,除了插入、删除和修改数据外,还可以查询数据,下面通过一个实例来介绍如何通过 C 语言程序查询数据库中的数据。
【实例04】查询 student 表中的所有数据,代码如下:
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#define NAME_LEN 20
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
//查询的结果返回到这些变量里
SQLCHAR 学号[10], 姓名[15], 性别[10], 年龄[10], 出生日期[20], 联系方式[20];
SQLINTEGER no = SQL_NTS, name = SQL_NTS, sex = SQL_NTS, age = SQL_NTS, birth = SQL_NTS, contact = SQL_NTS;
//连接数据源
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};SERVER=LAPTOP-CQGGTJJP\\\\AMOXIANG;UID=sa;PWD=sqlserver2019;DATABASE=student;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
//判断连接是否成功
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt)) {
printf("数据库连接错误!\\n");
}
else {
printf("数据库连接成功!\\n");
C语言第十二章:结构体共用体(联合体)枚举typedef