通过ODBC把数据库与C语言联系起来,调用数据库
ODBC数据库接口的介绍
ODBC数据库接口的介绍什么是ODBCMcrosoft推出的ODBC(Open Database Connectivity)技术为异质数据库的访问提供了统一的接口。
ODBC基于SQL(Structured Query Language),并把它作为访问数据库的标准。
这个接口提供了最大限度的相互可操作性:一个应用程序可以通过一组通用的代码访问不同的数据库管理系统。
一个软件开发者开发的客户/服务器应用程序不会被束定于某个特定的数据库之上。
ODBC可以为不同的数据库提供相应的驱动程序。
ODBC的灵活性表现在以下几个方面:♦应用程序不会受制于某种专用的API;♦ SQL语句以源代码的方式直接嵌入在应用程序中;♦应用程序可以以自己的格式接收和发送数据;♦ ODBC的设计完全和ISO Call-Level Interface兼容;♦现在的ODBC数据库驱动程序支持55家公司的数据产品;ODBC的名词术语ODBC驱动程序:是一个动态链接库(DLL),用以将特定的开放式数据库连接的数据源和另一个应用程序(客户端)相连接。
ODBC数据源:作为数据源使用的数据库或数据库服务器。
ODBC数据源通过它们的数据源名称来引用,或者通过具体引用ODBC驱动程序和服务器名称来引用。
可以在Windows的控制面板中使用ODBC 管理程序或rdoRegisterDataSource(一个ODBC API)方法来注册命名的数据源。
ODBC驱动程序管理器:提供从主机语言到特定后端数据源驱动程序的接口。
ODBC API:数据库厂商为程序设计者提供的直接访问数据库的一组函数。
注意:这里要指出的是,虽然ODBC API提供了很多很方便而且强大的功能。
但是ODBC API都比较难学,而且使用很容易出错。
虽然允许用ODBC API来操作ODBC句柄,如果不正确使用ODBC API,可能会导致不可预知的错误。
配置ODBC数据源ODBC管理器(Administrator)它负责安装驱动程序,管理数据源,并帮助程序员跟踪ODBC的函数调用。
wincc odbc 指令
wincc odbc 指令WINCC ODBC 指令OPC 数据访问(ODBC)是一种行业标准,允许应用程序与关系数据库进行通信。
WINCC 可使用 ODBC 驱动程序连接到外部数据库,从而扩展其数据管理和分析功能。
以下指南概述了使用 ODBC 指令在 WINCC 中访问数据库所需的关键步骤:1. 配置 ODBC 数据源在 Windows 控制面板中打开 ODBC 数据源管理器。
创建一个新的数据源,选择适当的 ODBC 驱动程序,并配置连接参数。
指定数据源名称,该名称将在 WINCC 中用于标识数据库连接。
2. 在 WINCC 中创建 ODBC 连接打开 WINCC 项目并导航到“变量管理”。
右键单击变量组并选择“添加新变量”。
在“变量属性”对话框中,选择“ODBC 数据源”作为变量类型。
输入创建的 ODBC 数据源名称。
3. 编写 ODBC 指令ODBC 指令是 SQL 语句,用于从数据库中检索或修改数据。
在WINCC 中,ODBC 指令可以动态生成或使用预定义的 SQL 查询。
动态 ODBC 指令在变量属性对话框中,选择“动态指令”。
使用脚本语言(如 C 脚本)编写 SQL 查询。
查询可以使用变量作为参数,从而实现动态数据检索。
预定义 SQL 查询在变量属性对话框中,选择“预定义 SQL 查询”。
输入预定义的 SQL 查询,用于检索或修改数据库中的数据。
4. 配置数据交换一旦 ODBC 连接和指令到位,需要配置 WINCC 与数据库之间的周期性数据交换。
在变量组的属性中,选择“数据交换”选项卡。
启用“周期性数据交换”复选框。
指定数据交换的周期和持续时间。
5. 监视 ODBC 数据数据交换完成后,可以在 WINCC 屏幕上监视来自 ODBC 数据源的数据。
在变量列表中,选择与 ODBC 连接关联的变量。
数据值将实时显示。
6. 故障排除如果出现 ODBC 连接或数据检索问题,请执行以下故障排除步骤:检查 ODBC 数据源配置和连接参数是否正确。
odbc原理
odbc原理ODBC(Open Database Connectivity)是一种用于数据库访问的标准接口,它提供了一种统一的方式来连接和操作不同数据库管理系统(DBMS)。
本文将介绍ODBC的原理及其在数据库访问中的作用。
一、ODBC的原理ODBC的原理基于客户端/服务器模型,客户端应用程序通过ODBC API(Application Programming Interface)与ODBC驱动程序进行交互,然后驱动程序将请求转发给相应的数据库管理系统(DBMS)进行处理。
ODBC通过使用SQL(Structured Query Language)来访问和操作数据库。
ODBC的核心原理在于提供了一种通用的接口,使得应用程序无需关心底层数据库的细节,只需通过ODBC API来进行数据库操作。
这样,应用程序可以与多种不同的数据库进行交互,而无需修改代码。
二、ODBC的作用1. 提供统一的数据库访问接口:ODBC为应用程序提供了一种统一的接口,使得开发人员可以使用相同的API来访问不同的数据库。
这样,开发人员无需学习和使用不同数据库特定的接口,提高了开发效率。
2. 实现跨平台数据库访问:由于不同数据库管理系统(DBMS)具有不同的API和协议,直接访问不同数据库可能会导致移植性问题。
而ODBC提供了一种跨平台的解决方案,使得应用程序可以在不同操作系统上访问同一种数据库,提高了应用程序的可移植性。
3. 支持多种数据库管理系统:ODBC支持多种不同的数据库管理系统,如Oracle、MySQL、SQL Server等。
这样,开发人员可以选择最适合自己需求的数据库,并且无需改变应用程序的代码。
4. 提供高性能的数据库访问:ODBC驱动程序负责将应用程序的请求转发给底层的数据库,通过优化查询和数据传输等操作,提高了数据库访问的性能。
5. 支持数据的事务处理:ODBC允许应用程序开启和提交事务,保证数据的一致性和完整性。
数据库接口技术——ODBC
ODBC的产生 的产生
PKU
1991年11月,微软宣布了ODBC,次年推出 可用版本. 1992年2月,推出了ODBC SDK 2.0版. ODBC基于SAG的SQL CAE草案所规定的语法, 共分为Core,Level 1, Level 2三种定义, 分别规范了22,16,13共51条命令,其中 29条命令甚至超越了SAG CLI中原有的定义, 功能强大而灵活.它还包括标准的错误代 码集,标准的连接和登录DBMS方法,标准 的数据类型表示等.
数据源的组成
PKU
数据
数据源
网络环境
操作系统
DBMS
ODBC的接口函数 的接口函数
PKU
I. 连接数据源(Connecting to a Data Source)
SQLAllocEnv SQLAllocConnect SQLConnect SQLPriverConnect SQLBrowseConnect
II. 取得驱动程序及数据源的相关讯息
SQLDataSource SQLGetInfo SQLGetFunctions SQLGetTypeInfo.
III. 设定及取得驱动程序的选项
SQLSetConnectOption SQLGetConnectOption SQLSetStmtOption SQLGetStmtOption.
PKU
应用程序
Application
驱动程序管理器
Drive manager
驱动程序
Drive
数据源
Data sourse
应用程序层
PKU
使用ODBC接口的应用程序可执行以下任务: 使用ODBC接口的应用程序可执行以下任务: ODBC接口的应用程序可执行以下任务
C语言Web开发入门前后端交互和数据库连接
C语言Web开发入门前后端交互和数据库连接在现代互联网时代,Web开发成为了热门的技术方向之一。
C语言作为一门广泛应用的编程语言,也可以用于Web开发。
本文将介绍C 语言Web开发中的前后端交互和数据库连接的基本知识。
一、前后端交互前后端交互是Web开发中非常重要的一环,它决定了用户与网站之间的信息传递和数据交换。
在C语言中,我们可以利用CGI(通用网关接口)来实现前后端交互。
CGI是一种标准化的接口协议,它定义了Web服务器与后端程序之间的通信规范。
通过CGI,我们可以在C语言中编写后端程序,接收来自前端页面的请求,并作出响应。
以下是一个简单的C语言实例:```c#include<stdio.h>#include<stdlib.h>int main(){printf("Content-type: text/html\n\n");printf("<html><body>");printf("<h1>Hello, CGI!</h1>");printf("</body></html>");return 0;}```上述代码通过`printf`函数输出HTML文本,实现了一个简单的CGI程序。
通过在Web服务器上配置CGI的映射规则,可以将该程序与前端页面进行交互。
二、数据库连接在Web开发中,数据库的应用非常普遍,它可以用于存储和管理网站的各种数据。
在C语言中,我们可以使用ODBC(开放数据库连接)来实现与数据库的连接。
ODBC是一种面向数据库的接口规范,它提供了一套标准的函数库,用于C语言程序与数据库之间的交互。
在使用ODBC之前,我们需要先安装相应的ODBC驱动程序,并进行相应的配置。
以下是一个简单连接MySQL数据库的C语言示例:```c#include<stdio.h>#include<sql.h>#include<sqlext.h>int main(){SQLHENV henv;SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);SQLDriverConnect(hdbc, NULL,"DSN=test;UID=root;PWD=123456", SQL_NTS, NULL, 0, NULL,SQL_DRIVER_COMPLETE);// 执行SQL查询或更新操作等SQLDisconnect(hdbc);SQLFreeHandle(SQL_HANDLE_DBC, hdbc);SQLFreeHandle(SQL_HANDLE_ENV, henv);return 0;}```上述代码使用了ODBC函数库来实现与MySQL数据库的连接。
C连接MYSQL数据库的3种方法及示例
C连接MYSQL数据库的3种方法及示例连接MYSQL数据库有多种方法,下面介绍其中三种常用的方法。
1.使用CAPI连接MYSQL数据库CAPI是官方提供的一套用于连接和操作MYSQL数据库的函数库。
使用该API,可以在C程序中直接连接MYSQL数据库,并执行各种SQL语句。
以下是一个连接MYSQL数据库的示例:```c#include <mysql.h>int maiMYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;conn = mysql_init(NULL);if (conn == NULL)fprintf(stderr, "mysql_init failed\n");return 1;}if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL)fprintf(stderr, "mysql_real_connect failed: %s\n", mysql_error(conn));mysql_close(conn);return 1;}if (mysql_query(conn, "SELECT * FROM table"))fprintf(stderr, "mysql_query failed: %s\n",mysql_error(conn));mysql_close(conn);return 1;}res = mysql_use_result(conn);while ((row = mysql_fetch_row(res)) != NULL)printf("%s %s %s\n", row[0], row[1], row[2]);}mysql_free_result(res);mysql_close(conn);return 0;```上述代码首先初始化MYSQL对象,然后使用mysql_real_connect函数连接MYSQL数据库。
c语言之odbc编程指南
摘要本文在介绍了ODBC(开放性数据库连接,Open DataBase Co nnectivity)运行机制的基础上,着重讨论了VisualC++2.0下利用ODBC API及利用MFC进行ODBC编程的两种方法.关键词ODBC,SQL,数据源,文档/视图结构,DBMS一、ODBC的发展背景在传统的数据库领域,数据库应用程序通常是指在特定的数据库管理系统(DBMS)的支持下,用特定的内嵌式结构化查询语言(SQL)开发的.这样的数据库应用程序存在如下的缺点:(1)它往往需要一个庞大的数据库管理系统的支持,对用户的软、硬件要求高;(2)它通常只能处理一种格式的数据库文件.与传统的数据库应用程序的实现方法相比,Microsoft的开放性数据库连接(ODBC)标准则提供了一种新的途径:它建立了一组规范,并提供了一组高层应用程序调用接口和一套基于动态链接库(DLL)的运行支持环境.用这样一组接口规范开发的应用程序,使用标准的函数和结构化查询语言(SQL)对数据库进行操作,不必关心"数据源"(DataSourc e)来自何种数据库管理系统DBMS,所有的数据库的底层操作都是由相应的ODBC驱动程序(ODBCDriver)完成.只要有了相应的ODBC驱动程序,应用程序处理的对象-数据源就可以非常广泛,既可以是本机的某种数据库格式的文件,如FoxPro的*.dbf文件,也可以是远程数据库文件,如MicrosoftSQLServer等.二、ODBC的运行机制ODBC的体系构架包括五个部分:ODBC管理器(ODBCAdministrator)、应用程序(Application)、ODBC驱动程序管理器(ODBCDriver Mana ger)、ODBC驱动程序(ODBCDriver)和数据源(Data Source).图1表示了ODBC各部分之间的关系.ODBC管理器在整个ODBC运行机制中起配置环境、登录信息的作用,它被安装在Control Pannel里(ODBCINST.CPL).通过该工具,可以用来配置、增添和删除数据源,也可以用来删除、安装ODBC驱动程序.OD BC管理器把数据源和ODBC驱动程序的信息记录在ODBC.INI、ODBCINST.INI和ODBCISAM.INI中,或者登录在系统数据库中,ODBC的其他部件通过读取这些信息,相互作用,应用程序就能够实现对已登录数据库的共享.应用程序(Application)的主要任务是通过调用标准的ODBC函数, 提交SQL语句并返回结果,对结果进行处理.ODBC驱动程序管理器的作用是根据应用程序的要求,调用不同的ODBC驱动程序.ODBC驱动程序的作用是实现ODBC函数调用,对指定的数据源执行SQL语句,并把结果返回给应用程序.有时候,为了符合特定的数据库管理系统的语法,ODBC驱动程序还会对应用程序的要求作适当修改.这里,ODBC驱动程序的作用与运行在Windows下的打印机驱动程序的作用非常相似.数据源,由用户要访问的数据及与之相关的操作系统、数据库管理系统和用于访问数据库管理系统所需的网络平台组成.对应用程序而言,ODBC驱动程序管理器和ODBC驱动程序就像一个实现ODBC函数调用的整体单元,应用程序感觉不到它们之间的分工合作关系.整个ODBC的结构是基于一种独特的动态链接库DLL而存在的,它使得系统完全模块化了.三、利用ODBC API的C语言ODBC编程下面以一个典型ODBC数据库访问程序的伪代码为例,说明用ODBCAPI的C语言进行ODBC编程的一般步骤.该程序从用户接受SQL查询语句,然后获取结果,集中各行各列的数据.HENV henvHDBChdbcHSTMThstmtint nColsSQLALLocEnv(&henv)/*环境申请,获得一个环境句柄*/SQLAllocConnect(henv,&hdbc)/*连接申请,获得数据库连接句柄*/SQLDriverConnect(hdbc,…)/*与具体的ODBC驱动程序和数据源联系*/SQLAllocStmt(hdbc,&hstmt)/*语句申请,获得一个语句句柄*/Input SQLStatement/*从用户接受SQL语句*/SQLExecDirect(hstmt,SQLStatement,…)/*执行SQL语句*/SQLNumResultCols(hstmt,&nCols)/*获取结果集中列数*/for each column{/*获得每列的信息,并与相应的C变量联系起来*/SQLDescribeCol(hstmt,col,ColName,…)/*获取当前列的信息*/ SQLBindCol(hstmt,col,…,variable,…)/*与相应变量联系起来*/}for each row{/*获取结果集中每行每列的数据,并作相应的处理*/SQLFetch(hstmt)/*将当前行的数据存储在SQLBindCol指定的变量中,当前行在结果集中后向下滚动一行*/foreach column{process field data from column variable}}SQLfreeStmt(hstmt,…)/*释放SQL语句句柄*/SQLDisconnect(hdbc)/*断开当前的连接*/SQLFreeConnect(hdbc)/*释放当前数据库连接句柄*/SQLFreeEnv(henv)/*释放环境句柄*/当编写C程序对ODBC数据库进行访问时,必须了解三个非常重要的概念:环境(environment)、连接(connection)、语句(statement).和其他的C语言Windows程序一样,它们都是通过句柄(handle)来访问的.首先需要一个环境句柄,如上面伪代码所示,它建立了应用程序与ODBC系统之间的联系,一个应用程序通常只有一个环境句柄.下一步需建立一个或多个链接,它建立了驱动程序与数据源之间的特定组合关系.如果在函数SQLDriverConnect(hdbc,…,strConnect ,…)中提供了如下的输入字符串,DSN=COMPONEN;FIL=FOXPRO2.6而且ODBC管理器中路径及配置正确的话,该函数就能自动建立起连接来.环境和连接获得后,最后还需要一个SQL语句来实施具体的数据库操作,它可以是如下形式的查询语句:SELECT NAME,AGE,SEX,GRADE FROMSTUDENT WHERE SEX=′F′也可以是如下的更新语句:UPDATE STUDENTSETAGE=′24′WHERE NAME=′JIANG QIN G SONG′四、利用MFC的C++语言ODBC编程VisualC++2.0对ODBCAPI进行了封装,封装后,最重要的数据库MFC类有CDatabase、CRecordset和CRecordView类.尤其是CRecordset类, 它一方面与CDatabase类的对象进行数据交换,另一方面又与CRecordView类进行数据交换,是CDatabase类和CRecordView类之间的桥梁.它们之间的作用关系如图2所示.实际上,CDatabase类的每个对象代表了一个数据源的连接,适宜于对数据源下的某个表格进行整体操作;CRecordset类的每个对象代表了记录的集合,这个集合是对指定数据表格按预定的查询条件获得的,它适宜于对所选的记录集合进行操作;CRecordView类的每个对象是与之相联系CRecordset类对象的外部表现形式,它的作用是把rdset类对象的变化以一些标准Windows控制的形式表现出来,是主要的用户界面.在应用编程时,根据问题的复杂程度和要求,可采用两种不同的方法来实现.如果仅仅是对某指定的数据库进行一些简单的操作,如向数据库中追加、删除、更改一些特定的记录等,并且不需要显示数据库的这些变化的话,就可以采用第一种方法,仅仅利用CDatabase类的相关功能来实现.这种方法只需两步就可完成:1.调用CDatabase类的打开(Open)函数,进行数据源的实际连接.2.调用CDatabase类的成员函数ExecuteSQL,执行一条SQL语句,实现特定的数据库操作.下面InsertRecord函数是实现向数据源compone n的表COMPONEN中插入一行记录,记录的TYPE字段的值为"pump"的最简代码.void InsertRecord(){CDatabase m-db;m-db.Open(NULL,FALSE,FALSE,″ODBC;DSN=componen″);m-db.ExecuteSQL(″insertinto COMPONEN(TYPE)value(′pump ′)″);m-db.Close();然而,在实际编程中,这种情况很少,多数数据库应用程序不仅要实现复杂得多的数据库操作,还需要显示变化了的数据库的情况,这样就需要用到VisualC++的文档/视图结构,需要CDatabase、CRecordset 、CRecordView和CDocument类之间相互配合来实现.下面以VisualC++2.0的AppWizard和ClassWizard产生的一个实际工程test.mak为例,说明这些类是如何相互作用的.工程test.mak的数据源是componen的COMPONEN表,该表的结构如表1所示.test.exe要实现的功能是按默认的条件查询COMPONEN表,滚动记录集,并在屏幕上显示当前记录集中的当前记录.有关的代码如下所示:表1COMPONEN的结构class CTestSet:public Crecordset{public:CTestSet(CDatabase*pDatabase=NULL);DECLARE-DYNAMIC(CTestSet)//{{AFX-FIELD(CTestSet,CRecordset)CStringm-NAME;CString m-CATALOGID;CStringm-SIZE;CStringm-ORDERID;CString m-PRODUCER;//}}AFX-FIELD//{{AFX-VIRTUAL(CTestSet)public:virtual CStringGetDefaultConnect();//Default connection stringvirtual CString GetDefault//default SQLfor Recordsetvirtual void DoFieldExchange(CFieldExchange*pFX);//RFX support//}}AFX-VIRTUAL……};CStringCTestSet::GetDefaultConnect(){return-T(″ODBC;DSN=componen;″);}CStringCTestSet::GetDefaultSQL(){return-T(″COMPONEN″);}void CTestSet::DoFieldExchange(CFieldExchange*pFX){//{{AFX-FIELD-MAP(CTestSet)pFX->SetFieldType(CFieldExchange::outputColumn);RFX-Text(pFX,″NAME″,m-NAME);RFX-Text(pFX,″CATALOGID″,m-CATALOGID);RFX-Text(pFX,″SIZE″,m-SIZE);RFX-Text(pFX,″ORDERID″,m-ORDERID);RFX-Text(pFX,″PRODUCER″,m-PRODUCER);/*以下是参数连接部分,m-nParams必须先被赋值为2.这段代码仅仅是为了说明如何参数化查询条件而设置,test.mak中没有这几行代码.pFX->SetFieldType(CFieldExchange::param);RFX-Text(pFX,″NAMEParam″,m-strNAMEParam,20);RFX-Text(pFX,″CATALOGIDParam″,m-strCATALOGIDParam,10);*///}}AFX-FIELD-MAP}class CTestDoc:public Cdocument{……public:CTestSet m-testSet;public:……};class CTestView:public CRecordView{……public://{{AFX-DATA(CTestView)enum{IDD=IDD-TEST-FORM};CTestSet*m-pSet;//}}AFX-DATA//Attributespublic:CTestDoc*GetDocument();……public://{{AFX-VIRTUAL(CTestView)public:virtual CRecordset*OnGetRecordset();protected:virtual void DoDataExchange(CDataExchange*pDX(;//DDX/DDVsupportvirtual void OnInitialUpdate();//called firsttime after construct//}}AFX-VIRTUAL};void CTestView::DoDataExchange(CDataExchange*pDX){CRecordView::DoDataExchange(pDX);//{{AFX-DATA-MAP(CTestView)DDX-FieldText(pDX,IDC-EDIT-CATALOGID,m-pSet->m-CATALOGID,m-pSet);DDX-FieldText(pDX,IDC-EDIT-NAME,m-pSet->m-NAME,m-pSet);DDX-FieldText(pDX,IDC-EDIT-ORDERID,m-pSet->m-ORDERID,m-pSet);DDX-FieldText(pDX,IDC-EDIT-PRODUCER,m-pSet->m-PRODUCER,m-pSet);DDX-FieldText(pDX,IDC-EDIT-SIZE,m-pSet->m-SIZE,m-pSet);//}}AFX-DATA-MAP}CRecordset*CTestView::OnGetRecordset(){return m-pSet;}CTestDoc*CTestView::GetDocument(){ASSERT(m-pDocument->IsKindOf(RUNTIME-CLASS(CTestDoc)));return(CTestDoc*)m-pDocument;}void CTestView::OnInitialUpdate(){m-pSet=&GetDocument()->m-testSet;CRecordView::OnInitialUpdate();}分析以上代码要从CTestView类开始.依照VC标准的文档/视图结构的相互作用关系,记录视图类CRecordView的导出类CTestView,在显示前要调用它的成员函数OnInitialUpdate(),弄清函数CTestView::O nInitialUpdate()在这里的行为是理解整个代码的关键.下面是CTest View::OnInitialUpdate()函数调用关系图:CTestView::OnInitialUpdate()CRecordView::OnInitialUpdate()//调用基类的OnInitialUpdate()函数CTestView::OnGetRecordset()//得到一个CRecordset类的指针CRecordset::Open()//利用前面得到的指针访问Open函数CTestSet::GetDefaultConnect()//得到默认连接字符串CDatabase::Open()//利用默认连接字符串与数据源连接CTestSet::GetDefaultSQL()//得到默认SQL语言,执行它CFormView::OnInitialUpdate()//调用CForm View::OnInitial UpdateCTestView::DoDataExchange()//与Windows编辑控制联系起来通过以上分析,我们知道,表面上只有CRecordset、CRecordView和CDocument类的导出类之间相互作用,实际上,由于CRecordset::Ope n()函数要构造一个CDatabase类指针,并通过默认连接字符串与特定的数据源连接,仍然是四个类之间相互作用的,只不过是VC的标准框架将这种关系封装起来罢了.补充说明几点:·对当前记录集中当前记录的滚动功能,应用程序中不需要任何代码支持,VC的标准框架默认实现了.·CRecordset::Open()是如何构造一个完整的SQL查询语句、如何理解CRecordset类工作机制的关键.一个完整的SQL查询语句具有下面的普遍形式:SELECT[ALL|DISTINCT]columnlist FROMtablelist[WHEREsearchcondition][ORDER BYcolumnlist[ASC|DESC]][]内的内容表示是可选的,|表示"或者".CRecordset::Open()构造这样的SQL查询语句的伪代码如下所示:CRecordset::Open(…,lpszSQL…){IF(lpszSQL!=NULL)strSQL=lpszSQLELSEstrSQL=CRecordSet::GetDefaultSQL()IF(strSQL不以"SELECT"或"CALL}"开头){strSQL="SELECTcolumnlist FROMtablelist"其中,columnlist与CRecordSet::DoFieldExchange()中列名保持数量和顺序上的一致;tablelist是前面strSQL的值}IF(m-strFilter!=NULL)strSQL+="WHERE"+m-strFilterIF(m-strSort!=NULL)strSQL+="ORDER BY"+m-strSort}其中,strSQL是保存SQL语句的变量、m-strFilter、m-strSort是CRecordSet类的公有成员变量.CRecordSet类对象中包含的数据就是符合strSQL中查询条件的记录的集合.·程序可以动态改变SQL语句中的查询条件,即参数化WHERE字句和ORDERBY字句.在变量m-strFilter、m-strSort中将要参数化的部分以"?"代替.在调用打开函数CRecordSet::Open()前(如在构造函数中) ,将参数变量的个数赋值给变量m-nParams,并在CRecordSet::DoField Exchange()中按参数出现的先后顺序定义好,如CTestSet::DoFieldEx change()代码中注释部分所示.五、结束语从以上讨论中可知,ODBC应用程序与传统的数据库应用程序相比, 确实有自己独特的优点,它不仅编程接口十分简单方便,更主要的是它的运行机制非常适合与应用程序的其他功能完美地融合.笔者最近利用了ODBC技术,通过ODBC系统读取FoxPro2.6数据库文件中的记录,能够实现液压原理图中元件明细表的自动填充功能,非常方便快捷.。
c语言和数据库的关系
C语言和数据库有很密切的关系。
C语言是一种高级编程语言,可以用于编写许多应用程序,而数据库则是用于存储、管理和检索数据的工具。
在编写应用程序时,C语言通常需要使用数据库来保存和管理数据。
这些数据可以是用户的个人信息、订单记录、商品库存等等。
为了访问数据库中的数据,C语言程序需要使用数据库API(应用程序接口),例如ODBC(开放式数据库互连)或JDBC(Java数据库连接)。
C语言程序可以使用这些API与数据库进行交互,执行各种操作,如添加、删除、更新和查询数据。
通过使用这些API,C语言程序可以在需要时从数据库中检索数据,对其进行操作,并将修改后的数据保存回数据库中。
此外,C语言还可以用于编写与数据库直接交互的程序,例如数据库管理系统(DBMS)或关系数据库管理系统(RDBMS)。
这些程序可以用来管理数据库的结构、安全性、备份和恢复等方面的操作。
因此,C语言和数据库是紧密相关的,它们在许多应用程序中都扮演着重要的角色,一起构成了现代信息技术的基础。
c语言连接access数据库(odbc)方式
SQL_NTS, (unsigned char*)szConnStrOut,
255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
{
printf("%s: Couldn't connect to %s.\n", DAM, szDSN);
}
/* Disconnect and free up allocated handles */
SQLDisconnect(hDbc);
这里修改sql语句。注意两句
*/
#include <windows.h>
#include <stdio.h>
#include <sqlext.h>
/* Data Access Method used in this sample */
const char* DAM = "Direct ODBC";
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
printf("%s: Cleanup. Done.\n", DAM);
}
}
printf("\n");
}
else
{
printf("%s: Error: Number of fields in the result set is 0.\n", DAM);
excel odbc方法
excel odbc方法
在Excel中使用ODBC(Open Database Connectivity)方法可
以让你连接到外部数据库,并从中导入数据。
以下是使用ODBC方法
在Excel中连接外部数据库的步骤:
1. 打开Excel并选择“数据”选项卡。
在“获取外部数据”组中,选择“从其他来源”下的“从ODBC”选项。
2. 选择“ODBC 数据源”对话框中的“添加”按钮,然后选择
你要连接的数据库类型,比如SQL Server、Access等。
点击“完成”后,输入数据源名称和描述,然后点击“下一步”。
3. 在“选择数据源”对话框中,选择你要连接的数据库,然后
点击“下一步”。
4. 输入数据库登录信息,比如用户名和密码,然后点击“下一步”。
5. 在“保存数据源”对话框中,可以选择是否将数据源文件保
存在指定位置,然后点击“完成”。
6. 返回Excel中的“导入数据”对话框,选择“ODBC 数据源
名称”,然后点击“确定”。
7. 在“导入数据”对话框中,选择数据源中的表或视图,然后
点击“确定”。
这样,你就可以在Excel中使用ODBC方法连接到外部数据库,
并导入数据了。
值得注意的是,使用ODBC连接需要确保你有权限访
问目标数据库,并且已经正确安装了相应的ODBC驱动程序。
另外,
连接过程中需要输入正确的数据库登录信息,以确保连接顺利完成。
希望这些步骤能够帮助你成功使用ODBC方法在Excel中连接外部数
据库。
vs2010版本的C++OBDC方式连接数据库(ACCESS和SQL2008)
VS2010连接数据库〔access和sql 2008〕现在很多人开始用VS2010的C++了,以前大家都是从VC6.0开始使用,对6.0比拟熟悉,网上很多关于连接数据库的方法都是针对VC6.0的,很多人用2010用了一段时间之后不随手就放弃了,继续使用VC6.0.作者作为一名VS2010版本开始学习使用的人在数据库连接的时候也遇到很多问题,在这里和大家分享如下:首先是用ACCESS 方式连接数据库:以前VC6.0怎么连接相信大家都能够百度得到了,他是通过首先打开控制面板->管理工具->数据源〔ODBC〕就到了图一界面:图一然后点击右边的添加按钮:很多书里面都叫添加时候选第二项,也就是图二里面所以深色背景那项:图二Vc6.0的操作就是这样选择。
但在VS2010里面就不对。
我用的是VS2010 然后用ACCESS2007做数据库保存后缀名:accdb如图三图三选择这一项在VS2010里面就不会出错了我在这里添加了一个叫:liyixu的access数据库这就配置好了数据源接下来,讲VS2010里面怎样连接这个数据库:在VC6.0里面是通过添加类的方法来添加数据库里面的具体某一个表。
而在VS2010里面也差不多。
但是当我们按照VC6.0添加正常类的时候发现,他没有基类CRecordset类可以选择:图四比如:如果选择图四中的MFC类图五他里面没有CRecordset基类可供选择,也就无从选择数据源和表。
那么VS2010里面其实是有专门的ODBC使用者设置的。
选择:图六图六中的MFC ODBC使用者选项,不需要输入名称位置,点击添加按钮:图七进入MFC ODBC使用者向导:点击数据源按钮,进入选择数据源对话框,把文件数据源视图切换到系统数据源视图:图八选择之前在数据源中定义的liyixu 用户数据源点击确定出现登陆界面:图九这里我登录名和密码是在添加数据源时在高级选项中设置的,如果你没有设置,当然就没有,直接单击确定按钮就可以连接了图十出现图示界面我的数据库里面只有一个表会员信息,所以直接选择他,然后单击确定回到向导界面,单击完成,完成连接在这里你可以自定义自己的类的名称:图十一我在这里就直接以〔huiyuaninfo〕会员信息为类名了。
odbc连接数据库,及ado连接数据库
odbc连接数据库做之前先把sql server的服务打开。
1.这种连接方式先要配置一个数据源。
打开控制面板—管理工具—数据源(odbc)—添加选择第一个,点完成。
名称就命名为school吧(我已经创了一个school的所以这里填的school1),服务器填(local)。
下一步,再下一步。
把默认的master数据库改成school。
下一步,完成,然后测试一下连接。
测试成功之后这个数据源就有了。
打开vs2013,新建一个项目。
选择MFC应用程序名称自己取,或者默认。
确定。
选择应用程序类型,单个文档!数据库支持选择“提供文件支持的数据库视图”,ODBC。
选择机器数据源中你刚刚配置的那个数据源。
确定。
再确定。
选择到表Student之后,点确定。
这个MFC的程序就创建好了,接下来开始写。
点击资源视图(在左下角或者你的风格被安排在右下角)选择含有你创建的那个名称的IDD_XXXXXX,双击一下。
出现了上面那个东西。
在视图里面,把工具箱点出来。
在那上面画一个按钮(BUTTON),一个ListBOX在你画好的图上右击—类向导—成员变量选中那个ListBox对应的名字,添加变量。
取个变量名m_list,一会儿我要把查到的东西在这个listbox控件里面输出。
双击那个按钮就可以给这个按钮添加函数啦~加入如下代码while (!m_pSet->IsEOF()){CString a (m_pSet->m_SNO);CString b( m_pSet->m_SNAME);if (m_pSet->m_SDEPT == "信息系"){m_list.AddString(a+"------"+b);}m_pSet->MoveNext();}m_pSet 的这些操作相当于把Student表的数据放到了一个链表里,m_pSet->MoveNext()就是指向下条位置。
odbc的基本原理
odbc的基本原理ODBC(Open Database Connectivity,即开放式数据库连通性)是一个标准的数据库连通性接口,它可以提供一个通用的数据访问机制来存取各种不同的数据库,跨越了各种不同的应用程序和开发环境。
ODBC的基本原理主要包括以下几个方面。
第一、ODBC架构ODBC是一个“驱动程序”模型,即它只提供一个标准接口让应用程序与各种不同的驱动程序进行通讯,而这些驱动程序则提供了与各种不同的数据库进行通讯的实现。
ODBC架构包括了以下几个组件:·应用程序:该应用程序需要使用ODBC API来查询和修改数据。
·ODBC驱动程序管理器(DM:Driver Manager):ODBC驱动程序管理器会搜索所有已注册的驱动程序,并提供一些API来管理它们。
·ODBC驱动程序:ODBC驱动程序是该体系结构的核心,它负责执行与特定数据库的交互,以完成从ODBC API调用到实际数据库的访问。
·数据库:ODBC驱动程序通过驱动程序特定的协议与底层数据库进行通讯,例如:ODBC SQL Server驱动程序通过TCP/IP连接与SQL Server进行通讯。
第二、ODBC的连接过程ODBC连接步骤如下:1.应用程序通过调用ODBC API建立一个连接对象,该对象包括用于指定连接的数据源名称、用户名、密码和其他连接选项。
2.ODBC驱动程序管理器会查找已注册的ODBC驱动程序并选择要用于与数据源通讯的驱动程序。
3.ODBC驱动程序连接到底层数据库系统,并返回一个“连接句柄”。
4.应用程序可以通过ODBC API使用该连接句柄进行数据库查询和修改。
5.完成操作后,应用程序可以释放连接,并最终关闭与数据库系统的通讯。
第三、ODBC的SQL数据访问ODBC通过SQL语言来实现对数据库的访问,应用程序主要使用SQL命令来实现与数据库的交互。
ODBC API支持的SQL命令包括:1.查询:SELECT2.插入:INSERT3.更新:UPDATE4.删除:DELETE5.创建:CREATE6.删除:DROP7.修改:ALTER8.执行:EXECUTESQL的一个重要特点是它允许从表中读取、插入、更新和删除记录,同时还可以提供限制和排序等高级查询特性。
opengauss odbc手册
Opengauss ODBC手册一、介绍Opengauss是一款开源的关系型数据库管理系统,它以高可用、高性能和高兼容性著称。
Opengauss提供了多种客户端连接方式,其中ODBC(Open Database Connectivity)是一种常用的连接方式,允许应用程序通过标准SQL语句访问数据库。
二、安装1. 确保你已经安装了Opengauss数据库,并且数据库服务器已经在运行。
2. 接下来,需要安装Opengauss ODBC驱动。
你可以从Opengauss 冠方全球信息站上下载ODBC驱动程序。
3. 安装完毕后,需要将ODBC驱动程序配置到系统环境变量中,以便应用程序可以找到它。
三、配置ODBC数据源1. 在安装完Opengauss ODBC驱动程序后,需要配置ODBC数据源以便让应用程序能够连接到Opengauss数据库。
2. 打开ODBC数据源管理器,选择“系统DSN”选项卡。
3. 点击“添加”按钮,选择Opengauss ODBC驱动程序,然后点击“完成”。
4. 在弹出的属性对话框中,填写Opengauss数据库的连接信息,包括数据库服务器位置区域、端口、数据库名称、用户名和密码等信息。
5. 点击“测试”按钮,确认连接设置正确无误。
四、ODBC APIOpengauss ODBC提供了一系列API供应用程序调用,以实现与Opengauss数据库的交互操作。
1. ```SQLAllocHandle```:用于分配环境、连接、语句和描述符句柄。
2. ```SQLConnect```:用于连接到Opengauss数据库。
3. ```SQLExecDirect```:用于执行SQL语句。
4. ```SQLFetch```:用于从结果集中提取数据。
5. ```SQLCloseCursor```:用于关闭游标。
五、示例代码以下是一个简单的C语言示例代码,演示了如何使用Opengauss ODBC连接到数据库并执行SQL查询。
odbc连接数据库
odbc连接数据库 php操作数据库有很多种⽅式,如mysql,mysqli,odbc,pdo等。
MySQL 是 PHP 操作 MySQL 数据库最原始的 Extension。
MySQLi 的i 代表 Improvement ,提供了相对进阶的功能,就 Extension ⽽⾔,本⾝也增加了安全性,这都只是操作特定种类的数据库的,当你更换其他类型的数据库时⼜得使⽤其他类型数据库的操作⽅法来操作数据库,也就是得重写代码,这是很⿇烦的。
有没有⼀种⽅法可以是通⽤型的,使得可以⼀次编写多次使⽤,兼容各种数据库呢?答案当然是肯定的,那就是obbc以及pdo了。
pdo是php 5新出的⽤来操作各种数据库的扩展,是专属于php的,就类似于Java的jdbc。
这个后⾯再讲。
现在先讲⼀讲odbc。
什么是ODBC?ODBC 是⼀个软件驱动程序系统,⽤于连接编程语⾔与数据存储。
ODBC 是⼀个免费的开放源码系统,出现于 1992 年,它试图通过编程语⾔和数据库查询访问(SQL 标准化)来标准化连接⽅法,⽐如功能和配置。
ODBC 的作⽤是充当接⼝或连接器,它具有双重设计⽬标:⾸先,对于 ODBC 系统,它充当的是编程语⾔系统,其次,对于数据存储系统,它充当的是 ODBC 系统。
所以,ODBC 需要⼀个 “对 ODBC ⽽⾔是编程语⾔” 的驱动程序(例如 PHP-ODBC 库)和⼀个 “对数据存储系统⽽⾔是 ODBC” 的驱动程序(⽐如 MySQL-ODBC 库)。
除了 ODBC 系统本⾝之外,ODBC 还可以处理数据源的配置,允许数据源和编程语⾔之间存在模糊性。
怎么使⽤odbc?当使⽤odbc时, PHP 开发变得 “与数据库连接器⽆关”。
它对数据库(⽐如 MySQL、PostgreSQL、SQLite、Microsoft SQL Server®、IBM® DB2®、Sybase、OpenLink Virtuoso、FileMaker 和 Microsoft Office® Access®)使⽤像odbc_query()这样的函数。
odbc用途
odbc用途ODBC(Open Database Connectivity)是一种用于数据库访问的标准接口。
它允许应用程序通过统一的方式访问不同的数据库管理系统(DBMS),而无需关心具体的数据库实现细节。
ODBC在数据库应用中具有广泛的用途,本文将从不同的角度介绍ODBC的应用。
ODBC可以用于实现数据库的连接和访问。
通过ODBC,应用程序可以与各种不同类型的数据库进行通信,包括关系型数据库(如Oracle、MySQL、SQL Server等)和非关系型数据库(如MongoDB、Redis等)。
ODBC提供了一套标准的API,使得应用程序可以通过统一的方式进行数据库连接、执行SQL语句、获取查询结果等操作。
这大大简化了应用程序的开发过程,提高了开发效率。
ODBC还可以用于实现数据的导入和导出。
很多时候,我们需要将数据从一个数据库导入到另一个数据库,或者将数据导出到文件中进行备份或分析。
通过ODBC,我们可以使用相同的接口和方法,轻松地实现数据的导入和导出。
无论是从一个数据库到另一个数据库,还是从数据库到Excel表格,ODBC都可以提供简单且高效的解决方案。
ODBC还可以用于实现数据库的远程访问。
在分布式系统中,数据库通常分布在不同的物理服务器上,而应用程序需要通过网络进行访问。
通过ODBC,应用程序可以使用统一的接口,通过网络远程访问数据库。
ODBC提供了一套标准的网络协议,使得数据传输更加安全可靠。
这使得应用程序能够方便地访问远程数据库,实现数据的共享和协作。
ODBC还可以用于实现数据库的跨平台移植。
不同的数据库管理系统通常有不同的API和语法,因此需要针对不同的数据库进行适配和修改。
而通过ODBC,我们可以将应用程序与特定的数据库解耦,使得应用程序可以在不同的操作系统和平台上运行,而无需修改源代码。
这样一来,我们可以更加灵活地选择数据库,降低了应用程序的维护成本。
ODBC还可以用于实现数据库的事务控制和并发处理。
odbc函数
odbc函数ODBC函数是一种用于数据库访问的接口,它提供了一套标准的函数和方法,使得应用程序能够与不同类型的数据库进行通信和交互。
ODBC(Open Database Connectivity)是一个开放的标准,它允许不同的数据库管理系统(DBMS)之间进行互操作。
ODBC函数的优势在于它的跨平台性和可移植性。
它可以在不同的操作系统和编程语言中使用,并且可以连接到各种不同类型的数据库,如MySQL、Oracle、SQL Server等。
这为开发人员提供了更大的灵活性和选择性,使他们能够根据实际需求选择最合适的数据库。
在使用ODBC函数时,首先需要建立一个ODBC数据源。
数据源是一个数据库的连接配置,包括数据库类型、地址、用户名、密码等信息。
通过ODBC函数,应用程序可以根据数据源的配置信息连接到数据库,并执行各种数据库操作,如查询、插入、更新和删除数据等。
ODBC函数可以分为几个主要的类别,包括连接管理函数、环境管理函数、语句管理函数和结果集管理函数等。
连接管理函数用于建立和断开与数据库的连接,环境管理函数用于配置ODBC环境,语句管理函数用于执行SQL语句,结果集管理函数用于处理查询结果。
在使用ODBC函数时,需要了解一些常用的函数和参数。
例如,使用SQLConnect函数可以建立与数据库的连接,它需要指定数据源名称、用户名和密码等参数。
使用SQLExecDirect函数可以执行一个SQL语句,它需要指定一个已经建立的连接和一个SQL语句字符串。
使用SQLFetch函数可以获取查询结果的一行数据,它需要指定一个结果集句柄。
除了基本的数据库操作,ODBC函数还提供了一些高级功能,如事务处理、数据类型转换和错误处理等。
事务处理可以保证数据库操作的一致性和完整性,数据类型转换可以在不同的数据库之间进行数据的转换,错误处理可以捕获和处理数据库操作中的错误和异常情况。
ODBC函数是一种强大而灵活的数据库访问接口,它可以帮助开发人员轻松地连接和操作不同类型的数据库。
odbc连接数据库步骤
连接数据库使用ODBC(Open Database Connectivity)需要以下步骤:
1. 安装数据库驱动程序:首先需要安装数据库的ODBC驱动程序,这通常是由数据库供应商提供的。
安装驱动程序后,系统就可以识别和连接到相应的数据库。
2. 打开ODBC数据源管理器:在Windows操作系统中,可以通过控制面板-> 管理工具-> 数据源(ODBC)来打开ODBC数据源管理器。
3. 添加数据源:在ODBC数据源管理器中,选择“系统DSN”或“用户DSN”,然后点击“添加”按钮。
接下来选择安装的数据库驱动程序,然后点击“完成”。
4. 配置数据源:在添加数据源后,需要配置数据源的连接信息,包括数据库的名称、服务器地址、用户名和密码等。
根据数据库供应商提供的信息进行相应的配置。
5. 测试连接:配置完成后,可以点击“测试连接”按钮来测试是否成功连接到数据库。
如果连接成功,会显示连接成功的提示信息。
6. 使用连接:配置成功后,就可以在应用程序中使用ODBC连接数据库了。
可以通过ODBC 接口来执行SQL查询、插入、更新和删除等操作。
这些是连接数据库使用ODBC的基本步骤,具体的操作可能会因数据库类型和版本而有所不同。
什么是ODBC
什么是ODBC开放数据库互连(ODBC)是Microsoft引进的一种早期数据库接口技术。
它实际上是我们要在本章后面加以讨论的ADO的前身。
Microsoft引进这种技术的一个主要原因是,以非语言专用的方式,提供给程序员一种访问数据库内容的简单方法。
换句话说,访问DBF文件或Access Basic以得到MDB文件中的数据时,无需懂得Xbase 程序设计语言。
事实上,Visual C++就是这样一个程序设计平台,即Microsoft最初是以ODBC为目标的。
你会发现,ODBC工作起来和Windows一样棗它用包含在DLL内的驱动程序完成任务。
其实,ODBC提供一套两个驱动程序:一个是数据库管理器的语言,另一个为程序设计语言提供公用接口。
允许Visual C++用标准的函数调用经公用接口访问数据库的内容,是这两个驱动程序的汇合点。
当然,还有其它和ODBC有关的实用程序类型的DLL。
例如,一个这样的DLL允许你管理ODBC数据源。
ODBC的实际管理接口出现在SYSTEM文件夹中的某个CPL(控制面板)文件中棗我们在后面要谈到这方面的问题。
ODBC的确能履行承诺,提供对数据库内容的访问,并且没有太多的问题。
它没有提供数据库管理器和C之间尽可能最好的数据转换,这种情况是有的,但它多半能像广告所说的那样去工作。
唯一影响ODBC前程的是,它的速度极低棗至少较早版本的产品是这样。
ODBC最初面世时,一些开发者曾说,因为速度问题,ODBC永远也不会在数据库领域产生太大的影响。
然而,以Microsoft的市场影响力,ODBC毫无疑问是成功了。
今天,只要有两种ODBC驱动程序的一种,那么几乎每一个数据库管理器的表现都会很卓越。
使用ODBC在可以用ODBC做任何事之前,必须有一个数据库棗至少在脑子里。
在一个像Access这样的应用程序中创建数据库框架通常会更容易一些,因为Access可以非常轻松地提供完成任务所需的各种功能。
c语言之odbc编程指南
DM4ODBC编程指南本章结合DM4数据库的特点,比较全面系统的介绍ODBC的基本概念以及DM4 ODBC DRIVER的使用方法,以便用户更好地使用DM4 ODBC编写应用程序。
ODBC提供给你访问不同类型的数据库的途径。
结构化查询语言SQL是一种用来访问数据库的语言。
通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。
这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。
DM4 ODBC3.0遵照Microsoft ODBC3.0规范设计与开发,实现了ODBC应用程序与DM4的互连接口。
用户可以直接调用DM4 ODBC3.0接口函数访问DM4,也可以使用可视化编程工具如C++ Builder、PowerBuilder等利用DM4 ODBC3.0访问DM4。
在DM4客户端软件安装过程中,如果选择了安装ODBC驱动程序的相关选项,安装工具可完成将DM4 ODBC3.0驱动程序复制到硬盘,并在Windows注册表中登记DM4ODBC驱动程序信息的工作。
要进一步使用DM4 ODBC驱动程序,请阅读本章以了解ODBC数据源管理方法。
1 数据类型客户程序可以通过SQLGetTypeInfo函数来获取DM4 ODBC3.0支持的数据类型信息。
由SQLGetTypeInfo返回的数据类型是数据源所支持的数据类型,它们是预备用于DDL (DataDefinitionLanguage)语句的。
调用DM4 ODBC3.0的SQLGetTypeInfo,返回支持的数据类型如表1.1如下:表1:数据类型列表类型名类型描述char(n) 固定串长度为n的字符串,n<=8000Varchar(n) 最大字符串长度为n的可变长度字符串,n<=8000binary(n) 固定长度为n的二进制数据,n<=8000varbinary(n) 最大长度为n的可变长度二进制数据,n<=8000Image 影像数据类型,可变长度的二进制数据,最大长度为2G-1Text 文本数据类型,可变长度的字符数据,最大长度为2G-1Bit 单个二进制位数据Tinyint 精度为3,刻度为0的有符号精确数字,取值范围-128 (127)Smallint 精度为5,刻度为0的有符号精确数字,取值范围-32,768…32,767Int 精度为10,刻度为0的有符号精确数字,取值范围-2[31]…2[31]-1Bigint 精度为19,刻度为0的有符号精确数字值,取值范围-2[63]…2[63]-1Real 二进制精度为24的有符号近似数字值,取值范围0或者绝对值为:10[-38]…10[38]Float 二进制精度为53的有符号近似数字值,取值范围0或者绝对值为:10[-308]…10[308] Double 二进制精度为53的有符号近似数字值,取值范围0或者绝对值为:10[-308]…10[308] decimal(p,s) 精度为p,刻度为s的有符号精确数字值,1≤p≤53,s≤pnumeric(p,s) 精度为p,刻度为s的有符号精确数字值,1≤p≤38,s≤pMoney 精度固定为19,刻度固定为4的精确有符号数值Date 日期数据类型,年月日字段,格式与Gregorian(罗马)日历一致Time(p) 时间数据类型,时分秒字段,精度p指定了秒的精度timestamp(p) 时间戳数据类型,年月日时分秒字段,精度p指定了秒的精度intervalyear(p) 年间隔,即两个日期之间的年数字,p为时间间隔的首项字段精度(后面简称为:首精度)intervalmonth(p) 月间隔,即两个日期之间的月数字,p为时间间隔的首精度intervalyear(p)tomonth 年月间隔,即两个日期之间的年月数字,p为时间间隔的首精度intervalday(p) 日间隔,即为两个日期/时间之间的日数字,p为时间间隔的首精度intervalhour(p) 时间隔,即为两个日期/时间之间的时数字,p为时间间隔的首精度intervalminute(p) 分间隔,即为两个日期/时间之间的分数字,p为时间间隔的首精度intervalsecond(p,q) 秒间隔,即为两个日期/时间之间的秒数字,p为时间间隔的首精度,q为时间间隔秒精度intervalday(p)tohour 日时间隔,即为两个日期/时间之间的日时数字,p为时间间隔的首精度intervalday(p)to minute 日时分间隔,即为两个日期/时间之间的日时分数字,p为时间间隔的首精度Intervalday(p)tosecond(q) 日时分秒间隔,即为两个日期/时间之间的日时分秒数字,p为时间间隔的首精度,q为时间间隔秒精度Intervallhour(p)tominute 时分间隔,即为两个日期/时间之间的时分数字,p为时间间隔的首精度intervalhour(p)tosecond(q) 时分秒间隔,即为两个日期/时间之间的时分秒数字,p为时间间隔的首精度,q为时间间隔秒精度Intervalminute(p)tosecond(q) 分秒间隔,即为两个日期/时间之间的分秒间隔,p为时间间隔的首精度,q为时间间隔秒精度注:要支持interval数据类型,必须在数据源中进行设置,否则将不提供对该类数据类型的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
__try {
SQLCloseCursor(hRecordset);
SQLFreeHandle(SQL_HANDLE_STMT, hRecordset);
hRecordset = NULL;
}__finally{
return;
}//end try
SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv);
#else
mysql_close(&hDBC);
#endif
return 1;
}//DB_Close()
#ifndef WIN32
typedef struct tagMySQLRecordset {
if(r) return 0;
r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,0);
if(r) return 0;
r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC);
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
mysql_free_result (hRec->hRecord);
free(hRec->row); hRec->row = NULL;
free(hRec->size); hRec->size = NULL;
#include <odbcinst.h>
#include <sqlext.h>
#else
#include <mysql.h>
#include <unistd.h>
#define SQLHANDLE static MYSQL
#endif
#include <stdarg.h>
#include <stdlib.h>
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(long);
#endif
col++;
continue;
}//end if
if(c == 'f') {
#ifdef WIN32
int i=0,j=0,k=0,sz=0; char c=0;
int len = strlen(fmt); int bad=1;
#ifdef WIN32
int col=1;
#eif
while(fmt[i]) {
c = fmt[i++];
MYSQL_ROW row = mysql_fetch_row (hRec->hRecord);
if(row) {
for(int i=0; i<hRec->cols; i++) {
memcpy(hRec->row[i], row[i], hRec->size[i]);
}//next i
if(c != '%') continue;
c = fmt[i++];
var = va_arg(ap, void *);
if(c == 'd') {
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL);
extern int DB_Next(void * hRecordset);
extern void DB_CleanQuery(void *hRecordset);
extern int DB_Close(void);
#endif
#ifdef WIN32
#include <windows.h>
hStatement->hRecord = rec;
hStatement->cols = cols;
hStatement->row = (void **)malloc(cols * sizeof(void *));
memset(hStatement->row, 0, cols * sizeof(void *));
#else
r = mysql_real_query (&hDBC, sql, strlen(sql));
if(r) return NULL;
MYSQL_RES * rec = NULL;
rec = mysql_store_result (&hDBC);
if(!rec) return NULL;
SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(float);
#endif
#ifndef ___LIB_DB___
#define ___LIB_DB___
extern int DB_Open(char * dbcn, char * usr, char * pwd);
extern int DB_Exec(char * sql);
extern void * DB_Query(char *sql, const char *fmt, ...);
return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
#else
mysql_init(&hDBC);
MYSQL * rx = mysql_real_connect(
&hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0);
r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
DB_CleanQuery(hRecordset);
}//end if
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
while(fmt[i]) {
if(fmt[i]=='%') j++;
i++;
}//end while
return j;
}//end DB_params_count
void * DB_Query(char *sql, const char *fmt, ...)
{
int r=0;
hStatement->size = (int *)malloc(cols * sizeof(int));
memset(hStatement->size, 0, cols * sizeof(int));
#endif
va_list ap; va_start(ap, fmt);
void * var; char buf[32];
r = 1;
}else{
DB_CleanQuery(hRecordset);
r = 0;
}//end if
#endif
return r;
}//end DB_Next
int DB_params_count(const char * fmt)
{
int i=0, j=0;
}//next j
if(bad) return NULL;
r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
return NULL;
}//end if
free(hRec); hRec = NULL;
#endif
}//end DB_CleanQuery
int DB_Next(void * hRecordset)
{
int r=0; if(!hRecordset) return 0;
#ifdef WIN32
r = SQLFetch(hRecordset);
if(r) return 0;
r = SQLConnect(hDBC,
(unsigned char *)dbcn, strlen(dbcn),
(unsigned char *)usr, strlen(usr),
(unsigned char *)pwd, strlen(pwd));
if(!rx) return 0;
return 1;
#endif
}//end DB_Open
int DB_Exec(char * sql)
{
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
int cols = DB_params_count(fmt);