数据库嵌入式SQL案例
sql数据库 c 应用实例

sql数据库c 应用实例在C语言中与SQL数据库进行交互通常涉及使用某种数据库连接库。
一个常见的库是SQLite,它是一个轻量级的数据库,非常适合嵌入式系统和桌面应用程序。
以下是一个简单的C语言应用程序示例,该程序使用SQLite库来创建一个数据库,插入一些数据,并从中检索数据。
首先,确保你已经安装了SQLite库。
在Linux上,你可以使用包管理器来安装它。
例如,在基于Debian的系统上,你可以运行:shsudo apt-get install libsqlite3-dev接下来,创建一个C文件,例如main.c,并输入以下代码:c#include <stdio.h>#include <sqlite3.h>static int callback(void *data, int argc, char **argv, char **azColName) {int i;for (i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;}int main(int argc, char *argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;rc = sqlite3_open(":memory:", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));return(0);} else {fprintf(stderr, "Opened database successfully\n");}/* 创建表格*/char *sql = "CREATE TABLE Company(""ID INT PRIMARY KEY NOT NULL,""NAME TEXT NOT NULL, ""AGE INT NOT NULL, ""ADDRESS CHAR(50), ""SALARY REAL)";rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {fprintf(stdout, "Table created successfully\n");}/* 插入数据*/sql = "INSERT INTO Company (ID,NAME,AGE,ADDRESS,SALARY) ""VALUES (1, 'Paul', 32, 'California', 20000.00 );";rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {fprintf(stdout, "Record inserted successfully\n"); }/* 查询数据*/sql = "SELECT * from Company";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {fprintf(stdout, "Operation done successfully\n"); }sqlite3_close(db);return 0;}这个程序做了以下几件事:它打开了一个在内存中的SQLite数据库(这意味着数据库只在程序运行时存在,程序关闭后数据库将被删除)。
嵌入式sql

实验四:访问数据库一、实验目的利用ODBC和任意一种高级语言,编写一段访问数据库的程序。
要求该程序可以实现查询,插入、删除和更新功能。
二、实验代码这次试验是使用C#编写的,界面与代码如下:string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string SCommand = "select * from 工作人员表;SqlDataAdapter adapter = new SqlDataAdapter(SCommand, connection);DataSet DSet = new DataSet();adapter.Fill(DSet, "工作人员表");dataGridView1.AutoGenerateColumns = true;dataGridView1.DataSource = DSet.Tables[0].DefaultView;connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();if (textBox1.Text.Length == 0){linkLabel1.Visible = true;}else if (textBox2.Text.Length == 0){linkLabel1.Visible = false;linkLabel2.Visible = true;}else{linkLabel1.Visible = false;linkLabel2.Visible = false; ;string data = string.Format("insert into 工作人员表values('" + textBox1.Text + "','" + textBox2.Text + "','" + comboBox1.Text + "','{0}','" + comboBox2.Text +"')",dateTimePicker1.Value.ToString("yyyy/MM/dd")); //写成comboBox1.SelectedText不行,记得区分SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("插入成功!");elseMessageBox.Show("不好意思,插入不成功,请重新插入!");}connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string id = dataGridView2.CurrentRow.Cells["人员编号"].Value.ToString();//string data = "delete from 工作人员表where 人员编号? = '" + id + "'";SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("删¦除成功!");elseMessageBox.Show("不好意思,删除不成功,请重新删¦除!");this.dataGridView2.Rows.Remove(this.dataGridView2.CurrentRow);//connection.Close();string connString = "Data Source=(local);Initial Catalog=Factory;Integrated Security=True;";SqlConnection connection = new SqlConnection(connString);connection.Open();string人员编号= dataGridView3.CurrentRow.Cells["人员编号"].Value.ToString();//string姓名= dataGridView3.CurrentRow.Cells["姓名"].Value.ToString();string性别= dataGridView3.CurrentRow.Cells["性别"].Value.ToString();DateTime出生日期=Convert.ToDateTime(dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString().Trim());// DateTime 出生日期= Convert.ToDateTime(dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString()); ////this.dataGridView3.CurrentRow.Cells["出生日期"].Value.ToString();string职务= dataGridView3.CurrentRow.Cells["职务"].Value.ToString();string data = string.Format("update 工作Á人员表set 人员编À号= '" + 人员编À号+ "',姓名= '" + 姓名+ "',性别= '" + 性别+ "',出生日期={0},职务= '" + 职务?+ "' where 人员编号= '" + 人员编号+ "'",出生日期.ToString("yyyy/MM/dd"));SqlCommand com = new SqlCommand(data, connection);int m = com.ExecuteNonQuery();if (m != 0)MessageBox.Show("更新成功!");elseMessageBox.Show("不好意思,更新不成功,请重新更新!");this.dataGridView3.Update();connection.Close();三、运行结果查询:插入:四、实验总结要求个人填写(实验中发现的问题和解决的办法)这次实验是对嵌入式SQL的综合运用,我使用的是C#语言。
嵌入式SQL

嵌入式SQL一、嵌入式SQL 简介嵌入式SQL(英文: Embedded SQL)是一种将SQL 语句直接嵌入到像C 、C++、JA V A 等程序设计语言中的方法。
借此方法,可使得应用程序拥有了访问数据以及处理数据的能力。
在这一方法中,将包含SQL 语言的程序设计语言成为称为宿主语言,简称主语言。
二、嵌入式SQL 的编写流程注:由于嵌入式SQL 的主语言有很多,关系型数据库也有很多,由于时间有限,我就不一一阐述了,这里我只以C 语言和Oracle 数据库为例进行说明,有兴趣的同学可以研究一下相关内容。
1.编写pc 源程序(包含SQL 语句的程序);2.使用Oracle 提供的预编译工具ProC.exe 将内嵌的SQL 语句转换为对Oracle 运行库函数( SQLLIB ) 的调用,并生成C 源代码文件;3.使用C /C++编译工具编译C/C++源文件,生成目标文件;4.使用C/C++链接工具生成可执行文件;5.运行可执行文件。
三、主语言与SQL 语句通信原理将SQL 嵌入到高级语言中混合编程,SQL 语句负责操作数据库,高级语言负责控制程序流程。
这时候程序中含有两种不同计算模型的语句,它们之间如何进行通信呢?1.SQL 语句如何向主程序传递执行状态信息?编写包含SQL 语句的程序***.pc 文件生成用RDBMS 提供的预编译工具编译***.c 文件嵌入式SQL 编写流程例如:在C语言中有这么一个功能需求,如果SQL语言执行成功,我就去执行下一行代码,否则我就退出。
这时就需要知道SQL语句的执行状态了。
在嵌入式SQL语言中,SQL语句是通过SQLCA(SQL通信区)向主程序传递其执行状态的,SQLCA里面有一个变量SQLCODE,根据这个变量,就可以知道SQL语句的执行状态。
如sqlca.sqlcode = 0 表明SQL语句执行成功;sqlca.sqlcode=1403,代表查询语句没有返回值;对于上面的案例,我们可以这样做:执行select * from student;If(sqlca.sqlcode ==0){Printf(“执行成功”);}else{Exit(0);}2.SELECT语句返回的结果怎么交给主程序,主程序如何向SQL语句传递参数。
嵌入式SQL示例

1 嵌入式SQL示例#define ture 1#include <stdio.h>#include “prompt.h”exec sql include sqlca; /*声明通信区*/int main( ){char cid_prompt[]=“请输入顾客号:”;exec sql begin declare section;char cust_id[5],agent_id[4];double dollar_sum;char user_name[20],user_ped[20];exec sql end declare section; /*声明变量*/exec sql declare agent_dollars cursor forselect aid,sum(dollars) from orderswhere cid=:cust_id group by aid;/*游标*/exec sql whenever sqlerror goto report_error;exec sql whenever not found goto finish; /*出错处理*/strcpy(user_name,”myname”);strcpy(user_pwd,”mypwd”);exec sql connect dbserver:user_name identified by :user_pwd; /*连接*/while((prompt(cid_prompt,1,cust_id,4))>=0){exec sql open agent_dollars;while (ture) {exec sql fetch agent_dillars into :agent_id,:dollar_sum; //游标取值 printf(“ %s %11.2f\n”, agent_id,dollar_sum);}continue;finish: exec sql close agent_dollars;exec sql commit work; /*游标关闭*/} /*输入顾客ID的代理商和金额*/exec sql disconnect dbserver; /*正常释放连接*/ return 0;report_error:print_dberror(); /*出错信息*/exec sql disconnect dbserver; /*释放连接*/return 1;}2 嵌入式sql实验步骤(sql2000环境)参考:/view/adeb3813866fb84ae45c8da6.html2.1 创建数据库1.创建spj数据库,建立spj表等;2.关闭sql server 2000服务管理器;3.将devtools文件夹拷贝到:C:\Program Files\Microsoft SQL Server (这个文件夹在安装盘上)4.将Binn文件夹拷贝到:C:\Program Files\Microsoft SQL Server\MSSQL (来源同上x86下 注意:为了安全起见,最好将相应的子目录也要复制上,对有相同的文件名我是采用不覆盖的方法)5.启动服务器;2.2 VC++6.0编辑器配置(初始化Vc++环境)1.工具—>选项—>目录—>Include Files如图2.1所示,添加: C:\Program Files\Microsoft SQL Server\devtools\include ;并设为第一项。
实验五通过嵌入式SQL访问数据库

数据库系统概论课程实验报告班级计科二班学号2013221104210076 姓名曹力一,各种方式简介ESQL嵌入式sql(embedded sql)是将sql语句嵌入到程序设计语言中,如C、C++和java,这些称之为主语言。
将sql嵌入到高级语言中,sql负责数据的处理,高级语言负责程序的控制。
这时候程序会有两种不同的计算机模型语言,两者是如何通信呢?1、向主语言传递sql执行的状态信息,主语言通过此信息来控制程序流程。
主要通过SQL通信区(SQL Communication Area)SQLCA实现,SQLCA中有一个变量SQLCODE用来存放执行SQL所返回的代码,成功则返回预定义代码SUCCESS,否则返回错误代码。
2、主语言提供参数,主要用主变量(Host Variable)实现。
主变量按功能不同可以分为,输入主变量和输出主变量。
一个主变量附带一个指示变量,它可以检查变量是否为空值,是否被截断。
3、SQL将查询的结果交给主语言处理,主要通过主变量和游标实现。
SQL是面向集合的,一条sql可能产生多条记录。
而主语言是面向记录的,一组主变量只能处理一条记录。
所以游标的得来就是处理SQL得到的数据集合,让其指向某一条记录。
特点⏹⒈综合统一⏹ 2. 高度非过程化⏹ 3. 面向集合的操作方式⏹ 4. 同一种语法结构提供两种使用方式⏹ 5. 语言简捷,易学易用三、PL/SQLPL/SQL(procedural language/SQL)是编写数据库存储过程的一种过程语言。
它结合了SQL的数据操作能力和过程话语言的流程控制能力,是SQL的过程化扩展。
格式如下:create procedure 过程名(参数1,参数2,……)s<PL/SQL>块;优点:⏹a提供了在服务器端快速执行SQL语句的有效途径⏹降低了客户机和服务器间的通信量⏹有利于集中控制⏹方便维护四、ODBCODBC可以连接不同的RDBMS,是微软公司开放服务体系中有关数据库的一个组成部分,它建立了一组规范,并提供了一组访问数据库的标准API。
数据库-实验2-通过嵌入式SQL进行MIS系统开发

实验二通过嵌入式SQL进行MIS系统开发1、实验目的:熟悉通过高级语言连接SQL Server 数据库的过程,通过嵌入式SQL对数据库进行操作,实现简单的MIS系统2、实验环境:1)使用SQL Server数据库2)自选高级语言开发工具如Powerbuider,VC++等3)举例介绍Powerbuilder连接SQL Server ODBC数据库的过程:打开SQL Server 2008的配置管理SQL Server Configuration Manager,查看右边的服务(如:SQL Server Browser)是否启动,如果没有则手动启动。
打开Powerbuilder选择tools菜单下Database Profile选择ODB ODBC 的Utilities下的ODBC Administrator,双击后选择添加数据源,选择SQL Server Native Client配置数据源名,服务器选择local选择认证方式修改默认链接数据库添加完成后,在Database Profiles对话框中,选中ODB ODBC,右键添加New ProfileData Source选则刚刚建立的数据库源完成后,即可连接新建的ODBC数据库3、实验内容:1)MIS系统的题目和内容自选(如学生学籍管理系统,医疗档案管理系统,图书管理系统等等)。
2)至少包含4个以上的库表。
3)有交互式界面,能通过界面插入、修改和删除数据,能够实现一些简单的查询操作。
4、实验报告列出所设计的数据库表结构。
截屏给出程序界面,操作界面和操作结果其中quit为退出,而hello与SQLcall是内部测试。
点击Insert:点击Select:四个按钮分别对应选择四个表的内容:选择Update:附上主要源代码#-File: dialog_SQL.pyimport mysql.connectorimport sys, osfrom tkinter import *class MyDialog:def __init__(self, root):frame = Frame(root)self.root = rootframe.pack()# SQL related initialization #########################user = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-courtDB.dat'create_database = "CRATE DATABASE courtDB"create_table_sql1 = "\CREATE TABLE IF NOT EXISTS cases ( \case_id int AUTO_INCREMENT PRIMARY KEY, \case_describe varchar(100)) \CHARACTER SET utf8\"create_table_sql2 = "\CREATE TABLE IF NOT EXISTS lawsuits ( \lawsuit_id int AUTO_INCREMENT PRIMARY KEY, \case_id int,\judge_id int,\plaintiff varchar(20), defendant varchar(20) ) \CHARACTER SET utf8\"create_table_sql3 = "\CREATE TABLE IF NOT EXISTS judges ( \judge_id int AUTO_INCREMENT PRIMARY KEY, \name varchar(20), age int ) \CHARACTER SET utf8\"create_table_sql4 = "\CREATE TABLE IF NOT EXISTS outcomes ( \outcome_id int AUTO_INCREMENT PRIMARY KEY, \lawsuit_id int UNIQUE,\lawsuit_winner varchar(20)) \CHARACTER SET utf8\"# SQL hello function #########################self.hi_there = Button(frame, text="Hello", command=self.say_hi, activebackground = 'green',activeforeground = 'white')# SQL goodbye function #########################self.quit = Button(frame, text="Quit", fg="red", underline = 0, command=self.bye_bye, activebackground = 'green',activeforeground = 'white') # SQL test function #########################self.sql_test_call = Button(frame, text="SQL call", command=self.sql_test_call, activebackground = 'green',activeforeground = 'white') # SQL call function #########################SQL_inserter = Button(frame, text="insert", command=self.SQL_insert)SQL_selecter = Button(frame, text="select", command=self.SQL_select)SQL_updateer = Button(frame, text="update", command=self.SQL_update)# gridSQL_inserter.grid(row=0,column=1,padx=10,pady=3)SQL_selecter.grid(row=1,column=1,padx=10,pady=3)SQL_updateer.grid(row=2,column=1,padx=10,pady=3)self.quit.grid(row=0,column=2,rowspan=3,padx=10,pady=9)self.hi_there.grid(row=4,column=1)self.sql_test_call.grid(row=4,column=2)# SQL table definition test #########################sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(create_table_sql1)except mysql.connector.Error as err:print("create table 'cases' failed.")print("Error: {}".format(err.msg))sys.exit()try:cursor.execute(create_table_sql2)except mysql.connector.Error as err:print("create table 'cases' failed.")print("Error: {}".format(err.msg))sys.exit()try:cursor.execute(create_table_sql3)except mysql.connector.Error as err:print("create table 'cases' failed.")print("Error: {}".format(err.msg))sys.exit()try:cursor.execute(create_table_sql4)except mysql.connector.Error as err:print("create table 'cases' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def sql_test_call(self):# SQL related initialization #########################user = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'create_table_sql = "\CREATE TABLE IF NOT EXISTS std_test ( \id int(10) AUTO_INCREMENT PRIMARY KEY, \name varchar(20), age int(4) ) \CHARACTER SET utf8\"insert_sql = "\INSERT INTO std_test(name, age) V ALUES ('Jay', 22 ), ('杰', 26)\"select_sql = "\SELECT id, name, age FROM std_test\"# SQL related definition #########################sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()# SQL standard create #########################try:cursor.execute(create_table_sql)except mysql.connector.Error as err:print("create table 'std_test' failed.")print("Error: {}".format(err.msg))sys.exit()# SQL standard insert #########################try:cursor.execute(insert_sql)except mysql.connector.Error as err:print("insert table 'std_test' failed.")print("Error: {}".format(err.msg))sys.exit()if os.path.exists(data_file):myfile = open(data_file)lines = myfile.readlines()myfile.close()for line in lines:myset = line.split()sql = "INSERT INTO std_test (name, age) V ALUES ('{}', {})".format(myset[0], myset[1])try:cursor.execute(sql)except mysql.connector.Error as err:print("insert table 'std_test' from file 'mysql-test.dat' --failed.")print("Error: {}".format(err.msg))sys.exit()# SQL standard select #########################try:cursor.execute(select_sql)for (id, name, age) in cursor:print("ID:{} Name:{} Age:{}".format(id, name, age)) except mysql.connector.Error as err:print("query table 'mytable' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_insert(self):# topwindow1 #########################top = self.top = Toplevel(root)self.insert_table = Entry(top)self.insert_attri = Entry(top)self.insert_value = Entry(top)self.insert_op = Button(top, text="INSERT",command=lambda:self.SQL_insert_operate(TAB=self.insert_table.ge t(),ATR=self.insert_attri.get(),V AL=self.insert_value.get()), activebackground = 'green',activeforeground = 'white')Label(top, text="insert").grid(row = 0,column=2)Label(top, text="TABLE ").grid(row=1,column=1)Label(top, text="ATTRIBUTE").grid(row=1,column=2)Label(top, text="V ALUE ").grid(row=1,column=3)self.insert_table.grid(row=2,column=1)self.insert_attri.grid(row=2,column=2)self.insert_value.grid(row=2,column=3)self.insert_op.grid(row=3,column=3)# Entry #########################def SQL_insert_operate(self,TAB,ATR,V AL):print(TAB,ATR,V AL)# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'insert_sql = "INSERT INTO "+TAB+"("+ATR+") V ALUES ("+V AL+")"print(insert_sql);sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(insert_sql)except mysql.connector.Error as err:print("insert table "+TAB+" failed.")print("Error: {}".format(err.msg))sys.exit()if os.path.exists(data_file):myfile = open(data_file)lines = myfile.readlines()myfile.close()for line in lines:myset = line.split()sql = "INSERT INTO "+TAB+" ("+ATR+") V ALUES ('{}',{})".format(myset[0], myset[1])try:cursor.execute(sql)except mysql.connector.Error as err:print("insert table "+TAB+" from file 'mysql-test.dat' -- failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_select(self):# topwindow1 #########################top = self.top = Toplevel(root)self.select_cases = Button(top,text="CASES",command=self.SQL_select_cases,activebackground = 'green',activeforeground = 'white')self.select_lawsuits = Button(top,text="LAWSUITS",command=self.SQL_select_lawsuits,activebackgroun d = 'green',activeforeground = 'white')self.select_judges = Button(top,text="JUDGES",command=self.SQL_select_judges,activebackground = 'green',activeforeground = 'white')self.select_outcome = Button(top,text="OUTCOMES",command=self.SQL_select_outcomes,activebackgro und = 'green',activeforeground = 'white')self.select_cases.pack(padx=10,pady=5)self.select_lawsuits.pack(padx=10,pady=5)self.select_judges.pack(padx=10,pady=5)self.select_outcome.pack(padx=10,pady=5)# Entry #########################def SQL_select_cases(self):# topwindow1 #########################top = self.top = Toplevel(root)self.S_C_ID = Entry(top)Label(top, text="ID of the Case").pack()self.S_C_ID.pack(padx=20,pady=40)self.select_cases_op = Button(top, text="SELECT FROM CASES",command=lambda:self.SQL_S_C_op(ID=self.S_C_ID.get()), activebackground = 'green',activeforeground = 'white').pack()def SQL_S_C_op(self,ID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT case_id, case_describe FROM cases WHERE case_id = "+str(ID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (id, describe) in cursor:print("ID:{}\ndescribe:{}".format(id, describe))except mysql.connector.Error as err:print("query table 'cases' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_select_lawsuits(self):# topwindow1 #########################top = self.top = Toplevel(root)# case_idself.S_L_CID = Entry(top)Label(top, text="ID of the Case").grid(row=0,column=1)self.S_L_CID.grid(row=1,column=1)self.select_lawsuits_op = Button(top, text="SELECT",command=lambda:self.SQL_S_L_CID(CID=self.S_L_CID.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=1) # lawsuit_idself.S_L_LID = Entry(top)Label(top, text="ID of the Lawsuit").grid(row=0,column=2)self.S_L_LID.grid(row=1,column=2)self.select_lawsuits_op = Button(top, text="SELECT",command=lambda:self.SQL_S_L_LID(LID=self.S_L_LID.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=2) def SQL_S_L_CID(self,CID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT * FROM lawsuits WHERE case_id = "+str(CID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (lawsuit_id,case_id,judge_id,plaintiff,defendant) in cursor:print("Lawsuit_ID:{} Case_ID:{} Judge_ID:{} plaintiff:{} defendant:{}".format(lawsuit_id,case_id,judge_id,plaintiff,defendant))except mysql.connector.Error as err:print("query table 'lawsuit' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_S_L_LID(self,LID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT * FROM lawsuits WHERE lawsuit_id ="+str(LID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (lawsuit_id,case_id,judge_id,plaintiff,defendant) in cursor:print("Lawsuit_ID:{} Case_ID:{} Judge_ID:{} plaintiff:{} defendant:{}".format(lawsuit_id,case_id,judge_id,plaintiff,defendant))except mysql.connector.Error as err:print("query table 'lawsuit' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_select_judges(self):# topwindow1 #########################top = self.top = Toplevel(root)# judge_idself.S_J_JID = Entry(top)Label(top, text="ID of the Judge").grid(row=0,column=1)self.S_J_JID.grid(row=1,column=1)self.select_judges_CID = Button(top, text="SELECT",command=lambda:self.SQL_S_J_JID(JID=self.S_J_JID.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=1) # ageself.S_J_AGE = Entry(top)Label(top, text="Age of the Judge").grid(row=0,column=2)self.S_J_AGE.grid(row=1,column=2)self.select_judges_op = Button(top, text="SELECT",command=lambda:self.SQL_S_J_AGE(AGE=self.S_J_AGE.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=2) def SQL_S_J_JID(self,JID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT * FROM judges WHERE judge_id = "+str(JID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (judge_id,name,age) in cursor:print("Judge ID:{} name:{},age:{}".format(judge_id,name,age)) except mysql.connector.Error as err:print("query table 'judges' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_S_J_AGE(self,AGE):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT * FROM judges WHERE age = "+str(AGE)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (judge_id,name,age) in cursor:print("Judge ID:{} name:{},age:{}".format(judge_id,name,age)) except mysql.connector.Error as err:print("query table 'judges' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_select_outcomes(self):# topwindow1 #########################top = self.top = Toplevel(root)# case_idself.S_O_OID = Entry(top)Label(top, text="ID of the Outcome").grid(row=0,column=1)self.S_O_OID.grid(row=1,column=1)self.select_outcome_OID = Button(top, text="SELECT",command=lambda:self.SQL_S_O_OID(OID=self.S_O_OID.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=1) # lawsuit_idself.S_O_LID = Entry(top)Label(top, text="ID of the Lawsuit").grid(row=0,column=2)self.S_O_LID.grid(row=1,column=2)self.select_outcome_LID = Button(top, text="SELECT",command=lambda:self.SQL_S_O_LID(LID=self.S_O_LID.get()), activebackground = 'green',activeforeground = 'white').grid(row=2,column=2) def SQL_S_O_OID(self,OID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT outcome_id, lawsuit_id, lawsuit_winner FROM outcomes WHERE outcome_id = "+str(OID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (outcome_id,lawsuit_id,lawsuit_winner) in cursor:print("outcome_ID:{} Lawsuit_ID:{} lawsuit_winner:{}".format(outcome_id,lawsuit_id,lawsuit_winner))except mysql.connector.Error as err:print("query table 'outcome' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_S_O_LID(self,LID):# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'# Entry #########################select_sql = "\SELECT outcome_id, lawsuit_id, lawsuit_winner FROM outcomes WHERE lawsuit_id = "+str(LID)+"\"sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(select_sql)for (outcome_id,lawsuit_id,lawsuit_winner) in cursor:print("outcome_ID:{} Lawsuit_ID:{} lawsuit_winner:{}".format(outcome_id,lawsuit_id,lawsuit_winner))except mysql.connector.Error as err:print("query table 'outcome' failed.")print("Error: {}".format(err.msg))sys.exit()sql_mit()cursor.close()sql_cnx.close()def SQL_update(self):# topwindow1 #########################top = self.top = Toplevel(root)self.update_table = Entry(top)self.update_set_attri = Entry(top)self.update_set_value = Entry(top)self.update_lim_attri = Entry(top)self.update_lim_value = Entry(top)self.update_op = Button(top, text="UPDATE",command=lambda:self.SQL_update_operate(TAB=self.update_table .get(),SET_ATR=self.update_set_attri.get(),SET_V AL=self.update_set_value.get(),LI M_ATR=self.update_lim_attri.get(),LIM_V AL=self.update_lim_value.get()), activebackground = 'green',activeforeground = 'white')Label(top, text="update").grid(row = 0,column=2)Label(top, text="TABLE ").grid(row=1,column=1)Label(top, text="UPDATE ATTRIBUTE").grid(row=1,column=2)Label(top, text="UPDATE V ALUE ").grid(row=1,column=3)Label(top, text="LIMIT ATTRIBUTE").grid(row=1,column=4)Label(top, text="LIMIT V ALUE ").grid(row=1,column=5)self.update_table.grid(row=2,column=1)self.update_set_attri.grid(row=2,column=2)self.update_set_value.grid(row=2,column=3)self.update_lim_attri.grid(row=2,column=4)self.update_lim_value.grid(row=2,column=5)self.update_op.grid(row=3,column=5)# Entry #########################def SQL_update_operate(self,TAB,SET_ATR,SET_V AL,LIM_ATR,LIM_V AL): print(TAB,SET_ATR,SET_V AL,LIM_ATR,LIM_V AL)# SQL related argumentuser = 'root'pwd = 'harbin141421'host = '127.0.0.1'db = 'courtDB'data_file = 'mysql-court.dat'update_sql = "UPDATE "+TAB+" SET "+SET_ATR+"="+str(SET_V AL)+" WHERE "+LIM_ATR+"="+str(LIM_V AL);print(update_sql);sql_cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = sql_cnx.cursor()try:cursor.execute(update_sql)except mysql.connector.Error as err:print("update table "+TAB+" failed.")print("Error: {}".format(err.msg))# sys.exit()if os.path.exists(data_file):myfile = open(data_file)lines = myfile.readlines()myfile.close()for line in lines:myset = line.split()sql = "INSERT INTO "+TAB+" ("+SET_ATR+") V ALUES ('{}',{})".format(myset[0], myset[1])try:cursor.execute(sql)except mysql.connector.Error as err:print("insert table "+TAB+" from file 'mysql-test.dat' -- failed.")print("Error: {}".format(err.msg))# sys.exit()sql_mit()cursor.close()sql_cnx.close()def say_hi(self):print("hi there, everyone!")def bye_bye(self):print ("see you sir")self.root.destroy()root = Tk()root.update()d = MyDialog(root)root.mainloop()####################。
一个嵌入式SQL编程实现的教学示例

SQL 语言具有交互式和嵌入式两种使用方式。
而对于嵌入式SQL 的编程,当前流行的《数据库系统原理/概论》教材上,对于ESQL 编程[1]的一般理论知识介绍较全面,而对其上机实现则介绍较少,即使是同一RDBMS 和同一主语言的不同实现版本(如VC++和C++Builder),其具体处理细节也有差别。
本文选用目前广泛应用的Ms SQL Server 2000为RDBMS 实验平台,C 语言为主语言,VC++为开发环境,介绍嵌入式SQL (以下简称ESQL )编程的上机实现。
1嵌入式SQL 的处理过程对于含有嵌入式SQL 的主语言程序,一般是先经RDBMS 的预编译程序对其进行扫描处理,生成不含SQL 语句的主语言源程序,此主语言源程序再经编译程序生成目标代码程序,最后与相关的函数库、运行库等连接生成可执行程序。
其关键之处:一是RDBMS 的预编译程序及其使用,二是编译链接时需要的与SQL 有关的链接库等文件。
2Ms SQL Server 2000的预编译程序及其使用下面以生成Windows95/98/NT 及以上版本下的ES-QL /C 应用程序为例,介绍ESQL /C 应用程序的预编译、编译、链接处理。
2.1预编译所需的处理程序基于Windows95/98/NT 及以上环境下的ESQL/C 预编译程序是nsqlprep.exe ,常用语法格式[2]是:nsqlprep ESQL /C 程序文件名[/SQLACCESS |/NOSQLACCESS][/DB [server_name.]database_name /PASS 邀login[.password]|$IN-TEGRATED妖]命令参数及选项说明:ESQL /C 程序文件名:为要预编译的ESQL /C 程序文件名;/SQLACCESS :为程序中的静态SQL 语句自动生成存储过程;/NOSQLACCESS :不为程序中的静态SQL 语句生成存储过程;/DB [server_name.]database_name :指定为存取规划在其中放置存储过程的服务器和数据库名称;/PASS lo-gin[.password]:指定用于访问SQL Server 和存储过程生成所用的用户标识和密码,用了/DB 选项就必须同时使用/PASS 选项;$INTEGRATED :对login[.password]参数强制使用Windows 身份认证支持。
嵌入式SQL访问数据库实验报告

黄冈师范学院提高型实验报告实验课题嵌入式SQL访问数据库(实验类型:□综合性■设计性□应用性)实验课程数据库系统概论实验时间2012年5月25日学生姓名邵旭东专业班级信息1001班学号201021240106一、实验目的和要求1. 编写嵌入式C程序,编程实现了对“学生课程数据库”的访问和对Student表中年龄进行更新。
2. 装SQL Server2000和Visual C++程序。
3、将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。
二、实验条件R429三星笔记本电脑一台。
三、实验原理分析四、实验方案或步骤1.初始化编译环境将SQL安装光盘内的DEVTOOLS文件夹复制到SQL的安装目录下(!!默认下为C:\Program Files\Microsoft SQL Server\),执行.\DEVTOOLS\SAMPLES\ESQLC\目录中的UNZIP_ESQLC.EXE文件(!!点击finish,默认解压到当前目录下!!),解压预编译必要的头文件和库文件,然后运行解压出来的批处理文件setenv.bat初始化SQL预编译环境(这项操作实际上设置两个环境变量)。
接下来添加SQL预编译接口,将安装光盘中X86\BINN中的nsqlprep.exe,sqlaiw32.dll,sqlakw.32.dll复制到SQL安装目录(!!默认下为C:\Program Files\Microsoft SQL Server\)中的\MSSQL\Binn\(注:\MSSQL\Binn\改为:\MSSQL\Binn;)目录下,并将C:\Program Files\Microsoft SQL Server\MSSQL\Binn添加到环境变量中(方法是:右击我的电脑,点击我的电脑属性,点击高级,点击环境变量,点击path ,粘贴在‘;’号后)。
SQL设置完了,现在开始设置VC编译环境。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库嵌入式SQL案例1. 数据库及表结构的创建student(sno,smame,ssex,sage,sdept)course(cno,cname,cpno,ccredit)sc(sno,cno,grade)users(uno,uname,upassword,uclass)CREATE DATABASE XXGL;goUSE XXGL;CREATE TABLE student (sno char(5) NOT null primary key,sname char(6) null,ssex char(2) null DEFAULT …男‟ CHECK(ssex=‟男‟ or ssex= …女‟),sage int null,sdept char(2) null);CREATE TABLE course (cno char(1) NOT null primary key,cname char(10) null,cpno char(1) null,ccredit int null DEFAULT 2 CHECK (ccredit>=0 and ccredit <=50));CREATE TABLE sc(sno char(5) NOT null,cno char(1) NOT null,grade int null,CONSTRAINT FK_sc_course FOREIGN KEY(cno) REFERENCES course (cno), CONSTRAINT FK_sc_student FOREIGN KEY(sno) REFERENCES student (sno) );CREATE TABLE users(uno char(6) NOT NULL PRIMARY KEY CLUSTERED (uno),uname char(10) NOT NULL,upassword varchar(10) NULL,uclass char(1) NULL DEFAULT …A‟);2.数据库的连接(connection)在main()主程序中main(int argc, char ** argv, char ** envp){//各变量定义略//SQL Server 支持的嵌入式C程序,先说明变量与主变量EXEC SQL BEGIN DECLARE SECTION;//用于连接的主变量说明char szServerDatabase[(SQLID_MAX*2)+2=]””; //放数据库服务器与数据库名char szLonginPassword[(SQLID_MAX*2)+2]=””; //放登录用户名与口令EXEC SQL END DECLARE SECTION;//接着是连接的相关设置与错误处理设置EXEC SQL WHENEVER SQLERROR CALL ErrorHandler();EXEC SQL SET OPTION LOGINTIME 10;EXEC SQL SET OPTION QUERYTIME 100;……//GetConnecToInfo()实现衔接信息的获取nRet=GetConnectToInfo(argc,argv,szServerDatabase,szLonginPassword);if (!nRet){teturn (1);}EXEC SQL CONNECT TO: szServerDatabase USER : szLonginPassword;//真正与SQL SERVER 连接If (SQLCODE==0){printf(“Connection to SQL Server established\n”);}else { printf(“ERROR:Connection to SQL Server FAILED\n”);return(1);}……//主体程序含各种嵌入式SQL命令//main()结束时断开SQL Server的连接EXEC SQL DESCONNECT ALL;//}//end of main()3. 表的初始创建程序如下:int create_student_table(){ char yn[2];EXEC SQL BEGIN DECLARE SECTION;char tname[21]=”××××××××××××××”;EXEC SQL END DECLARE SECTION;EXEC SQL select name into:tname from sysobjectswhere (xtype=‟U‟and name=‟student‟);if (SQLCODE==0||strcmp(tname, “student”)==0){printf(“The student table already exists,Do you want to delete it?\n”,SQLCODE);printf(“Delete the table?(y—yes,n--no):”);scanf(“%s”,&yn);if (yn[0]==‟y‟||yn[0]== ‟Y‟){EXEC SQL drop table student;}if (SQLCODE==0){printf(“Drop table student successfully!%d\n\n”,SQLCODE);}else { printf(“ERROR:drop table student %d\n\n”,SQLCODE);}}else return -1;}EXEC SQL create table student(sno char(5) NOT null primary key,sname char(6) null,ssex char(2) null DEFAULT …男‟CHECK(ssex=‟男‟ or ssex= …女‟),sage int null,sdept char(2) null);if (SQLCODE==0){printf(“Success to create table student!%d\n\n”,SQLCODE);}else{ printf(“ERROR:create table student %d\n”,SQLCODE);}EXEC SQL begin transactioninsert into student values(…95001‟,‟李斌‟,‟男‟,16,‟CS‟)//其它插入语句略commit transaction;if (SQLCODE==0){printf(“Success to insert rows to student table!%d\n\n”,SQLCODE);}else{ printf(“ERROR: insert rows %d\n\n”,SQLCODE);}return(0);}4. 表记录的插入int insert_rows_into_student_table(){ EXEC SQL BEGIN DECLARE SECTION;char isno[]=”95002”;char isnane[]=”××××××”;char issex[]=”男” ;int isage=18;char isdept[]=”CS”;int isnameind=0;//其他指示标量定义略EXEC SQL BEGIN DECLARE SECTION;char yn[2];while(1){printf(“Please input sno(eg:95001):”);scanf(“%s”,isno);//其他变量与指示变量输入代码类似(略)EXEC SQL insert into student(sno,sage,ssex,sname,sdept)values(:isno,:isage:isageind,:issex:issexind,:isname:isnameind,:isdept:isdeptind);if(SQLCODE==0){printf(“execute successfully!%d\n\n”,SQLCODE);}else{ printf(“ERROR: execute %d\n”,SQLCODE);}printf(“Insert again?(y—yes,n—no):”);scanf(“%s”,&yn);if (yn[0]==‟y‟||yn[0]== ‟Y‟){continue;}else break;}return(0);}5. 表记录的修改int current_of_update_for_student(){ char yn[2];…//变量定义略EXEC SQL SET CURSORTYPE CUR_STANDARD;printf(“Please input deptname to be updated(CS、IS、MA...,**--ALL):\n”);scanf(“%s”,deptname);if(strcmp(deptname,”*”)==0||strcmp(deptname,”**”)==0) strcpy(deptname,”%”);EXEC SQL DECLARE sx2 CURSOR FOR SELECT sno,sname,ssex,sage,sdept FROM student where sdept like:deptnamefor update of sname,ssex,sage,sdept;EXEC SQL OPEN sx2;while(SQLCODE==0){ EXEC SQL FETCH sx2 INTO:hsno,:hsname:ihsname,:hssex:ihssex,:hsage:ihsage,:hsdept:ihsdept;if(SQLCODE!=0) continue;printf(“%s\n”,”sno sname ssex sage sdept”);//学生记录的显示代码略printf(“UPDATE?(y/n/0,y--yes,n--no,0--exit)”);scanf(“%s”,&yn);if(yn[0]==‟y‟||yn[0]== ‟Y‟){//输入新的学生记录值到主变量中代码略EXEC SQL UPDATE student set sage=:isage:isageind,sname=:isname:isnameind,ssex=:issex:issexind,sdept=:isdept:isdeptind where current of sx2;};if(yn[0]==”0”) break;};EXEC SQL CLOSE sx2;return(0);}6. 表记录的删除int current_of_delete_for_student(){ char yn[2];…//变量定义略EXEC SQL SET CURSORTYPE CUR_STANDARD;printf(“Please input deptname to be updated(CS、IS、MA...,**--ALL):\n”);scanf(“%s”,deptname);if(strcmp(deptname,”*”)==0||strcmp(deptname,”**”)==0) strcpy(deptname,”%”);EXEC SQL DECLARE sx CURSOR FORSELECT sno,sname,ssex,sage,sdept FROM studentwhere sdept like:deptnamefor update of sname,ssex,sage,sdept;EXEC SQL OPEN sx;while(SQLCODE==0){ EXEC SQL FETCH sx INTO:hsno,:hsname:ihsname,:hssex:ihssex,:hsage:ihsage,:hsdept:ihsdept;if(SQLCODE!=0) continue;printf(“%s %5s %s %s\n”,”sno “,”sname “,” ssex”,” sage”,”sdept”);//学生记录的显示代码略printf(“DELETE?(y/n/0,y--yes,n--no,0--exit)”);scanf(“%s”,&yn);if(yn[0]==‟y‟||yn[0]== ‟Y‟){//输入新的学生记录值到主变量中代码略EXEC SQL delete from where current of sx;};if(yn[0]==”0”) break;};EXEC SQL CLOSE sx;return(0);}7. 表记录的查询int using_cursor_to_list_student(){ …//变量定义略EXEC SQL declare studentcursor cursorfor select* from student order by sno for read only;EXEC SQL open studentcursor;if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“\n”);printf(“sno sname ssex sage sdept \n”);while(SQLCODE==0){ EXEC SQL FETCH NEXT studentcursor INTO:csno,:csname:csnamenull,:cssex:cssexnull,:csage:csagenull,:csdept:csdeptnull;if(SQLCODE!=0){ //学生记录的显示代码略}}printf(“\n”);EXEC SQL CLOSE studentcursor;return(0);}8. 实现统计功能int using_cursor_to_total_s_sc(){ …//变量定义略EXEC SQL declare totalssc cursorfor select student.sno,sname,count(grade),sum(grade),avg(grade),MIN(grade),MAX(grade) from student sc where student.sno=sc.snogroup by student.sno,sname for read only;EXEC SQL open totalssc;if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“\n”);printf(“Success to total grade:! %d\n\n”,SQLCODE);printf(“sno sname count sum avg min max \n”);while(SQLCODE==0){ EXEC SQL FETCH NEXT totalssc INTO:isno,:isname:isnameind,:icnt:icnti,:isum:isumi,:iavg:iavgi, :imin:imini, :imax:imaxi;if(SQLCODE!=0){ //统计结果的显示代码略}else { printf(“ERROR:end of result %d\n”,SQLCODE);}}printf(“\n”);EXEC SQL CLOSE totalssc;return(0);}9. SQL的动态执行int dynamic_exec_sql_command(){ EXEC SQL BEGIN DECLARE SECTION;char cmd[81];EXEC SQL END DECLARE SECTION;char c,str[7];printf(“Please input a sql command(DELETE、UPDATE、INSERT):\n”);c=getchar(0);gets(cmd);if(strlen(cmd)>=6) strncpy(str,cmd,7);else {printf(“Please input correct command. \n”); return(-1);}if(strcmp(str,”select ”)==0){ printf(“Please input only DELETE、UPDA TE、INSERT command. \n”);return(-1);}EXEC SQL execute immediate:cmd;if(SQLCODE==0){ printf(“The sql command is executed successfully! %d\n”,SQLCODE);}else { printf(“ERROR: execute the sql command .%d\n”,SQLCODE);}return(0);}10. 通用统计功能int using_cursor_to_total_ty(){//变量定义略get(cmd);//输入动态统计SQL命令//判断cmd 中统计命令是否有效程序略EXEC SQL declare total_ty_cur cursor for total_ty;//定义游标EXEC SQL prepare total_ty from :cmd;//准备动态命令EXEC SQL SET CURSORTYPE CUR_STANDARD;//设置游标类型EXEC SQL open total_ty_cur; //打开游标if(SQLCODE==0){ printf(“Open successfully! %d\n”,SQLCODE);}else { printf(“ERROR:Open %d\n”,SQLCODE);}printf(“分组字段名统计值\n”);//以下程序组织输出结果while(SQLCODE==0){//取游标当前记录并显示EXEC SQL FETCH NEXT total_ty_cur INTO: con,:icnt:icnti;if(SQLCODE!=0){ printf(“%s”, con);if(icnti==0) printf(“%f\n”,icnt);else printf(“null\n”);}else { printf(“ERROR:end of the results%d\n”,SQLCODE);}}EXEC SQL close total_ty_cur;return(0);}准备实验环境:(1)新建C:\esqlc目录,SQL SERVER7.0(也可以是SQL Server2000)安装盘上的\devtools\include 目录、\devtools\x86lib目录、\x86\binn目录与\devtools\samples\esqlc中的例子复制到c:\esqlc目录中,嵌入了SQL的C语言程序也放于此目录中。