odbc 订阅
开放数据库连接(Open Database Connectivity,ODBC)是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture(Windows开放系统体系结构))的主要部分和基于Windows环境的一种数据库访问接口标准ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。 展开全文
开放数据库连接(Open Database Connectivity,ODBC)是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture(Windows开放系统体系结构))的主要部分和基于Windows环境的一种数据库访问接口标准ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。
信息
外文名
ODBC
架    构
应用程序
提出者
Microsoft
中文名
开放数据库互连
管理方法
单束式驱动程序
开放数据库互连软件架构
应用程序对外提供使用者交谈界面,同时对内执行资料之准备工作数据库系统所传回来的结果再显示给使用者看。简单来说,应用程序即ODBC 界面执行下列主要工作:驱动管理器本身是MS Windows中一个动态连接链接库文件(ODBC.DLL)。应用程序透过驱动管理器去加载并连接数据源的驱动程序(driver)并连接数据源。驱动管理器主要工作如下:1. Uses ODBC INI file to map a data source name to a specific driver DLL.2. Processes server ODBC initialization calls.3. Provides entry points to ODBC functions for each driver.4. Provides parameter validation and sequence validation for ODBC calls.驱动程序也是一个动态连接链接库文件,当应用程序呼叫ODBC函数,SQLConnect 或SQLDriverConnect时,驱动管理器就会加载相对的驱动程序与应用程序呼应。驱动程序主要是执行ODBC之相对函数,并与对应的数据源(Data Source)做沟通。驱动程序之工作如下:1. Establishes a connect to a data source.2. Submits requests to a data sources.3. Translates data to or from other formats,if requested by the application.4. Return results to the application.5. Formats errors into standard error codes and returns them to the application.6. Declares and manipulates cursors if necessary (invisible to the application).7. Initiates transactions if the data source requires explicit transaction initiation(invisible to the app).数据源唯一数据库系统(DBMS)或是数据库操作系统的一个组合。举例来说,应用库系统可以同时与下列两个或其中一个数据源连接。1. A DBMaker DBMS running on a Microsoft Windows NT accessed by NTaccessed by TCP/IP.2. A Tandem NonStop SQL DBMS running on the Guardian 90 accessed via a gateway.应用系统程序通过标准API来连接数据源,因此开发过程中不需指定特定的数据库系统,所以数据库系统的开放性从此被建立。笔者认为在计算机系统进入开放时代之时,我们应可体会到标准的建立与系统的发展是同样的重要。而信息系统架构在数据库的必要性也随着信息化社会的蓬勃发展而更显重要,因此在ODBC标准日益成熟的同时,我们也同时可以感受到数据库系统在开放架构下,更需扮演强而有力的角色。依据 ODBC 的规格,其API共可分为以下九类:1. SQLAllocEnv.2. SQLAllocConnect.3. SQLConnect.4. SQLPriverConnect.5. SQLBrowseConnect.1. SQLDataSource.2. SQLGetInfo.3. SQLGetFunctions.4. SQLGetTypeInfo.1. SQLSetConnectOption.IV. 准备SQL指令之需求1. SQLAllocStmt. 2. SQLPrepare. 3. SQLSetParam. 4. SQLParamOptions. 5. SQLGetCursorName. 6.SQLSetCursorName. 7. SQLSetScrollOptions.1. SQLExecute. 2. SQLExecDirect. 3. SQLNativeSql. 4. SQLDescribeParanl. 5. SQLNumParams. 6.SQLParamData. 7. SQLPutData.VI. 取得执行结果及有关结果的讯息1. SQLRowCount. 2. SQLNumResultCols. 3. SQLDescribeCol. 4. SQLColAttributes. 5. SQLBindCol. 6.SQLFetch. 7. SQLExtendedFetch. 8. SQLGetData. 9. SQLSetDos. 10. SQLMoreResults. 11. SQLError.VII. 取得有关数据源系统回录(System tables or Catalog)的讯息 1. SQLColumnPrivileges. 2. SQLColumns. 3. SQLForeignkeys. 4. SQLPrimaryKeys. 5.SQLProcedureColumns. 6. SQLProcedures. 7. SQLSpecialColumns. 8. SQLStatistics. 9. SQLTablePrivileges. 10. SQLTables.VIII. 结束 SQL 指令需求1. SQLFreeStmt. 2. SQLCancel. 3. SQLTransact.IX. 结束与数据源的连接1. SQLDisconnect. 2. SQLFreeConnect. 3. SQLFreeEnv.以上所列之 ODBC API函数,我们发现全都以 SQL 为开头。除以上述分类外,各个函数在其必要性或复杂度上, 更被规定在不同的几个层级中 ODBC 函数的层级为核心层(Core level),第一层(Level 1),和第二层(Level 2)。我们再来看一个很基本的应用程序步骤是如何呢? 下图告诉我们这个答案。回顾 ODBC 的架构及其执行过程,ODBC 造就了"应用程序独立性(Application Independency)"的特性,使应用程序不需在乎数据源是何种数据库系统或者纯粹是个资料或文本文件,只要相对驱动程序能完成衔接的功能,则应用程序即可达到高度的独立性。
收起全文
精华内容
下载资源
问答
  • ODBC

    2019-04-20 10:41:47
    一、ODBC安装 1)UnixODBC安装 * yum安装 # yum install -y unixODBC.x86_64 * * 验证安装 # rpm -qa | grep unixODBC unixODBC-2.3.1-11.el7.x86_64 2)PostgresqlODBC安装 * yum安装 # yum install -y ...

    一、ODBC安装
    1)UnixODBC安装
    * yum安装
     
        # yum install -y unixODBC.x86_64

    *
    * 验证安装
     
        # rpm -qa | grep unixODBC
        unixODBC-2.3.1-11.el7.x86_64
    2)PostgresqlODBC安装
    * yum安装
     
        # yum install -y postgresql-odbc.x86_64

    * 验证安装
     
        # rpm -qa | grep postgresql-odbc
        postgresql-odbc-09.03.0100-2.el7.x86_64

    二、ODBC配置
    1)查看odbcinst
    # cat /etc/odbcinst.ini
    ~
    [PostgreSQL]
    D
    Description = ODBC for PostgreSQL
    D
    Driver      = /usr/lib/psqlodbcw.so
    S
    Setup       = /usr/lib/libodbcpsqlS.so
    D
    Driver64    = /usr/lib64/psqlodbcw.so
    S
    Setup64     = /usr/lib64/libodbcpsqlS.so

    FileUsage   = 1


    2)配置odbc
    # vim /etc/odbc.ini
    ~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    [pg]
    Description = Test to pg
    Driver = PostgreSQL
    Database = postgres
    Servername = 192.168.9.139
    UserName = admin
    Password = admin
    Port = 5432

    ReadOnly = 0

    ConnSettings = set client_encoding to UTF8
    ~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    3)验证odbc
    * isql访问
     
        # isql pg admin admin

    展开全文
  • odbc

    千次阅读 2018-05-04 14:04:20
    前期准备,将使用的数据源配置到windows的ODBC中(1)找到Windows下的ODBC开始-控制面板-管理工具(2)打开用户DSN,需要配置系统DSN,需要配置配置:上面页面点击添加后出现以下页面:选中你要加的数据源后点击完成...

    1.简介

    windows上的开放数据库连接(Open Database Connectivity)

    2.前期准备,将使用的数据源配置到windows的ODBC中

    (1)找到Windows下的ODBC

    开始-控制面板-管理工具


    (2)打开

    用户DSN,需要配置


    系统DSN,需要配置


    配置:

    上面页面点击添加后出现以下页面:选中你要加的数据源后点击完成


    将数据源的信息填写


    测试链接,成功后点击ok即可

    确认以下两个位置都是以上的配置,这样就不影响任何地方调用obdc了,因为32、64都配置好了:



    (3)下载需要的odbc数据连接驱动

    sql server的odbc驱动:0117

    postgresql的odbc驱动:

    postgresql官网下载




    devart公司下载



    3.测试odbc是否可以连接数据库

    使用excle测试:




    出现如下界面证明odbc中的数据源配置生效




    展开全文
  • ODBC驱动程序ODBC驱动程序

    千次下载 热门讨论 2010-05-19 14:15:16
    在做软件安装包时,把MySQL ODBC 3.51驱动程序必要的文件一起打进安装包,让用户安装软件的时候,自动在系统ODBC 数据源管理器的连接池添加MySQL ODBC 3.51 Driver驱动程序。 InstallSheild添加MySQL ODBC驱动程序
  • ODBC 函数

    2019-08-20 16:30:39
    ODBC连接类函数 odbc_connect 打开一个ODBC连接  odbc_close 关闭一个已经打开的ODBC连接 odbc_close_all 关闭所有已经打开的ODBC连接  odbc_pconnect 打开一个持续有效的ODBC连接  ODBC操作类函数 odbc...

    ODBC连接类函数

    odbc_connect          打开一个ODBC连接 
    odbc_close            关闭一个已经打开的ODBC连接
    odbc_close_all        关闭所有已经打开的ODBC连接 
    odbc_pconnect         打开一个持续有效的ODBC连接 
    

    ODBC操作类函数

    odbc_commit            更新所有处于未决状态的操作 
    odbc_do                在打开的ODBC连接上执行SQL语句 
    odbc_exec              执行SQL语句 
    odbc_execute           执行一个预置的SQL语句 
    odbc_free_result       释放传回资料所占用的内存 
    odbc_prepare           预置SQL语句的执行 
    odbc_rollback          撤销所有处于未决状态的操作
    

    ODBC信息获取类函数

    odbc_columnprivileges        列出给定表的列和相关的权限 
    odbc_columns                 列出指定表的列的名称 
    odbc_cursor                  获取光标的名称 
    odbc_data_source             返回连接数据库的信息
    odbc_error                   获取最后的错误代码 
    odbc_errormsg                获取最后的错误信息 
    odbc_fetch_array             获取结果集数组 
    odbc_fetch_into              获取传回的指定列 
    odbc_fetch_object            返回结果集到对象 
    odbc_fetch_row               获取传回的一列 
    odbc_field_len               获取字段的长度 
    odbc_field_name              获取字段的名称 
    odbc_field_num               获取字段的序号 
    odbc_field_precision         获取字段的长度 
    odbc_field_scale             获取字段的浮点数 
    odbc_field_type              获取字段的资料类型
    odbc_foreignkeys             返回特定表的外来键 
    odbc_gettypeinfo             返回数据库的类型信息 
    odbc_longreadlen             设定传回栏的最大值 
    odbc_num_fields              获取字段数目 
    odbc_num_rows                获取传回的列数目 
    odbc_primarykeys             返回列的名字作为表的主键 
    odbc_procedurecolumns        返回检索过程的参数信息 
    odbc_procedures              获取存在于特定数据源中的进程信息 
    odbc_result_all              传回HTML表格信息 
    odbc_result                  获取结果数据 
    odbc_specialcolumns          返回一个表中在传送更新时可以自动更新的列 
    odbc_statistics              获取表的状态及其索引 
    odbc_tableprivileges         列出表格和每个表格关联的权限 
    odbc_tables                  获取特定数据库上的表的名称
    

    ODBC设置类函数

    odbc_autocommit         开启或关闭自动更新 
    odbc_binmode            设定二进制的数据处理方式 
    odbc_next_result        检查下一个结果集是否可用 
    odbc_setoption          调整ODBC设定 
    展开全文
  • odbc, 连接到ODBC数据库( 使用DBI接口) odbc ODBC的目标是提供符合开放数据库连接 ( ODBC ) 驱动程序的dbi兼容接口。 这样,ODBC drivers drivers ODBC ODBC ODBC Oracle SQL Server /SQ
  • mysql-connector-odbc-5.1.5-win32.msi MySql ODBC驱动

    千次下载 热门讨论 2009-11-21 16:14:34
    MySQL Connector/ODBC是MYSQL数据库的ODBC驱动程序,统安装了这个程序之后,就可以通过ODBC来访问MySQL,这样就可以实现SQLServer、Access和MySQL之间的数据转换,还可以支持ASP访问MySQL数据库。
  • ODBCODBC连接数据库详细说明

    万次阅读 多人点赞 2018-05-06 12:15:48
    ODBC一、ODBC简介开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用...

    ODBC

    一、ODBC简介

    开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。下面是ODBC应用系统的体系结构。

    二、ODBC句柄

    应用程序运行后,为维护执行的状态,ODBC 管理器和ODBC 驱动程序中必须保持足够的控制信息。应用程序要求ODBC 管理器和ODBC 驱动程序为ODBC环境、每个连接以及每个SQL语句分配描述/控制信息存储空间,并返回指向各个存储区的句柄供其使用。

      1)环境句柄:整个ODBC上下文的根句柄。标识全程数据访问控制信息的内存结构,包括有效连接句柄以及当前活动连接句柄。ODBC将环境句柄定义为HENV类型的变量。应用程序使用单一的环境句柄,在连接到数据源以前必须申请该句柄。

      2)连接句柄:管理有关数据库会话的所有信息。连接句柄标识每个特定的连接信息的内存结构。ODBC将环境句柄定义为HDBC类型的变量。应用程序在连接数据源之前申请连接句柄。每个连接句柄与环境句柄有关,环境句柄上可以有多个与其有关的连接句柄。

      3)语句句柄:ODBC语句包括应用访问数据源的SQL语句和语句相关的管理信息,语句句柄标识每个语句管理信息的内存结构。ODBC将语句句柄定义为HSTMT类型的变量。应用程序在提交SQL请求之前也必须申请语句句柄。每个语句句柄与一个连接句柄有关,每个连接句柄上可以有多个与其有关的语句句柄。

    三、ODBC程序执行流程

    Ø 分配环境句柄

    基于ODBC3.X版本的应用统一使用SQLAllocHandle来分配句柄。调用时设计不同的句柄类型就可以获得该类型的句柄。但在API内部实现上一般重新转换为执行SQLAllocEnvSQLAllocConnectSQLAllocStmt,这样可以达到兼容和代码重用作用。SQLAllocEnv:用来分配环境句柄。

    例如:ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &oraclehenv);

    Ø 分配连接句柄

      SQLAllocConnect:用来分配连接句柄。连接句柄提供对一些信息的访问,例如,在连接上的有效语句及标识符句柄,以及当前是否打开一些一个事务处理。调用SQLAllocConnect 函 数 获 取 连 接 句 柄。例如:

     ret = SQLAllocHandle(SQL_HANDLE_DBC, oraclehenv, &oraclehdbc);

    Ø  建立数据源

    使用已分配的连接句柄来建立应用程序和数据源/数据库系统的连接,进行句柄和数据源的绑定。绑定也由目标数据源的ODBC驱动程序完成。

    如:ret = SQLConnect(oraclehdbc,                                                    

    "conn",SQL_NTS, //ODBCDNS名称

    "scott",SQL_NTS, //用户账号

    "123",SQL_NTS);     //密码

    Ø 分配语句句柄

       用户对DBC数据源的存取操作,都是通过SQL语句实现的。在这个过程中,应用程序 将通过连接向ODBC数据库提交SQL语句,以完成用户请求的操作。即通过执行SQLAllocHandleSQLAllocStmt来分配语句句柄。调用SQLAllocStmt 函数获取语句句柄。例如:

    SQLstmt= "SELECT * FROM authors"

    rc= SQLAllocStmt(hdbc, hstmt)

    Ø  执行SQL语句

    执行SQL语句。 执行SQL 语 句 的方法比较多, 最简单明了的方法是调用SQLAllocStmt函数,例如:

    SQLstmt= "SELECT * FROM authors"

    rc= SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))

        如果SQL语句被顺利提交并正确执行,那么就会产生一个结果集。检索结果集的方法有很多,最简单最直接的方法是调用SQLFetch SQLGetData 函 数。

    SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;

    SQLGetData函数的功能是提取结果集中当前记录的某个字段值。通常可以采用一个循环以提取结果集中所有记录的所有字段值,该循环重复执行SQLFetchSQLGetData函数,直至SQLFetch函数返回SQL_NO_DATA_FOUND, 这表示已经到达结果集的末尾。

    DimColVal As String * 225

    ColVal= String(255, 0)

    Ø 结束应用程序

    在应用程序完成数据库操作, 退出运行之前,必须释放程序中使用的系统资源。这些系统资源包括:语句句柄、连接句柄和ODBC环境句柄。完成这个过程的如下:

     调用SQLFreeStmt 函数释放语句句柄及其相关的系统资源。例如:

    rc= SQLFreeStmt(hstmt, SQL_DROP)

     调用SQLDisconnect 函数关闭连接。 例 如:

    rc= SQLDisconnect(hdbc)

    调用SQLFreeConnect函数释放连接句柄及其相关的系统资源。例如:

    rc= SQLFreeConnect(hdbc)

    调用SQLFreeEnv函数释放环境句柄及其相关的系统资源,停止ODBC 操作。 例如:

    rc= SQLFreeEnv(henv)

    7)错 误 处 理

    所有DBCAPI函 数, 若在执行期间发生错误, 都将返回一个标准错误代码SQL_ERROR

    一般来讲,在每次调用ODBC API 函 数 之 后, 都应该检查该函数返回值,确定该函数是否成功地执行,再决定是否继续后续过程。 而详细的错误信息,可以调用SQLError 函数获得。SQLError 函数将返回下列信息: 标准的ODBC错误状态码 ODBC 数据源提供的内部错误编码错误信息串

    四、开发环境的配置

    1.创建Oracle ODBC数据源

    对于WIN 7系统来说,打开控制面板,找到ODBC,具体位置如下图所示,如果没有找到,可以在右上角搜索栏里面输入ODBC,就可以找到了。

    对于WIN XP系统来说,打开控制面板,找到管理工具,找到数据源(ODBC),显示ODBC数据源管理器对话框。对话框如下图所示。

    2.设置和配置一个系统DSN,单击“系统DSN标签”,选择“添加”。

     


     


     

    3.找到需要配置的数据源,单击完成,弹出如下对话框,

     

    4.输入数据源的名称,一个简单的描述,用户名和网络连接名。点击确认。

     

     

     

    五、学生表创建

    1.首先创建stu

    create table stu(

    sno char(11) ,

    sname varchar2(10),

    sex char(2),

    sage number,

    sdepart varchar2(30)

    );

     

     

     

     

     

    六、数据类型

     

     



     

     

    七、参考资料

    数据库系统概论 第四版 王珊 萨师煊 高等教育出版社

    电子资料链接:http://pan.baidu.com/s/1su9c5


    ODBC程序

    开发工具vs2017

    <database.h>

    #pragma once
    
    #ifndef _DATABASE_H
    #define _DATABASE_H
    #include <sql.h>
    #include<sqlext.h>
    #include<sqltypes.h>
    typedef struct {
    	SQLHENV oraclehenv;						//环境句柄
    	SQLHDBC oraclehdbc;						//连接句柄
    	SQLHSTMT oraclehsmt;					//语句句柄
    	SQLRETURN ret;							//结果集
    }DATABASE;
    
    
    DATABASE getConnection();					//获取连接
    void init(DATABASE *d);						//初始化
    void freeConnection(DATABASE d);			//释放连接资源
    
    
    #endif // !_DATABASE_H
    

    <student.h>

    #pragma once
    #include "DATABASE.h"
    
    #ifndef _STUDENT_H
    #define _STUDENT_H
    #include <sql.h>
    #include<sqlext.h>
    #include<sqltypes.h>
    
    #define sno_length 11
    #define sname_length 10
    #define sdepart_length 30
    #define ssex_length 5
    
    typedef struct {
    	SQLCHAR sno[sno_length], sname[sname_length], sdepart[sdepart_length], ssex[ssex_length];
    	SQLSMALLINT sage;
    	SQLINTEGER cbsno, cbsname, cbdepart, cbsage, cbsex;
    }STUDENT;
    
    SQLCHAR *get(SQLCHAR *p, char *s);		//将char数组转换SQLCHAR类型
    void processSQL(SQLCHAR *sql, SQLHSTMT oraclehsmt);
    void display(DATABASE d);
    void getStu(char *sno, SQLHSTMT oraclehsmt);
    int insert(STUDENT, DATABASE);
    void deleteStu(char *sno, DATABASE d);
    SQLRETURN  updateStu(STUDENT s, DATABASE d);
    STUDENT inputStu();
    void error(SQLRETURN err, int n);
    
    #endif // !_DATABASE_H

    <getConnection.cpp>

    #include"DATABASE.h"
    #include <sql.h>
    #include<sqlext.h>
    #include<sqltypes.h>
    #include<stdlib.h>
    #include <stdio.h>
    #include<windows.h>
    #include<string.h>
    DATABASE getConnection() {
    	DATABASE d;
    	/****分配环境句柄********/
    	d.ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &d.oraclehenv);
    	d.ret = SQLSetEnvAttr(d.oraclehenv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
    	/********建立连接*********/
    	d.ret = SQLAllocHandle(SQL_HANDLE_DBC, d.oraclehenv, &d.oraclehdbc);
    	d.ret = SQLConnect(d.oraclehdbc, (SQLCHAR *)"con", SQL_NTS, (SQLCHAR *)"HR", SQL_NTS, (SQLCHAR *)"oracle", SQL_NTS);
    	if (SQL_SUCCEEDED(d.ret))
    	{
    		puts("Connect Sucess!");
    		init(&d);
    	}
    	else
    	{
    		//连接失败时返回错误值
    		puts("Conect Fail!");
    	}
    	return d;
    }
    
    void init(DATABASE *d)
    {
    	/***初始化句柄*/
    	SQLEndTran(SQL_HANDLE_DBC, d->oraclehdbc, SQL_COMMIT);						//提交事务
    	d->ret = SQLAllocHandle(SQL_HANDLE_STMT, d->oraclehdbc, &d->oraclehsmt);			//初始化语句句柄
    	d->ret = SQLSetStmtAttr(d->oraclehsmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)SQL_BIND_BY_COLUMN, SQL_IS_INTEGER);//设置语句选项
    }
    
    
    void freeConnection(DATABASE d)
    {
    	SQLEndTran(SQL_HANDLE_DBC, d.oraclehdbc, SQL_COMMIT);				//提交事务
    	SQLFreeHandle(SQL_HANDLE_STMT, d.oraclehsmt);
    	SQLDisconnect(d.oraclehdbc);
    	SQLFreeHandle(SQL_HANDLE_DBC, d.oraclehdbc);
    	SQLFreeHandle(SQL_HANDLE_ENV, d.oraclehenv);
    	printf("释放连接\n\n");
    }

    <operateStudent.cpp>

    #include "DATABASE.h"
    #include "STUDENT.h"
    #include <sql.h>
    #include<sqlext.h>
    #include<sqltypes.h>
    #include<stdlib.h>
    #include <stdio.h>
    
    
    void processSQL(SQLCHAR *sql, SQLHSTMT oraclehsmt)
    {
    	STUDENT s;
    	int count = 1;
    	s.cbsno = SQL_NTS;
    	s.cbsname = SQL_NTS;
    	s.cbdepart = SQL_NTS;
    	s.cbsage = 0;
    	s.cbsex = SQL_NTS;
    	SQLRETURN ret = SQLExecDirect(oraclehsmt, sql, SQL_NTS);
    	if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    	{
    		ret = SQLBindCol(oraclehsmt, 1, SQL_C_CHAR, s.sno, sno_length, &s.cbsno);
    		ret = SQLBindCol(oraclehsmt, 2, SQL_C_CHAR, s.sname, sname_length, &s.cbsname);
    		ret = SQLBindCol(oraclehsmt, 3, SQL_C_CHAR, s.ssex, ssex_length, &s.cbsex);
    		ret = SQLBindCol(oraclehsmt, 4, SQL_C_LONG, &s.sage, 0, &s.cbsage);
    		ret = SQLBindCol(oraclehsmt, 5, SQL_C_CHAR, s.sdepart, sdepart_length, &s.cbdepart);
    	}
    	/***处理结果**/
    	while ((ret = SQLFetch(oraclehsmt)) != SQL_NO_DATA_FOUND )
    	{
    		if (ret == SQL_ERROR)
    		{
    			printf("erro!\n");
    		}
    		else
    		{
    			printf("\t%-3d    %s   %s   %s  %4d  %s\n", ++count, s.sno, s.sname, s.ssex, s.sage, s.sdepart);
    		}
    	}
    }
    
    void display(DATABASE d)
    {
    	SQLCHAR *sql = (SQLCHAR *)"select * from stu";
    	processSQL(sql, d.oraclehsmt);
    }
    /*****插入********/
    int insert(STUDENT s, DATABASE d)
    {
    	char str[100] = "insert into stu values(";
    	
    	char *age = (char *)malloc(sizeof(s.sage) + 1);
    	_itoa_s((int)s.sage, age, 10, 10);
    
    	strcat_s(str, sizeof(str), "'");
    	strcat_s(str, sizeof(str), (char *)s.sno);
    	strcat_s(str, sizeof(str), "',");
    
    	strcat_s(str, sizeof(str), "'");
    	strcat_s(str, sizeof(str), (char *)s.sname);
    	strcat_s(str, sizeof(str), "',");
    
    	strcat_s(str, sizeof(str), "'");
    	strcat_s(str, sizeof(str), (char*)s.ssex);
    	strcat_s(str, sizeof(str), "',");
    
    	strcat_s(str, sizeof(str), "'");
    	strcat_s(str, sizeof(str), age);
    	strcat_s(str, sizeof(str), "',");
    
    	strcat_s(str, sizeof(str), "'");
    	strcat_s(str, sizeof(str), (char *)s.sdepart);
    	strcat_s(str, sizeof(str), "')");
    
    	d.ret = SQLExecDirect(d.oraclehsmt, (SQLCHAR *)str, SQL_NTS);
    	error(d.ret, 77);
    	return 0;
    
    }
    
    
    SQLCHAR *get(SQLCHAR *p, char *s)
    {
    	if ((s == NULL) || (p == NULL))
    	{
    		return NULL;
    	}
    	SQLCHAR *r = p;
    	while ((*r++ = *s++) != '\0');
    	return p;
    }
    
    void getStu(char *sno, SQLHSTMT oraclehsmt)
    {
    	SQLCHAR *sql;
    	char str[100] = "select * from stu where sno = \'";
    	strcat_s(str, sizeof(str), sno);
    	strcat_s(str, sizeof(str), "'");
    	sql = (SQLCHAR *)str;
    	printf("getStu()函数\n");
    	getchar();
    	processSQL(sql, oraclehsmt);
    }
    
    void deleteStu(char *sno, DATABASE d)
    {
    	SQLCHAR *sql = NULL;
    	char str[100] = "delete from stu where sno = \'";
    	strcat_s(str, sizeof(str), sno);
    	strcat_s(str, sizeof(str), "'");
    	sql = (SQLCHAR *)str;
    	d.ret = SQLExecDirect(d.oraclehsmt, sql, SQL_NTS);
    	error(d.ret, 114);
    }
    
    SQLRETURN updateStu(STUDENT s, DATABASE d)
    {
    	SQLRETURN ret;
    	SQLCHAR *sql = NULL;
    	char str[100] = "update stu set ";
    	char *age = (char *)malloc(sizeof(s.sage) + 1);
    	_itoa_s((int)s.sage, age, 10, 10);
    	strcat_s(str, sizeof(str), "sname = \'");
    	strcat_s(str, sizeof(str), (char *)s.sname);
    	strcat_s(str, sizeof(str), "', ");
    
    	strcat_s(str, sizeof(str), "sex = \'");
    	strcat_s(str, sizeof(str), (char *)s.ssex);
    	strcat_s(str, sizeof(str), "', ");
    
    	strcat_s(str, sizeof(str), "sage = \'");
    	strcat_s(str, sizeof(str), age);
    	strcat_s(str, sizeof(str), "', ");
    
    	strcat_s(str, sizeof(str), "sdepart = \'");
    	strcat_s(str, sizeof(str), (char *)s.sdepart);
    	strcat_s(str, sizeof(str), "' ");
    
    	strcat_s(str, sizeof(str), "where sno =  \'");
    	strcat_s(str, sizeof(str), (char *)s.sno);
    	strcat_s(str, sizeof(str), "'");
    	for (int i = 0; i < sizeof(str); i++)
    	{
    		printf("%c", str[i]);
    	}
    	printf("\n");
    	sql = (SQLCHAR *)str;
    	ret = SQLExecDirect(d.oraclehsmt, sql, SQL_NTS);
    	error(ret, 150);
    	return ret;
    }
    
    
    STUDENT inputStu()
    {
    	STUDENT s;
    	char sno[sno_length], sname[sname_length], ssex[ssex_length], sdepart[sdepart_length], ssage[5];
    	int sage;
    	fflush(stdin);
    	printf("请输入一个学号:");
    	gets_s(sno, sizeof(sno));
    	printf("\n请输入一个姓名:");
    	gets_s(sname, sizeof(sname));
    	printf("\n请输入一个性别:");
    	gets_s(ssex, sizeof(ssex));
    	printf("\n请输入一个年龄:");
    	sage = atoi(gets_s(ssage));
    	printf("\n请输入一个部门:");
    	gets_s(sdepart, sizeof(sdepart));
    	get(s.sno, sno);
    	get(s.sname, sname);
    	get(s.ssex, ssex);
    	s.sage = sage;
    	get(s.sdepart, sdepart);
    	return s;
    }
    
    void error(SQLRETURN err, int n) {
    	printf("%d ", n);
    	switch (err) {
    	case	SQL_SUCCESS:puts("****SQL_SUCCESS*****"); break;
    	case	SQL_SUCCESS_WITH_INFO:puts("SQL_SUCCESS_WITH_INFO"); break;
    	case	SQL_ERROR:puts("SQL_ERROR"); break;
    	case	SQL_INVALID_HANDLE:puts("SQL_INVALID_HANDLE"); break;
    	case	SQL_NO_DATA_FOUND:puts("SQL_NO_DATA_FOUND"); break;
    	case	SQL_NEED_DATA:puts("SQL_NEED_DATA"); break;
    	default:puts("err");
    	}
    }

    <Test.cpp>

    #include "STUDENT.h"
    #include "DATABASE.h"
    #include <sql.h>
    #include<sqlext.h>
    #include<sqltypes.h>
    #include<stdlib.h>
    #include <stdio.h>
    #include<windows.h>
    #include<string.h>
    
    char menu()
    {
    	char choice;
    	printf("\t a.查询4所有人的信息\n");
    	printf("\t s.查询个人信息指定学号\n");
    	printf("\t i.插入\n");
    	printf("\t d.删除\n");
    	printf("\t u.修改\n");
    	printf("\t q.退出\n");
    	printf("\n **********************\n \t请输入你的选项:");
    	choice = getchar();
    	return choice;
    
    }
    
    void deal(char choice, DATABASE d)
    {
    	getchar();
    	switch (choice)
    	{
    		init(&d);
    		case 'a':display(d);break;
    		case 's': {
    			char sno[10];
    			fflush(stdin);
    			printf("\n请输入学号:");
    			gets_s(sno);
    			printf("sno = %s\n", sno);
    			getStu(sno, d.oraclehsmt); break;
    		}
    		case 'i': {
    			STUDENT s = inputStu();
    			insert(s, d);break;
    		}
    		case 'd': {
    			char sno[10];
    			printf("请输入学号:");
    			gets_s(sno);
    			deleteStu(sno, d); break;
    		}
    		case 'u': {
    			STUDENT s = inputStu();
    			updateStu(s, d);break;
    		}
    		case 'q': freeConnection(d); exit(0);
    		default:printf("输入错误,请从新输入\n"); break;
    	}
    		printf("\n\t***************处理结束******************\n");
    }
    
    
    int main()
    {	
    	DATABASE database = getConnection();
    	do
    	{
    		char c;
    		c = menu();
    		deal(c,database);
    		getchar();
    		system("cls");
    	} while (true); 
    
    	return 0;
    }
    
    
    


    <sql>

    drop table stu;
    create table stu(
           sno char(10),
           sname varchar2(10),
           sex char(5),
           sage number,
           sdepart varchar2(30),
           primary key(sno)
    );
    
    insert into stu values('201500730','张三','男',20,'计算机系' );
    insert into stu values('201500731','李四','男',20,'计算机系' );
    insert into stu values('201500732','王五','男',20,'计算机系' );
    insert into stu values('201500733','赵六','男',20,'计算机系' );
    commit;
    
    select * from stu;
    
    


    展开全文
  • FreeSwitch配置ODBC

    万次阅读 2020-04-03 13:59:05
    环境:CentOS Linux release 7.7 ...yum install -y unixODBC unixODBC-devel mysql-connector-odbc 配置ODBC 数据源 编辑/etc/odbc.ini PASSWORD —— 这里使用的密码为空值,可以根据自己...
  • Clickhouse ODBC

    2020-06-16 15:24:06
    参考: https://www.altinity.com/blog/2018/9/20/using-odbc-with-clickhouse
  • ODBC连接MySQL

    万次阅读 多人点赞 2018-05-12 22:54:35
    C++使用ODBC连接MySQL
  • mysql和odbc驱动

    2018-11-23 10:41:20
    mysql-5.5.36-win32、mysql-5.7.22-win32、mysql-connector-odbc-5.1.5-win32、mysql-connector-odbc-5.2.7-win32、mysql-connector-odbc-5.2.7-winx64、mysql-connector-odbc-5.3.9-win32、mysql-connector-odbc-...
  • Oracle ODBC driver

    千次下载 热门讨论 2008-12-19 07:51:52
    NOTE: The following ODBC Drivers are ODBC Version 3.52, Level 2 compatible drivers. Oracle ODBC Drivers for Oracle 10.2 Version Date Download Size Bullet 10.2.0.3.0 12-Dec-2006 ORA10203....
  • SQL Server ODBC 驱动

    2018-03-28 17:34:11
    在安装ODBC驱动后,能通过ODBC访问SQL Server 数据库。
  • ODBC介绍

    2017-01-03 23:28:02
    Tableau 和 ODBC ODBC 代表 Open Database Connectivity(开放式数据库连接),是允许各种软件访问数据的行业标准。ODBC 的基本前提是 SQL 查询的标准语法,软件应用程序使用该语法连接到数据库并从数据库请求数据...
  • Kylin ODBC安装

    千次阅读 2018-06-23 11:57:52
    1 Kylin ODBC安装 参考网址:http://kylin.apache.org/docs15/tutorial/odbc.html Kylin提供了ODBC驱动,用以兼容ODBC的客户端应用能够访问数据。 32bit 和 64bit的驱动都提供了。 在Windows7,windows Server...
  • ODBC连接类函数odbc_connect函数:打开一个ODBC连接odbc_close函数:关闭一个已经打开的ODBC连接odbc_close_all函数:关闭所有已经打开的ODBC连接odbc_pconnect函数:打开一个持续有效的ODBC连接ODBC操作类函数odbc_...
  • mysql odbc

    2017-01-09 14:17:30
    window下配置mysql odbc下载安装...选择相应的版本,32位 or 64位配置odbc开始--->运行 输入以下命令中的一个打开odb配置窗口。下载安装的驱动是32位的:c:\Windows\SysWoW64\Odbcad32.exe 下载安装的驱动是64位的
  • MySQL ODBC Connector/ODBC 5.1.8

    千次阅读 2011-02-26 16:53:00
    MySQL ODBC Connector/ODBC 5.1.8
  • DB2数据库odbc驱动

    千次下载 热门讨论 2012-02-25 18:22:10
    DB2数据库的odbc驱动,安装后即可通过odbc配置连接db2数据库
  • MYSQL5.1 ODBC驱动程序64位

    千次下载 热门讨论 2013-04-10 16:53:28
    MYSQL5.1 ODBC驱动程序64位
  • ODBC连接类函数odbc_connect函数:打开一个ODBC连接odbc_close函数:关闭一个已经打开的ODBC连接odbc_close_all函数:关闭所有已经打开的ODBC连接odbc_pconnect函数:打开一个持续有效的ODBC连接ODBC操作类函数odbc_...
  • ODBC连接类函数odbc_connect函数:打开一个ODBC连接odbc_close函数:关闭一个已经打开的ODBC连接odbc_close_all函数:关闭所有已经打开的ODBC连接odbc_pconnect函数:打开一个持续有效的ODBC连接ODBC操作类函数odbc_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,237
精华内容 13,694
热门标签
关键字:

odbc