




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用visual c+开发数据库应用程序1、 概述1、1 visual c+开发数据库技术的特点visual c+提供了多种多样的数据库访问技术odbc api、mfc odbc、dao、ole db、ado等。这些技术各有自己的特点,它们提供了简单、灵活、访问速度快、可扩展性好的开发技术。1. 简单性 visual c+中提供了mfc类库、atl模板类以及appwizard、classwizard等一系列的wizard工具用于帮助用户快速的建立自己的应用程序,大大简化了应用程序的设计。使用这些技术,可以使开发者编写很少的代码或不需编写代码就可以开发一个数据库应用程序。2. 灵活性 visual c+提供的开发环境可以使开发者根据自己的需要设计应用程序的界面和功能,而且,visual c+提供了丰富的类库和方法,可以使开发者根据自己的应用特点进行选择。3. 访问速度快 为了解决odbc开发的数据库应用程序访问数据库的速度慢的问题,visual c+提供了新的访问技术ole db和ado,ole db和ado都是基于com接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,这大大提供了访问速度。4. 可扩展性 visual c+提供了ole技术和activex技术,这种技术可以增强应用程序的能力。使用ole技术和activex技术可以使开发者利用visual c+中提供的各种组件、控件以及第三方开发者提供的组件来创建自己的程序,从而实现应用程序的组件化。使用这种技术可以使应用程序具有良好的可扩展性。5. 访问不同种类数据源 传统的odbc技术只能访问关系型数据库,在visual c+中,提供了ole db访问技术,不仅可以访问关系型数据库,还可以访问非关系型数据库。1、2 visual c+开发数据库技术visual c+提供了多种访问数据库的技术,如下所示:1. odbc(open database connectivity) 2. mfc odbc(microsoft foundation classes odbc) 3. dao (data access object) 4. ole db(object link and embedding database) 5. ado(activex data object) 这些技术各有自己的特点,总结如下:1. odbc odbc是客户应用程序访问关系数据库时提供的一个统一的接口,对于不同的数据库,odbc提供了一套统一的api,使应用程序可以应用所提供的api来访问任何提供了odbc驱动程序的数据库。而且,odbc已经成为一种标准,所以,目前所有的关系数据库都提供了odbc驱动程序,这使odbc的应用非常广泛,基本上可用于所有的关系数据库。但由于odbc只能用于关系数据库,使得利用odbc很难访问对象数据库及其它非关系数据库。由于odbc是一种底层的访问技术,因些,odbc api可以使客户应用程序能够从底层设置和控制数据库,完成一些高层数据库技术无法完成的功能。2. mfc odbc 由于直接使用odbc api编写应用程序要编制大量代码,在visual c+中提供了mfc odbc类,封装了odbc api,这使得利用mfc来创建odbc的应用程序非常简便。3. dao dao提供了一种通过程序代码创建和操纵数据库的机制。多个dao构成一个体系结构,在这个结构中,各个dao对象协同工作。mfc dao是微软提供的用于访问microsoft jet数据库文件(*.mdb)的强有力的数据库开发工具,它通过dao的封装,向程序员提供了dao丰富的操作数据库手段。4. ole db ole db是visual c+开发数据库应用中提供的新技术,它基于com接口。因此,ole db对所有的文件系统包括关系数据库和非关系数据库都提供了统一的接口。这些特性使得ole db技术比传统的数据库访问技术更加优越。与odbc技术相似,ole db属于数据库访问技术中的底层接口。直接使用ole db来设计数据库应用程序需要大量的代码。在vc中提供了atl模板,用于设计ole db数据应用程序和数据提供程序。5. ado ado技术是基于ole db的访问接口,它继承了ole db技术的优点,并且,ado对ole db的接口作了封装,定义了ado对象,使程序开发得到简化,ado技术属于数据库访问的高层接口。2、 使用odbc apimicrosoft 开放数据库互连(odbc,open database connectivity)是microsoft windows 开放服务体系(wosa)的一部分,是一个数据库访问的标准接口。使用这一标准接口,我们可以不关心具体的数据库管理系统(dbms)的细节,而只要有相应类型数据库的odbc驱动程序,就可以实现对数据库的访问。odbc编程接口为我们提供了极大的灵活性,我们可以通过这一个接口访问不同种类的数据库。而且,通过相应的odbc驱动程序,我们可以方便地实现不同数据类型之间的转换。21 odbc api 概述odbc是一个应用广泛的数据库访问应用编程接口(api),使用标准的sql(结构化查询语言)作为其数据库访问语言。211体系结构odbc的结构是建立在客户机服务器体系结构之上,它包含如下四个部分:应用程序(application ):应用程序即用户的应用,它负责用户与用户接口之间的交互操作,以及调用odbc函数以给出sql请求并提取结果以及进行错误处理。odbc驱动程序管理器(driver manager):odbc驱动程序管理器为应用程序加载和调用驱动程序,它可以同时管理多个应用程序和多个驱动程序。它的功能是通过间接调用函数和使用动态链接库(dll)来实现的,因此它一般包含在扩展名为”dll”的文件中。odbc驱动程序(driver)odbc 驱动程序执行odbc函数调用,呈送 sql 请求给指定的数据源,并将结果返回给应用程序。驱动程序也负责与任何访问数据源的必要软件层进行交互作用,这种层包括与底层网络或文件系统接口的软件。数据源数据源由数据集和与其相关联的环境组成,包括操作系统、dbms 和网络(如果存在的话)。odbc 通过引入“数据源”的概念解决了网络拓扑结构和主机的大范围差异问题,这样,用户看到的是数据源的名称而不必关心其它东西。212数据类型odbc使用两类数据类型:sql数据类型和c数据类型。sql数据类型用于数据源,c数据类型用于应用程序代码中。213句柄odbc api 实现数据库操作的手段是语句,这是一个强有力的手段。odbc语句除了能执行sql语句和完成查询操作之外,还能实现大多数数据库操作。在odbc中,使用不同的句柄(handle)来标志环境(environment)、连接(connection)、语句(statement)、描述器(descriptor)等。句柄就是一个应用程序变量,系统用它来存储关于应用程序的上下文信息和应用程序所用到的一些对象。它和 windows 编程中的概念类似,不过odbc 更加完善了句柄的作用。1、 环境句柄是 odbc 中整个上下文的句柄,使用 odbc 的每个程序从创建环境句柄开始,以释放环境句柄结束。所有其它的句柄(这一应用程序所有的联接句柄和语句句柄)都由环境句柄中的上下文来管理。环境句柄在每个应用程序中只能创建一个。2、联接句柄管理有关联接的所有信息。联接句柄可以分配多个,这不仅合法而且很有用;但不要生成不必要的句柄以免资源的浪费。但是,不同的驱动程序支持的联接情况有所不同,有的驱动程序在一个应用程序中仅支持一个联接句柄,有的驱动程序仅支持一个语句句柄。在应用程序中,可以在任何适当的时候联接或脱离数据源,但不要轻易地建立或脱离联接。3、语句句柄是 odbc api 真正发挥重要作用的,它被用来处理 sql 语句及目录函数,每个语句句柄只与一个联接有关。当驱动程序接收一个来自应用程序的函数调用指令而该指令包含一个语句句柄时,驱动程序管理器将使用存储在语句句柄中的联接句柄来将这一函数调用发送给合适的驱动程序。4、描述器句柄是元数据的集合,这些元数据描述了sql语句的参数、记录集的列等信息。当有语句被分配内存之后,描述器自动生成,称为自动分配描述器。在程序中,应用程序也可调用sqlallochandle分配描述器。当应用程序调用api函数sqlallochandle时,驱动管理器或者odbc驱动程序将为所声明的句柄类型分配内部结构,返回句柄值。214异常处理为了在程序开发过程中调试程序,发现程序错误,odbc api通过两种方式返回有关odbc api函数执行的的信息:返回码和诊断记录。返回码返回函数执行的返回值,说明函数执行成功与否。诊断记录说明函数执行的详细信息。1. 返回码(return code) 每一个odbc api函数都返回一个代码返回码,指示函数执行的成功与否。如果函数调用成功,返回码为sql_success或sql_success_with_info。sql_success指示可通过诊断记录获取有关操作的详细信息,sql_success_with_info指示应用程序执行结果带有警告信息,可通过诊断记录获取详细的信息。如果函数调用失败,返回码为sql_error。下面的一段代码根据函数sqlfetch()执行的返回码,判断函数执行的成功与否,从而据此进行相应的处理。sqlreturn rtcode;sqlhstmt hstmt;while(rtcode=sqlfetch(hstmt)!=sql_no_data)if(rtcode=sql_success_with_info)/显示警告信息else/显示出错信息break;/函数调用成功,进行处理如果程序执行错误,返回码为sql_invalid_handle,程序无法执行,而其它的返回码都带有程序执行的信息。2. 诊断记录(diagnostic records) 每个odbc api函数都能够产生一系列的反映操作信息的诊断记录。这些诊断记录放在相关连的odbc句柄中,直到下一个使用同一个句柄的函数调用,该诊断记录一直存在。诊断记录的大小没有限制。诊断记录有两类:头记录(head record)和状态记录(status record)。头记录是第一版权法记录(record 0),后面的记录为状态记录。诊断记录有许多的域组成,这些域在头记录和状态记录中是不同的。可以用sqlgetdiagfield函数获取诊断记录中的特定的域,另外,可以使用sqlgetdiagrec()获取诊断记录中一些常用的域,如sqlstate、原始错误号等。1. 头记录 头记录的各个域中包含了一个函数执行的通用信息,无论函数执行成功与否,只要不返回sql_invalid_handle,都会生成头记录。2. 状态记录 状态记录中的每个域包含了驱动管理器、odbc驱动程序或数据源返回的特定的错误或警告信息,包括sqlstate、原始错误码、诊断信息、列号和行号等。只有函数执行返回sql_error,sql_still_exeuting、sql_success_with_info、sql_need_data或sql_no_data时,才会生成诊断记录。3. 使用sqlgetdiagrec和sqlgetdiagfield 应用程序可以调用函数sqlgetdiagrec或sqlgetdiagfield获取诊断信息。对于给定的句柄,这两个函数返回最近使用该句柄的函数的诊断信息。当有使用该句柄的函数执行时,句柄记录所记录的原有的诊断信息被覆盖。如果函数执行后产生多个状态记录,程序必须多次调用这两个函数以获取信息。22 应用odbc api建立应用程序虽然直接应用odbc api编制应用程序相对来说较为繁琐,但是,由于直接使用odbc api编写的程序相对要简洁、高效。所以,我们有必要学习直接使用odbc api编程。一般地,编写odbc程序主要有以下几个步骤:1. 分配odbc环境 2. 分配连接句柄 3. 连接数据源 4. 构造和执行sql语句 5. 取得执行结果 6. 断开同数据源的连接 7. 释放odbc环境 221 分配odbc环境对于任何odbc应用程序来说,第一步的工作是装载驱动程序管理器,然后初始化odbc环境,分配环境句柄。首先,程序中声明一个sqlhenv类型的变量,然后调用函数sqlallochandle,向其中传递分配的上述sqlhenv类型的变量地址和sql_handle_env选项。如下代码所示:sqlhenv henv;sqlallochandle(sql_handle_env,sql_null_handle,&henv);执行该调用语句后,驱动程序分配一个结构,该结构中存放环境信息,然后返回对应于该环境的环境句柄。222分配连接句柄分配环境句柄后,在建立至数据源的连接之前,我们必须分配一个连接句柄,每一个到数据源的连接对应于一个连接句柄。首先,程序定义了一个sqlhdbc类型的变量,用于存放连接句柄,然后调用sqlallochandle函数分配句柄。如下代码所示:sqlhdbc hdbc;sqlallochandle(sql_handle_dbc,henv,&hdbc);henv为环境句柄。223 连接数据源当连接句柄分配完成后,我们可以设置连接属性,所有的连接属性都有缺省值,但是我们可以通过调用函数sqlsetconnectattr()来设置连接属性。用函数sqlgetconnectattr()获取这些连接属性。函数格式如下:sqlreturn sqlsetconnectattr(sqlhdbc connectionhandle,sqlinteger attribute,sqlpointer valueptr,sqlinteger stringlength);sqlreturn sqlgetconnectattr(sqlhdbc connectionhandle,sqlinteger attribute,sqlpointer valueptr,sqlinteger stringlength);应用程序可以根据自己的需要设置不同的连接属性。完成对连接属性的设置之后,就可以建立到数据源的连接了。对于不同的程序和用户接口,可以用不同的函数建立连接:sqlconnect、sqldriverconnect、sqlbrowseconnect。sqlconnect该函数提供了最为直接的程序控制方式,我们只要提供数据源名称、用户id和口令,就可以进行连接了。函数格式:sqlreturn sqlconnect(sqlhdbc connectionhandle,sqlchar servername,sqlsmallint namelength1,sqlchar username,sqlsmallint namelength2,sqlchar *authentication,sqlsmallint namelength3);参数:connectionhandle 连接句柄servername 数据源名称namelength1 数据源名称长度username 用户idnamelength2 用户id长度authentication 用户口令namelength3 用户口令长度返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。下面的代码演示了如何使用odbc api的sqlconnect函数建立同数据源sqlserver的连接。#include “sqlext.h”sqlhenv henv;sqlhdbc hdbc;sqlhstmt hstmt;sqlreturn retcode;/*allocate environment handle */retcode = sqlallochandle(sql_handle_env, sql_null_handle, &henv); if (retcode = sql_success | retcode = sql_success_with_info) /* set the odbc version environment attribute */retcode = sqlsetenvattr(henv, sql_attr_odbc_version, (void*)sql_ov_odbc3, 0); if (retcode = sql_success | retcode = sql_success_with_info) /* allocate connection handle */retcode = sqlallochandle(sql_handle_dbc, henv, &hdbc); if (retcode = sql_success | retcode = sql_success_with_info) /* set login timeout to 5 seconds. */sqlsetconnectattr(hdbc, (void*)sql_login_timeout, 5, 0);/* connect to data source */retcode = sqlconnect(hdbc, (sqlchar*) sales, sql_nts,(sqlchar*) johns, sql_nts,(sqlchar*) sesame, sql_nts);if (retcode = sql_success | retcode = sql_success_with_info)/* allocate statement handle */retcode = sqlallochandle(sql_handle_stmt, hdbc, &hstmt); if (retcode = sql_success | retcode = sql_success_with_info) /* process data */;sqlfreehandle(sql_handle_stmt, hstmt);sqldisconnect(hdbc);sqlfreehandle(sql_handle_dbc, hdbc); sqlfreehandle(sql_handle_env, henv);sqldriveconnect函数sqldriveconnect用一个连接字符串建立至数据源的连接。它可以提供比sqlconnect函数的三个参数更多的信息,可以让用户输入必要的连接信息。如果连接建立,该函数返回完整的字符串,应用程序可使用该连接字符串建立另外的连接。函数格式:sqlreturn sqldriverconnect(sqlhdbc connectionhandle,sqlhwnd windowhandle,sqlchar inconnectionstring,sqlsmallint stringlength1,sqlchar outconnetionstring,sqlsmallint bufferlength,sqlsmallint *stringlength2ptr,sqlsmallint drivercompletion);参数:connectionhandle 连接句柄windowhandle 窗口句柄,应用程序可以用父窗口的句柄,或用null指针inconnectionstring 连接字符串长度outconnectionstring 一个指向连接字符中的指针bufferlength 存放连接字符串的缓冲区的长度stringlength2ptr 返回的连接字符串中的字符数drivercompletion 额外连接信息,可能取值有:sql_driver_prompt,sql_driver_complete, sql_driver_complete_required, orsql_driver_noprompt.返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。sqlbrowseconnect函数sqlbrowseconnect支持以一种迭代的方式获取到数据源的连接,直到最后建立连接。它是基于客房机/服务器的体系结构,因此,本地数据库不支持该函数。一般,我们提供部分连接信息,如果足以建立到数据源的连接,则成功建立连接,否则返回sql_need_data,并在outconnectionstring参数中返回所需要的信息。函数格式:sqlreturn sqlbrowseconnect(sqlhdbc connectionhandle,sqlchar* inconnectionstring,sqlsamllint stringlength1,sqlchar* outconnectionstring,sqlsmallint bufferlength,sqlsmallint *stringlength2ptr);参数:connectionhandle 连接句柄inconnectionstring 指向输出字符串的指针stringlength1 输出字符串的指针长度outconnectionstring 指向输出字符串的指针bufferlength 用于存放输出字符串的缓冲区的长度stringlength2ptr 实际返回的字符串的长度返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle.成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。下面的代码讲述了如何使用odbc api的sqlbrowseconnect函数建立同数据源的连接。#define brws_len 100sqlhenv henv;sqlhdbc hdbc;sqlhstmt hstmt;sqlreturn retcode;sqlchar szconnstrinbrws_len, szconnstroutbrws_len;sqlsmallint cbconnstrout;/* allocate the environment handle. */retcode = sqlallochandle(sql_handle_env, sql_null_handle, &henv); if (retcode = sql_success | retcode = sql_success_with_info) /* set the version environment attribute. */retcode = sqlsetenvattr(henv, sql_attr_odbc_version, sql_ov_odbc3, 0);if (retcode = sql_success | retcode = sql_success_with_info) /* allocate the connection handle. */retcode = sqlallochandle(sql_handle_dbc, henv, &hdbc);if (retcode = sql_success | retcode = sql_success_with_info) /* call sqlbrowseconnect until it returns a value other than */* sql_need_data (pass the data source name the first time). */* if sql_need_data is returned, call getuserinput (not */* shown) to build a dialog from the values in szconnstrout. */* the user-supplied values are returned in szconnstrin, */* which is passed in the next call to sqlbrowseconnect. */lstrcpy(szconnstrin, dsn=sales); do retcode = sqlbrowseconnect(hdbc, szconnstrin, sql_nts,szconnstrout, brws_len, &cbconnstrout);if (retcode = sql_need_data)getuserinput(szconnstrout, szconnstrin); while (retcode = sql_need_data);if (retcode = sql_success | retcode = sql_success_with_info)/* allocate the statement handle. */retcode = sqlallochandle(sql_handle_stmt, hdbc, &hstmt);if (retcode = sql_success | retcode = sql_success_with_info) /* process data after successful connection */ .;sqlfreehandle(sql_handle_stmt, hstmt); sqldisconnect(hdbc); sqlfreehandle(sql_handle_dbc, hdbc); sqlfreehandle(sql_handle_env, henv);224 sql操作构造和执行sql语句构造sql语句可以通过三种方式构造sql语句:在程序开发阶段确定、在运行时确定或由用户输入sql语句。在程序开发时确定的sql语句,具有易于实现、且可在程序编码时进行测试的优势。在程序运行时确定sql语句提供了极大灵活性,但给程序高度带来了困难,且需更多的处理时间。由用户输入的sql语句,极大的增强了程序的功能,但是,程序必须提供友好的人机界面,且对用户输入的语句执行一定程序的语法检查,能够报告用户错误。执行sql语句应用程序的绝大部分数据库访问工作都是通过执行sql语句完成的,在执行sql语句之前,必须要先分配一个语句句柄,然后设置相应语句的语句属性,再执行sql语句。当一个语句句柄使用完成后,调用函数sqlfreehandle()释放该句柄。1. sqlexecute() sqlexecute用于执行一个准备好的语然,当语句中有参数时,用当前绑定的参数变量的值。函数格式:sqlreturn sqlexecute(sqlhstmt statementhandle);参数:statementhandle 标识执行sql语句的句柄,可以用sqlallochandle()来获得。返回值:sql_success, sql_success_with_info, sql_need_data, sql_still_executing, sql_error, sql_no_data, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。2. sqlexecdiret() sqlexecdirect直接执行sql语句,对于只执行一次的操作来说,该函数是速度最快的方法。函数格式:sqlreturn sqlexecdirect(sqlhstmt statementhandle,sqlchar *statementtext,sqlinteger textlength);参数:statementhandle 语句句柄statementtext 要执行的sql语然statementtext sql语句的长度。返回值:sql_success, sql_success_with_info, sql_need_data, sql_still_executing, sql_error, sql_no_data, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。3. sqlpripare() 对于需多次执行的sql语句来说,除了使用sqlexecdirect函数之外,我们也可以在执行sql语句之前,先准备sql语句的执行。对于使用参数的语句,这可大提高程序执行速度。函数格式:sqlreturn sqlprepare(sqlhstmt statementhandle,sqlchar* statementtext,sqlinteger textlength);参数:statementhandle 语句句柄statementtext 要执行的sql语然statementtext sql语句的长度。返回值:sql_success, sql_success_with_info, sql_need_data, sql_still_executing, sql_error, sql_no_data, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。使用参数使用参数可以使一条sql语句多次执行,得到不同结果sqlbindparameter函数sqlbindparameter负责为参数定义变量,实现参数值的传递。函数格式如下:sqlreturnsqlbindparameter(sqlhstmt statementhandle,sqlusmallint parameternumber,sqlsmallint inputoutputtype,sqlsmallint valuetype,sqlsmallint parametertype,sqluinteger columnsize,sqlsmallint decimaldigits,sqlpointer parametervalueptr,sqlinteger bufferlength,sqlinteger *strlen_or_indptr);参数:statementhandle 语句句柄parameternumber 绑定的参数在sql语句中的序号,在sql中,所有参数从左到右顺序编号,从1开始。sql语句执行之前,应该为每个参数调用函数sqlbindparameter绑定到某个程序变量。inputoutputtype 参数类型,可为sql_para_input, sql_param_input_output, sql_param_output。parametertype 参数数据类型columnsize 参数大小decimaldigits 参数精度parametervaluteptr 指向程序中存放参数值的缓冲区的指针bufferlength 程序中存放参数值的缓冲区的字节数strlen_or_indptr 指向存放参数parametervalueptr的缓冲区指针返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。执行时传递参数对于某些文本文档或位图文件,要占用大量的存储空间。因此,在数据源传递这些数据时,可以分开传递。有两个函数可完成这个工作。函数格式:sqlreturn sqlputdata(sqlhstmt statementhandle,sqlpointer dataptr,sqlinteger strlen_or_ind);参数:statementhandle 参数句柄dataptr 指向包含实际数据的缓冲区指针。strlen_or_lnd 缓冲区长度返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。函数格式:sqlreturnsqlparamdata(sqlhstmt statementhandle,sqlpointer *valueptrptr);参数:statementhandle 参数句柄valueptrptr 指向缓冲区地址的指针返回值:sql_success, sql_success_with_info, sql_error, or sql_invalid_handle成功返回sql_success,如果返回值为sql_error或sql_success_with_info,可以用函数sqlgetdiagrec获取相应sqlstate的值。 下面的代码展示如何使用这两个函数#define max_data_len 1024sqlinteger cbpartid = 0, cbphotoparam, cbdata;sqluinteger spartid; szphotofile;sqlpointer ptoken, initvalue;sqlchar datamax_data_len;sqlreturn retcode;sqlhstmt hstmt;retcode = sqlprepare(hstmt, insert into pictures (partid, picture) values (?, ?), sql_nts);if (retcode = sql_success | retcode = sql_success_with_info) /* bind the parameters. for parameter 2, pass */* the parameter number in parametervalueptr instead of a buffer */ /* address. */ sqlbindparameter(hstmt, 1, sql_param_input, sql_c_ulong, sql_integer, 0, 0, &spartid, 0, &cbpartid);sqlbindparameter(hstmt, 2, sql_param_input,sql_c_binary, sql_longvarbinary,0, 0, (sqlpointer) 2, 0, &cbphotoparam);/* set values so data for parameter 2 will be */* passed at execution. note that the length parameter in */* the macro sql_len_data_at_exec is 0. this assumes that */* the driver returns n for the sql_need_long_data_len */* information type in sqlgetinfo. */cbphotoparam = sql_len_data_at_exec(0);spartid = getnextid(); /* get next available employee id */* number. */ retcode = sqlexecute(hstmt);/* for data-at-execution parameters, call sqlparamdata to */* get the parameter number set by sqlbindparameter. */* call inituserdata. call getuserdata and sqlputdata */* repeatedly to get and put all data for the parameter. */* call sqlparamdata to finish processing this parameter */while (retcode = sql_need_data) retcode = sqlparamdata(hstmt, &ptoken);if (retcode = sql_need_data) inituserdata(sqlsmallint)ptoken, initvalue);while (getuserdata(initvalue, (sqlsmallint)ptoken, data, &cbdata)sqlputdata(hstmt, data, cbdata); void inituserdata(sparam, initvalue)sqlpointer initvalue;sqlchar szphotofilemax_file_name_len;/* prompt user for bitmap file containing employee */* photo. openphotofile opens the file and returns the */ /* file handle. */promptphotofilename(szphotofile);openphotofile(szphotofile, (file *)initvalue); break; bool getuserdata(initvalue, sparam, data, cbdata)sqlpointer initvalue;sqlchar *data;sqlinteger *cbdata;bool done;/* getnextphotodata returns the next piece of photo */* data and the number of bytes of data returned */* (up to max_data_len). */ done = getnextphotodata(file *)initvalue, data,max_data_len, &cbdata); if (done) closephotofile(file *)initvalue); return (true); return (false); 记录的添加、删除和更新应用程序对数据源的数据更新可以通过三种方式实现:使用相应的sql语句在数据源上执行;调用函数sqlsetpos实现记录集的定义更新;调用函数sqlbulkoperations实现数据的更新。直接在数据源上执行sql语句的方式,可以适用于任何的odbc数据源,但是,对于后两种更新方式,有的数据源并不支持,应用程序可以调用函数sqlgetinfo确定数据源是否支持这两种方式。1. 定位更新和删除 要使用定位更新和删除功能,要按如下顺序:1)取回记录集:2)定位到要进行更新或删除操作的行3)执行更新或删除操作参考如下的代码:#define rows 20#d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《美人鱼》观后感(合集15篇)
- 海洋科技创新实施的具体操作方案
- 供水管网优化升级计划可行性研究报告(模板)
- 新疆乌鲁木齐市六校联考2022-2023学年高二下学期期末英语 含解析
- 河南省开封市五县联考2023-2024学年高二上学期期中考物理含解析
- 甲状腺癌核医学诊疗体系
- 福州大学《计算机网络与通信课程设计》2023-2024学年第二学期期末试卷
- 几何画板制作函数课件
- 上海中华职业技术学院《非织造复合材料》2023-2024学年第二学期期末试卷
- 泉州海洋职业学院《知识产权法经典著作》2023-2024学年第二学期期末试卷
- 2024届高考英语作文复习专项:读后续写“助人为乐”类范文5篇 讲义素材
- 冷库方案报价
- 2024年湖南湘江新区投资集团有限公司招聘笔试参考题库含答案解析
- 浙江省强基联盟2022-2023学年高一5月统测英语试题(解析版)
- 工贸行业高风险领域专项整治清单
- 第九章-食品干燥机械与设备
- 医院行政年度工作总结
- 对校长(园长)任前集中廉政谈话提纲
- 上海旅游介绍英文 课件
- CG造型基础与创作进阶篇
- 纪昌学射的课件
评论
0/150
提交评论