第十二章:使用C语言(Python语言)操作Sqlserver2019数据库

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二章:使用C语言(Python语言)操作Sqlserver2019数据库相关的知识,希望对你有一定的参考价值。


学前必备知识

  1. 第一章:SQL Server 数据库环境搭建与使用
  2. 第二章:SQL Server2019 数据库的基本使用之图形化界面操作
  3. 第三章:SQL Server2019 数据库 之 开启 SQL 语言之旅
  4. 第四章:SQL Server2019 数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据
  5. 第五章:SQL Server2019 数据库 之 综合案例练习、开启 SELECT 语句之旅
  6. 第六章:SQL Server2019 数据库 之 SELECT 语句的深入使用
  7. 第七章:SQL Server2019 数据库 之 单表查询综合练习 及SELECT 语句的进阶使用
  8. 第八章:SQL Server2019 数据库 之分组统计(GROUP BY)
  9. 第九章:SQL Server2019 数据库 之简单子查询
  10. 第十章:SQL Server2019 数据库 之多行子查询
  11. 第十一章: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。——张朝阳(搜狐公司首席执行官)

本章学习目标:

  1. 了解 SQL Server 的配置。
  2. 掌握使用 ODBC 连接数据库的方法。
  3. 掌握使用非 ODBC 连接数据库的方法。
  4. 拓展学习 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 数据源的步骤如下:

  1. 在 Windows 操作系统中,选择 “开始” → “控制面板” 选项,在 “查看方式” 处选择 “小图标(S)” 选项,然后单击 “管理工具” 选项,打开 “管理工具” 文件夹,如下图所示:
    在这里插入图片描述
    在 “管理工具” 文件夹中,双击 “数据源(ODBC)” 图标,打开 ODBC 数据源管理器,如图所示。
    在这里插入图片描述
  2. 在 ODBC 数据源管理器中,单击“添加”按钮,打开“创建新数据源”对话框,如图所示:
    在这里插入图片描述
  3. 在“创建新数据源”对话框中选择 ODBC 提供驱动程序的数据源,包括 Access 类驱动程序、dBase 类驱动程序、Excel 类驱动程序、FoxPro 类驱动程序、Visual FoxPro 类驱动程序、Paradox 类驱动程序、Text 类驱动程序、Oracle 类驱动程序和 SQL Server 类驱动程序。本章主要介绍创建 SQL Server 的数据源,所以在驱动程序名称菜单中,选择“SQL Server Native Client 11.0”,单击“完成”按钮,如下图所示:
    在这里插入图片描述
  4. 随后打开“创建到 SQL Server的新数据源”对话框。在“名称”文本框内输入新的数据源名,例如 csql。在“描述”文本框内输入对数据源的描述,也可以为空,这里没有输入内容。在“服务器”下拉列表框中选择需要连接的服务器,笔者这里直接输入的 LAPTOP-CQGGTJJP\\AMOXIANG。然后单击“下一步”按钮,如图所示:
    在这里插入图片描述
  5. 接下来选择 SQL Server 的登录验证方式,在“创建到SQL Server的新数据源”对话框中,选择第二个单选框“使用用户输入登录ID和密码的SQL Server验证(S)”,然后输入登录ID和密码,单击“下一步”按钮,如图所示。
    在“登录ID”文本框中输入“sa”。
    在“密码”文本框中输入密码,这个密码是安装 SQL Server 时设置的,如果为空,则不输入。
    在这里插入图片描述
  6. 打开下图所示的对话框。选中“更改默认的数据库为”复选框,同时在下拉列表框中选择需要的 SQL Server 数据库(例如选择 student),然后单击“下一步”按钮。
    在这里插入图片描述
  7. 在打开的对话框中使用默认选项,单击“完成”按钮,则打开“ODBC Microsoft SQL Server安装”对话框。单击“测试数据源”按钮,如果正确,则测试成功;如果不正确,系统会指出具体的错误,用户应该重新检查配置的内容是否正确。测试成功如图所示。
    在这里插入图片描述
  8. 单击“确定”按钮,新创建的数据源就会添加到如下图所示对话框中的数据源列表框中,再单击“确定”按钮,一个新的 SQL Server 数据源就创建完成了。
    在这里插入图片描述
    至此,ODBC 数据源 csql 就创建完成了,接下来就可以使用 ODBC 数据源进行数据库的连接。

3. 连接数据库函数

使用 C 语言连接数据库需要使用到一些函数,下面分别介绍。

(1) SQLAllocHandle() 函数。

该函数用来分配句柄,语法如下:

SQLRETURN SQLAllocHandle(
	SQLSMALLINT HandleType,
	SQLHANDLE InputHandle,
	SQLHANDLE* OutputHandlePtr
);

参数说明:

  1. HandleType:输入变量。该变量只能从下列四个值中选择其一:

    1. SQL_HANDLE_ ENV:用于申请环境句柄。
    2. SQL_HANDLE_DBC:用于申请连接句柄。
    3. SQL_HANDLE_DESC:用于申请描述符句柄。
    4. SQL_HANDLE_STMT:用于申请语句句柄。
  2. InputHandle:该变量放入已经被分配好的前提句柄,如果第一个变量为环境句柄,则放入 SQL_NULL_HANDLE 即可;如果第一个变量为 SQL_HANDLE_DBC,则第二个变量必须为已分配的环境句柄;如果第一个变量为 SQL_HANDLE_DESC,SQL_HANDLE_STMT,则第二个变量必须为已分配好的连接句柄。

  3. 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() 函数

  1. SQLConnect() 函数。SQLConnect() 是最简单的连接函数。它接受三个参数:数据源名称、用户ID 和密码,这三个参数包含连接到数据库所需的所有信息。若要执行此操作,生成使用的数据源的名称 SQLDataSources,提示用户输入数据源、用户ID 和密码,然后调用 SQLConnect。

  2. 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_ 参数必填。驱动程序然后生成一个对话框,以便提示用户输入连接信息。此方法可以简化应用程序代码。

  3. SQLBrowseConnect() 函数。SQLBrowseConnect() 函数与SQLDriverConnect() 函数类似,功能都是连接字符串。但是,通过使用 SQLBrowseConnect() 函数,应用程序可以在运行时构造完整连接字符串,以迭代方式与数据源。这允许应用程序执行以下两种操作:生成自己的对话框以提示输入此信息,因此保留对其用户界面的控制。浏览系统以找到可由特定的驱动程序使用的数据源,它需要执行若干步骤。例如,用户可能要首先浏览网络以找到服务器,然后再选择某一服务器后,浏览该服务器以找到驱动程序可访问的数据库。当 SQLBrowseConnect() 函数完成成功连接时,它返回的连接字符串,可在后续调用 SQLDriverConnect() 函数。

4. SQLExecDirect()函数

如果语句中存在任何参数,则 SQLExecDirect() 使用参数标记变量的当前值来执行可预准备语句。SQLExecDirect() 函数是提交一次执行的 SQL 语句的最快方式,语法格式如下:

SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle,
SQLCHAR *StatementText,
SQLINTEGER TextLength);

参数说明:

  1. StatementHandle:SQL 语句句柄。
  2. StatementText:要执行的 SQL 语句。
  3. TextLength:SQL字符串长度。

5. SQLPrepare() 函数

SQLPrepare() 是 ODBC 中的一个 API 函数,用来创建 SQL 语句,语法格式如下:

SQLRETURN SQLPrepare(
SQLHSTMT StatementHandle,
SQLCHAR * StatementText,
SQLINTEGER TextLength);

参数说明:

  1. StatementHandle:SQL 语句句柄。
  2. StatementText:要执行的 SQL 语句。
  3. TextLength:SQL字符串长度。

6. SQLBindCol() 函数

SQLBindCol() 函数可以实现将数据缓冲绑定到结果集的列,语法格式如下:

SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLINTEGER BufferLength,
SQLLEN * StrLen_or_Ind);

参数说明:

  1. StatementHandle:SQL 语句句柄。
  2. ColumnNumber:结果集里要绑定的列号。
  3. TargetType:*TargetValuePtr 所指缓冲的 C 数据类型的标识符。
  4. TargetValuePtr:用来绑定列的数据缓冲的指针。
  5. BufferLength:缓冲的字节数长度。
  6. StrLen_or_IndPtr:指向绑定列的长度。

7. SQLFetch() 函数

SQLFetch() 函数从结果集中提取下一行数据并返回所有绑定列的数据,语法格式如下:

SQLRETURN SQLFetch(
	SQLHSTMT StatementHandle
);

参数说明:

  1. 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

C primer plus 读书笔记第十二章

第十二章 通过异常处理错误

#父与子的编程之旅#第十二章

进击的Python第十二章:mysql介绍与简单操作,sqlachemy介绍与简单应用

C和指针 第十二章 结构体 整体赋值 error: expected expression