基于C语言与SQLServer2000的嵌入式SQL编程技术
- 格式:pdf
- 大小:637.37 KB
- 文档页数:3
C语言嵌入式系统编程教程C语言是一种广泛应用于嵌入式系统编程的编程语言。
嵌入式系统是指嵌入在设备或系统中的小型计算机系统,如智能手机、洗衣机、汽车等。
嵌入式系统编程是指在嵌入式系统中开发软件,使其能够完成特定的任务。
C语言具有许多功能和优势,使其成为嵌入式系统编程的首选语言。
首先,C语言具有高级语言的特性,提供了更多的功能和工具,使程序员能够更轻松地编写复杂的代码。
其次,C语言具有良好的可移植性,可以在不同的嵌入式系统上运行,而无需对代码进行大量修改。
此外,C语言具有较低的内存和处理器要求,提供了更高的性能和效率。
在进行嵌入式系统编程之前,需要掌握C语言的基础知识。
首先,需要了解C语言的语法和基本概念,如变量、数据类型、运算符、控制语句等。
其次,需要学习C语言的函数和库的使用,以便在程序中调用和管理代码。
最后,还需要掌握C语言的指针和内存管理,以及文件和IO操作的基本知识。
在嵌入式系统编程中,需要注意一些特定的问题和限制。
首先,嵌入式系统的资源有限,包括内存、处理器、存储等。
因此,需要优化程序的内存和处理器使用,尽量减少资源的消耗。
其次,由于嵌入式系统通常是实时的,所以需要编写高效和可靠的代码,以确保程序能够在规定的时间内完成任务。
最后,还需要处理与外部设备的交互和通信,如传感器、显示器、网络等,以实现系统的功能。
在编写嵌入式系统的C程序时,通常需要借助一些工具和库。
其中包括编译器、调试器、模拟器和仿真器等。
编译器用于将C代码转换为可执行的二进制文件,调试器用于调试程序并查找错误,模拟器和仿真器用于在不同的环境中测试和验证代码。
总之,嵌入式系统编程是一项复杂而重要的任务,C语言是进行此类编程的理想选择。
通过掌握C语言的基础知识和相关技术,可以更好地开发和管理嵌入式系统中的软件,实现各种功能和任务。
同时,需要注意特定的问题和限制,并使用适当的工具和库来提高开发效率和程序性能。
搭建环境Visual Studio 2021 + SQL Server 2021 + MSODBC(SQL Server 2021已经携带)首先将SQL Server 2021安装好并确保以开放1433端口。
检测方法:翻开cmd 输入命令netstat –an回车即可得到以下图:给予以上前提我们将SQL Server 的SQL Server身份验证形式翻开,确保可以使用用户sa 身份登录数据库进展操作。
〔这很重要〕翻开的方法是找到SQL Server 配置管理器将SQL Server网络配置的两个协议中的Named Pipes协议和TCP/IP协议〔一共四个〕全部翻开。
〔详细方法可在网上查到〕使用sa 身份登录数据库然后创立一个数据库命名为test,在建立一个test表(a varchar(200),b varchar(200))。
配置C语言环境翻开Visual Studio 2021 新建工程选择Visual C++ 下的Win32控制台应用程序设置成空工程,并输入以下代码:#include<stdio.h>#include<string.h>#include<windows.h>#include<sql.h>#include<sqlext.h>#include<sqltypes.h>#include<odbcss.h>#define MAXBUFLEN 255SQLHENV henv = SQL_NULL_HENV;SQLHDBC hdbc1 = SQL_NULL_HDBC;SQLHSTMT hstmt1 = SQL_NULL_HSTMT;/*cpp文件功能说明:1.数据库操作中的添加,修改,删除,主要表达在SQL语句上a2.采用直接执行方式和参数预编译执行方式两种*/int main(){RETCODE retcode;//预编译SQL语句UCHAR pre_sql[225] = "insert into test values(?,?)";SQLCHAR ConnStrIn[MAXBUFLEN] = ;//1.连接数据源//1.环境句柄retcode = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE ,&henv); /*第二个参数原NULL*/retcode =SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_IN TEGER);//2.连接句柄retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);retcode =SQLDriverConnect(hdbc1,NULL,ConnStrIn,SQL_NTS,NULL,NULL,NULL,SQL_DRIVER_NOP ROMPT);//判断连接是否成功if ( (retcode != SQL_SUCCESS) && (retcode !=SQL_SUCCESS_WITH_INFO) ) {printf("连接失败!\n");} else {1.分配一个语句句柄(statement handle)2.创立SQL语句3.执行语句4.销毁语句*/retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);//第一种方式//直接执行//添加操作//SQLExecDirect (hstmt1,sql,37);//第二种方式//绑定参数方式char a[200]="bbb";char b[200]="200";SQLINTEGER p = SQL_NTS;//1预编译SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小一样,而不是数据库列一样//2绑定参数值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);//3 执行SQLExecute(hstmt1);printf("操作成功!");//释放语句句柄SQLCloseCursor (hstmt1);SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);}//3.断开数据库连接/*1. 断开数据库连接2.释放连接句柄.3.释放环境句柄(假设不再需要在这个环境中作更多连接)*/SQLDisconnect(hdbc1);SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);SQLFreeHandle(SQL_HANDLE_ENV, henv);return(0);}程序中主要还是使用了和MySQL与C语言连接时一样的函数,但SQLDriverConnect函数参数较多且重要,需要着重理解。
SQLSERVER2000教程SQL Server 2000是一种关系型数据库管理系统(RDBMS),由Microsoft开发和维护。
它是SQL Server系列的一部分,于2000年发布。
本教程将为您提供有关SQL Server 2000的基础知识和操作的详细信息。
1. 什么是SQL Server 2000?SQL Server 2000是一种用于管理大型数据库的软件。
它具有高性能、可伸缩性和可用性,并且可以在多个平台上运行,包括Windows和UNIX。
2. 安装SQL Server 20003.创建数据库在SQL Server 2000中,可以使用多种方式创建数据库。
最常见的方法是使用SQL查询编写CREATE DATABASE语句。
此外,还可以使用SQL Server Enterprise Manager或SQL Server Management Studio等图形用户界面工具创建数据库。
4.创建表表是SQL Server 2000中存储数据的基本结构。
要创建表,您需要指定表的名称、列名称和它们的数据类型。
还可以添加约束,例如主键、外键等,以确保数据的完整性。
5.插入数据一旦表创建完毕,您可以使用INSERT语句将数据插入到表中。
INSERT语句指定要插入的表、要插入的列和要插入的值。
例如,要向名为“students”的表插入一条记录,可以使用以下语句:INSERT INTO students (name, age) VALUES ('John', 25)。
6.查询数据要从表中检索数据,可以使用SELECT语句。
SELECT语句指定要检索的列和条件。
例如,要检索名为“students”的表中所有名字为“John”的学生的记录,可以使用以下语句:SELECT * FROM students WHERE name = 'John'。
7.更新数据要更新表中的数据,可以使用UPDATE语句。
MMicrosoft SQL Server 2000 Service Pack 4Desktop Engine (MSDE 2000)2005 年3 月29 日© 版权所有 Microsoft Corporation,2004。
保留所有权利。
SQL Server 文档小组不能解答技术支持问题,但是欢迎您就本自述文档提出建议和意见。
通过下面的链接可以快速并直接发送电子邮件反馈。
在提交反馈时请使用英文书写。
要提交有关本文档的书面反馈,请单击此处:提交反馈。
目录1.0 简介1.1 系统要求1.2 升级到 MSDE 2000 SP4 之前1.3 MSDE 2000 SP4 的安全注意事项1.4 确定实例名称1.5 验证 Microsoft 数据访问组件的版本1.6 确定 MSDE 2000 的当前版本1.7 有关 SP4 的其他信息1.8 SQL Server 2000 联机丛书更新已可用2.0 可以找到并下载 MSDE 2000 SP4 的位置2.1 选择正确的语言2.2 下载 MSDE 2000 SP42.3 解压缩 MSDE 2000 SP4 文件2.4 下载和解压缩阶段准则3.0 安装 Service Pack3.1 准备安装 MSDE 2000 SP43.2 运行 MSDE 2000 SP4 安装程序3.3 重新启动服务和应用程序3.4 在复制服务器上安装 MSDE 20003.5 将 MSDE 2000 SP4 应用于复制拓扑中的只读数据库或文件组3.6 升级链接服务器的目录3.7 卸载 MSDE 2000 SP43.8 重新应用 MSDE 2000 SP44.0 其他安装注意事项4.1 再分发 MSDE 2000 SP44.2 MSDE 2000 SP4 文件位置5.0 文档说明5.1 MSDE 2000 增强功能5.2 复制增强功能5.3 SQL Server 代理和共享工具增强功能5.4 XML 增强功能5.5 用于 C 语言的 DB-Library 和嵌入式 SQL5.6 MSDE 2000 安装程序增强功能5.7 可维护性增强功能[返回页首]1.0 简介本自述文件描述如何使用Microsoft® SQL Server™ 2000 Service Pack 4 (SP4) 的 SQL Server Desktop Engine (MSDE) 部分。
学习使用C语言进行嵌入式开发嵌入式开发是指将计算机系统嵌入到设备或系统中,用于控制、管理和监测硬件设备的技术。
C语言作为一种通用的高级编程语言,在嵌入式开发中被广泛应用。
学习使用C语言进行嵌入式开发,既要掌握C语言的基础知识,也要了解嵌入式开发的特点和常用工具。
本文将按照以下几个方面进行介绍。
第一章:C语言基础C语言是一种结构化的高级编程语言,作为嵌入式开发的主要工具,掌握其基础知识是必不可少的。
在这一章节中,我们将介绍C语言的语法和常见的编程技巧,包括变量、数据类型、运算符、流程控制语句等内容。
同时,还将介绍C语言的函数、数组和指针等重要概念,并通过实例代码进行演示,以帮助读者更好地理解和掌握C语言的基础知识。
第二章:嵌入式开发概述在这一章节中,我们将介绍嵌入式开发的概念和特点。
嵌入式开发通常涉及到对硬件设备的控制和驱动,因此需要熟悉硬件接口和系统架构。
我们将介绍常见的嵌入式系统平台,如ARM、AVR等,并介绍嵌入式开发中常用的集成开发环境(IDE)和编译器。
同时,还将介绍一些常用的嵌入式开发工具,如调试器和仿真器,以帮助读者更好地进行嵌入式开发。
第三章:硬件驱动开发在这一章节中,我们将介绍嵌入式开发中的硬件驱动开发。
硬件驱动是嵌入式系统与外围设备进行通信的关键。
我们将介绍硬件接口的基本概念和常见的硬件接口标准,如GPIO、SPI和UART等。
同时,还将介绍如何进行硬件驱动开发,包括编写设备驱动程序和控制设备的操作。
通过实际案例和示例代码,帮助读者掌握硬件驱动开发的基本技巧。
第四章:操作系统和任务调度在这一章节中,我们将介绍嵌入式开发中的操作系统和任务调度。
操作系统是嵌入式系统的核心,负责管理和调度系统资源,同时提供可靠的任务执行环境。
我们将介绍常见的嵌入式操作系统,如FreeRTOS和uC/OS-II等,并介绍任务调度的基本概念和实现方式。
同时,还将介绍如何编写和调度任务,以及如何进行任务间的通信和同步。
如何使用C语言进行系统级编程和嵌入式开发一、引言C语言是一门被广泛用于系统级编程和嵌入式开发的高级编程语言。
它为开发者提供了直接访问底层硬件和系统资源的能力,使得开发者可以更加灵活和高效地进行系统级编程和嵌入式开发。
本文将从几个方面介绍如何使用C语言进行系统级编程和嵌入式开发。
二、系统级编程基础1. 理解操作系统:要进行系统级编程,首先要对操作系统有一定的了解。
操作系统是计算机硬件和软件之间的连接桥梁,提供了对硬件和资源的管理和分配。
熟悉操作系统的基本概念和原理,例如进程、线程、内存管理等,对于系统级编程至关重要。
2. 编写系统调用:系统调用是用户程序与操作系统之间的接口。
通过系统调用,用户程序可以请求操作系统提供相应的服务。
学习如何编写系统调用,并了解各种常用系统调用的功能和使用方法,对于进行系统级编程至关重要。
三、嵌入式开发基础1. 了解嵌入式系统架构:嵌入式系统一般是指被嵌入到其他设备中的计算机系统,例如智能手机、汽车电子等。
了解常见的嵌入式系统架构,例如ARM架构、MIPS架构等,对于进行嵌入式开发非常重要。
2. 掌握底层硬件编程:嵌入式开发需要对底层硬件有充分的了解和掌握。
了解寄存器、外设、中断等的工作原理和编程方法,可以帮助开发者更好地进行嵌入式软件开发。
四、使用C语言进行系统级编程1. 使用系统调用:在C语言中,可以使用标准库提供的系统调用接口来进行系统级编程。
例如,使用<stdio.h>库中的文件操作函数可以对文件进行读写操作;使用<unistd.h>库中的fork()函数可以创建新的进程。
2. 管理内存和进程:C语言提供了一些函数来进行内存管理和进程管理。
例如,使用<stdlib.h>库中的malloc()和free()函数可以进行动态内存分配和释放;使用<sys/types.h>库中的pid_t类型和fork()函数可以创建和管理进程。
c语言嵌入式编程常用10个技术摘要:1.C 语言嵌入式编程概述2.C 语言嵌入式编程的优势3.常用技术1:基本数据类型与运算4.常用技术2:控制语句5.常用技术3:函数6.常用技术4:数组与指针7.常用技术5:结构体与联合体8.常用技术6:文件操作9.常用技术7:进程与线程管理10.常用技术8:网络编程11.总结正文:一、C 语言嵌入式编程概述C 语言嵌入式编程是指在嵌入式系统中使用C 语言进行程序开发。
嵌入式系统是一种具有特定功能的计算机系统,通常用于对各种设备或系统进行控制、监测和管理。
C 语言作为一种广泛应用于计算机领域的编程语言,因其高效、灵活和可移植性等特点,在嵌入式系统开发中得到了广泛应用。
二、C 语言嵌入式编程的优势1.高效性:C 语言编译后的程序运行速度较快,能够满足嵌入式系统对实时性的要求。
2.可移植性:C 语言程序可以在不同的硬件平台上运行,便于开发人员进行跨平台开发。
3.灵活性:C 语言具有丰富的函数库和语法结构,可以满足各种复杂功能的实现。
三、常用技术1:基本数据类型与运算在嵌入式编程中,常用的基本数据类型包括整型、浮点型和字符型等。
此外,C 语言还提供了一些复合数据类型,如数组、结构体和联合体等。
运算符主要包括算术运算符、关系运算符和逻辑运算符等。
四、常用技术2:控制语句控制语句用于控制程序的执行流程,主要包括条件语句(if-else)、循环语句(for、while、do-while)和跳转语句(break、continue、goto)等。
五、常用技术3:函数函数是C 语言程序的基本组成单位,用于实现特定的功能。
在嵌入式编程中,函数主要用于封装代码、提高代码复用性和降低程序的复杂度。
六、常用技术4:数组与指针数组是一种存储多个同类型数据的数据结构,而指针则是用于存储变量内存地址的特殊数据类型。
在嵌入式编程中,数组和指针广泛应用于数据存储和传递、函数参数传递等场景。
七、常用技术5:结构体与联合体结构体和联合体是C 语言中用于描述复杂数据结构的两种方式。
基于C语言的嵌入式系统设计嵌入式系统已经成为现代科技的重要组成部分,涵盖了从家用电器到汽车、医疗设备等各个领域的应用。
在这些嵌入式系统的开发过程中,C语言作为一种高效、可移植的编程语言,被广泛应用。
本文将探讨基于C语言的嵌入式系统设计,并介绍相关的原理和技术。
一、嵌入式系统概述嵌入式系统是指嵌入在其他设备或系统内部,以完成特定功能的计算机系统。
相比于通用计算机系统,嵌入式系统具有体积小、功耗低、成本低等特点。
嵌入式系统的设计包括硬件设计和软件设计两个方面,其中软件设计中的嵌入式编程任务通常使用C语言来完成。
二、C语言在嵌入式系统设计中的优势1. 可移植性:C语言是一种面向过程的高级语言,具有良好的可移植性。
开发者可以在不同的嵌入式平台上使用相同的C代码,并且只需要进行少量的修改和适配。
2. 高效性:C语言具有较低的开销,能够在嵌入式系统的有限资源下高效地运行。
同时,C语言的底层编程能力使得开发者可以直接操作硬件,提高运行效率。
3. 丰富的库支持:C语言拥有丰富的库函数和工具链,可以方便地开发各种嵌入式应用。
这些库函数可以加快开发速度,提高代码的可维护性。
三、基于C语言的嵌入式系统设计步骤1. 确定需求:在进行嵌入式系统设计之前,需要明确系统的功能需求、性能要求和资源限制等。
这些需求将指导整个系统的设计和开发过程。
2. 硬件设计:嵌入式系统的硬件设计包括选型、电路设计、原理图设计、PCB设计等。
在硬件设计过程中,需要与软件开发人员密切合作,确保硬件与软件的协同工作。
3. 软件开发:使用C语言进行嵌入式软件的开发。
开发人员需要根据需求进行软件模块的设计,并使用C语言编写相应的代码。
在开发过程中,需要进行模块测试、集成测试和系统测试等,以确保软件的正确性和稳定性。
4. 调试优化:在软件开发完成后,需要对嵌入式系统进行调试和优化。
调试可以通过软件仿真、模拟器等方式进行,以发现潜在的错误和问题。
优化可以通过性能分析、代码优化等手段来提高系统的性能和效率。
C语言中的嵌入式系统编程嵌入式系统是一种专门为特定应用设计的计算机系统,通常被用于控制、监控和通信等领域。
而在嵌入式系统的开发过程中,C语言是最常用的编程语言之一。
本文将介绍C语言中的嵌入式系统编程,包括其特点、常用技术和开发流程等方面。
一、嵌入式系统编程特点嵌入式系统编程相比于传统的计算机编程具有以下特点:1. 有限的资源:嵌入式系统通常具有有限的处理能力、存储空间和功耗等资源,因此编程时需要考虑资源的合理利用,以满足系统的性能要求。
2. 实时性要求:许多嵌入式系统需要实时响应外部事件,对于时间敏感的应用,编程时需要采用实时操作系统或实时编程技术,确保系统能够按时处理各种任务。
3. 低功耗设计:嵌入式系统通常需要长时间运行且不易充电,因此功耗的优化是开发过程中需要考虑的重要因素之一。
二、常用嵌入式系统编程技术1. 中断处理:中断是嵌入式系统中常用的一种事件处理机制,当系统发生特定事件时,会通过中断请求向处理器发送信号,使其中断当前任务并转去处理该事件。
在C语言中,可以使用中断处理函数来编写中断服务子程序,实现对中断事件的响应。
2. 低级输入输出:在嵌入式系统中,常用的输入输出设备包括LED、LCD显示屏、蜂鸣器等。
C语言提供了对这些设备的低级控制接口,开发者可以通过编写底层驱动程序实现对这些设备的控制。
3. 存储器管理:嵌入式系统中的存储器包括RAM和ROM等,C语言提供了对存储器的灵活管理接口,开发者可以通过动态分配和释放内存来优化资源使用。
三、嵌入式系统编程开发流程嵌入式系统编程的开发流程包括以下几个步骤:1. 硬件选型:根据项目需求选择适合的嵌入式系统硬件平台,包括处理器型号、存储器容量和外设接口等。
2. 系统设计:根据需求分析设计系统的硬件和软件架构,确定模块划分和功能实现。
3. 程序开发:使用C语言编写程序代码,实现系统的各个功能模块。
4. 调试测试:将程序下载到目标板上进行调试和测试,修复代码中的错误,并确保系统的正常运行。
SQL语言:嵌入式SQL知识笔记1、概念SQL提供了将SQL语句嵌入到某种高级语言中的使用方式,通常采用预编译的方法将SQL语句嵌入高级语言中。
采用的方法由DBMS 的预处理程序对源程序进行扫码、识别出SQL语句,把它们转换为主语言调用语句,这样可以让主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。
2、SQL嵌入主语言涉及的几个问题区分主语言语句与SQL语句:通常在SQL语句前加前缀EXEC SQL,结束标志会跟着主语言不同而不同。
主语言工作单元与数据库工作单元的通信机制1、SQL通信区:向主语言传递SQL语句执行状态信息,使主语言能够根据此信息控制程序流程。
2、主变量:也成为共享变量。
主语言向SQL语句提供参数主要通过主变量,主变量由主语言的程序定义,并用SQl的DECLARE语句说明。
比如C语言中用法:•••••exec sql begin delcare section char sno[4],cno[3]int grade;char sqlstate[7]exec sql end declare section根据共享变量givesno值查询学生关系students 中的学生姓名、年龄、性别•••exec sql select sname,age,sex into:Msno,:Mcno;givensno from studnets where sno:Msno;3、游标SQl语言主要是面向集合的,一条SQL语句可产生或处理多条记录。
而主语言是面向记录的,一组主变量一次只能放一条记录,因此引入游标,通过移动游标指针来决定获取那一条记录。
3.1 定义游标:•••exec sql declare<游标> cursor for <select查询语句>endexec3.2 打开游标•exec sql open <游标名> endexec该语句执行游标定义中的select语句,同时游标处于活动状况。
SQL⼊门(4):嵌⼊式SQL语⾔本节讲述内容:1.嵌⼊式SQL 语⾔概述2.变量声明与数据库连接3.数据集与游标4.可滚动游标与数据库的增删改5.状态捕捉以及错误处理机制(⼀)嵌⼊式SQL语⾔之前我们所学的都是交互式SQL 语⾔: select .. from .. where..嵌⼊式SQL语⾔表⽰将SQL语⾔嵌⼊到某⼀种⾼级语⾔中使⽤, ⽐如C++ ,Java, powerbuilder等它们也称为宿主语⾔(host language).复杂的检索不能⽤⼀条SQL语句完成, 需要结合⾼级语⾔中的顺序\分⽀\循环结构帮助处理.if [conditon] then SQL_query else SQL_query end ifdo while [condition] SQL_query end do还有在SQL语句的检索结果基础上,再进⾏处理的SQL_query1for ... doprocess the recordnextSQL_query 2if .. thenelseend if交互式SQL: select sname, sage from student where sname='xy';嵌⼊式SQL: 以宿主语⾔C语⾔为例,exec sql select sname, sage into :vsname, :vsage from student where sname='xy';主要区别:(1) exex sql 是⼀个引导词, 它引导sql 语句, 将SQL语句预编译成C编译器可识别的语句.(2) 增加 into ⼦句, ⽤于把SQL 语句的检索结果赋给⾼级语⾔的程序变量(3) ⽤冒号开头表⽰⾼级语⾔的程序变量 :vsname , :vsage冒号很重要, ⽤于区分是程序变量还是表的字段!! .... 还有很多特点之后在详细介绍为啥要学嵌⼊式SQL , ⽤来解决啥问题?下⾯逐个解决上述8个问题(⼀) 数据库的连接(问题1)在嵌⼊式SQL 操作之前, ⾸先需要与数据库进⾏连接不同的DMBS 的语句是有差别的,在嵌⼊式SQL程序执⾏之后, 需要断开数据库SQL 执⾏的提交与撤销SQL语句在执⾏过程中, 必须要有提交, 撤销语句提交: exec sql commit work;撤销: exec sql rollback work;很多DBMS 都设计了捆绑提交\撤销与断开连接在⼀起的语句, 以保证在断开连接之前使⽤户确认提交或撤销先前的⼯作, Oracle 中就是这样:exec sql commit release;exec sql rollback release;为什么需要提交和撤销呢? 这个设计到数据库中的'' 事务 ''处理什么是事务? 从应⽤程序员⾓度来看, 事物是⼀个存取或者改变数据库内容的程序的⼀次执⾏,或者说是⼀条或者多条SQL 语句的⼀次执⾏被看做是⼀个事务事务⼀般由应⽤程序员提出, 因此有开始和结束, 结束前需要提交或者撤销begin transactionexec sql...exec sql...exec sql commit work|exec sql rollback work --提交或者撤销end transaction注意: 提交表⽰这⼀系列操作对数据库的更新是有效的, 撤销则表⽰⽆效其实从任何⼀个SQL语句执⾏就表⽰了⼀个事务的开始, 到了 commit 或 rollback 则结束⼀个事务,因此上述的 begin end 可以省略.事务的ACID 特性A : atomicity 原⼦性, DBMS保证表⽰事务中的⼀组操作是不可分的,要么全做,要么⼀条也不做C : consistency ⼀致性,例如两个⼈同时在买车票,会不会买到同⼀张车票I: isolation 隔离性两个事务操作互不⼲扰D: durability 已提交事务的影响是持久的, 被撤销的事务影响可以恢复事务处理技术是DBMS的核⼼处理技术!!(⼆) 变量声明(问题2)exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;加了冒号表⽰⾼级语⾔的程序变量, 这些变量需要声明exec sql begin declare section; --开始声明char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section; -- 结束声明注: 宿主程序的字符串变量长度要⽐字符型字段多1, 因为宿主程序的字符串尾部多⼀个终⽌符'\0' . -- 变量的声明与使⽤exec sql begin declare section;char vsname[10], specname[10]='xy' ;int vsage;exec sql end declare section;-- ⽤户在此处可以基于键盘输⼊给specname 赋值exec sql select sname, sage into :vsname, :vsage from student where sname=:specname;实例: 数据库连接+变量定义#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:";int main(){exec sql begin declare section; --下⾯声明变量char cust_id[5], cust_name[14];float cust_discnt;exec sql end declare section;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql whenever not found goto notfound; -- 记录没有找到strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select cname,discnt into :cust_name,:cust_discntfrom customers where cid=:cust_id; -- 根据输⼊的客户id 找到名字和折扣exec sql commit work;-- 提交printf("customer's name is %s and discountis %.1f\n",cust_name, cust_discnt);continue; -- 接着循环,再输⼊客户idnotfound:printf("can't find customer %s, continuing\n", cust_id);}exec sql commit release; -- 断开数据库的连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback release; -- 断开连接return1;}(三) 数据集与游标(问题3 4 5)问题3: SQL 语句如何执⾏?问题4: 如何将SQL 检索到的结果传递回宿主程序进⾏处理?问题5: 如何将静态SQL , SQL语句中的常量更换为变量?如何读取单⾏数据和多⾏数据, 单⾏结果处理与多⾏结果处理的差异: into ⼦句和游标 cursor 1. 检索单⾏结果, 可以将结果直接传送到宿主主程序的变量中, select ... into ...exec sql select sname, sage into :vsname, :vsage from studentwhere sname=:specname;2. 如果是多⾏结果, 则需要使⽤游标cursor游标是指向某个检索记录的指针, 通过这个指针, 每次读⼀⾏, 处理⼀⾏,接着再读⼀⾏...,直到全部处理完毕 fetch..into... (⼀次⼀⾏)需要先定义⼀个cursor-->再打开-->接着⼀条⼀条处理-->最后关闭exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass='0315'; -- 定义游标exec sql open cur_student; --打开游标exec sql fetch cur_student into :vsno, :vsname, :vsclass; --取数据...exec sql close cur_student; --关闭游标具体实例:已知表orders(cid, aid, product, dollars) 客户id, 代理⼈id, 产品, ⾦额游标: 给定⼀个客户id, 选出该客户下的所有代理商和⾦额(多⾏数据)#define True 1#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areaexec sql begin declare section; --声明变量char cust_id[5], agent_id[14];double dollar_sum;exec sql end declare section;int main(){char cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串exec sql declare agent_dollars cursor for-- 定义游标select aid,sum(dollars) from orderswhere cid=:cust_id group by aid;exec sql whenever sqlerror goto report_error;-- 错误捕获exec sql connect to testdbl; --连接数据库exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql open agent_dollars; -- 打开游标while(True){ -- 打印每⼀条记录exec sql fetch agent_dollars into :agent_id,:dollar_sum;printf("%s %11.2f\n",agent_id, dollar_sum)};finish:exec sql close agent_dollars; -- 关闭游标exec sql commit work; -- 提交exec sql disconnect current;--断开连接return0;report_error: -- 前⾯报错的执⾏print_dberror();exec sql rollback;-- 撤销exec sql disconnect current; --断开连接return1;}总结游标:exec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新cursor 数据读取 fetch : exec sql fetch cursor_name into host_variableexec sql delcare cur_student cursor for--游标名select sno, sname, sclass from studentwhere sclass=:vclass; -- 定义游标order by snofor read only; --只读, 不可更新exec sql open cur_student; -- 打开exec sql fetch cur_student into :vsno, :vsname, :vsage; -- 使⽤exec sql close cur_student; -- 关闭可滚动游标与数据库的增删改标注的游标始终是⾃开始到结束⽅向移动的, 每fetch ⼀次,向结束⽅向移动⼀次,每⼀条记录只能被访问⼀次, 再次访问该记录只能关闭游标后重新打开可不可以实现游标的向上移动呢? ODBC (open database connectivity) 是⼀种跨DBMS 的DB 操作平台, 它在应⽤程序与实际的DBMS之间提供了⼀种通⽤的接⼝,很多DBMS不⽀持可滚动游标, 但是通过ODBC 可实现该功能定义中增加了 scroll使⽤如下:可滚动游标移动时需要判断是否到了结束位置, 或者到了起始位置,EOF表⽰最后⼀条记录的后⾯位置BOF表⽰起始位置的前⾯如果不需要区分最上最下, 则可以⽤whenever not found 进⾏检测⽤游标进⾏数据库的增删改1. 查找删除(与交互式delete 语句相同)exec sql delete from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)-- 删除城市是哈尔滨且在订单 orders表⾥⾯没有记录的.2. 定位删除exec sql declare delcust cursor forselect cid from customers c where c.city='harbin'andnot exists (select*from orders o where o.cid=c.cid)for update of cid;exec sql open delcustwhile(True){exec sql fetch delcust into :cust_id;exec sql delete from customers where current of delcust;}1. 查找更新exec sql update student sset scalss='0315'where s.sclass='0314';2.定位更新exec sql declare stud cursor forselect*from student s where s.sclass='0314'andfor update of sclass;exec sql open studwhile(True){exec sql fetch stud into :vsno, :vsname,:vsclass;exec sql update studentset sclass='0315'where current of stud;}插⼊语句exec sql insert into student(sno,sname,sclass)values ('031501','xy','0315');exec sql insert into master_stud(sno,sname,sclass)select sno,sname,sclass from student;综合实例: 求数据库中某⼀列位于中值的那⼀⾏--已知表 orders(cid,aid,product,dollars)-- 寻找数据库中某⼀列位于中值的那⼀⾏#include<stdio.h>#include"prompt.h"exec sql include sqlca; --sqlca 表⽰SQL的通信区, communication areachar cid_prompt[]="please enter customer id:"; -- 定义提⽰字符串int main(){exec sql begin declare section; --声明变量char cid[5], user_name[20], user_pwd[10];double dollars; int ocount;exec sql end declare section;exec sql declare dollars_cursor cursor for-- 定义游标select dollars from orderswhere cid=:cid and dollars is not null order by dollars;exec sql whenever sqlerror goto report_error;-- 错误捕获strcpy(user_name,"poneilsql");-- 字符串赋值strcpy(user_pwd,"123456");exec sql connect :user_name identified by :user_pwd; -- 连接数据库--exec sql whenever not found goto finish; -- 记录没有找到while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql select count(dollars) into :ocount from orderswhere cid=:cid;if(ocount==0){printf("no record reviewed for cid value %s\n",cid);continue;}exec sql open dollars_cursor;for (i=0;i<(ocount+1)/2;i++)exec sql fetch dollars_cursor into :dollars ;exec sql close dollars_cursor;exec sql commit work; -- 提交printf("median dollar amount=%f\n",dollars); }。