CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

masm中关于odbc数据库

楼主gilbe(xxxaxxx)2003-02-03 20:16:10 在 其他开发语言 / 汇编语言 提问

我已经做了如何用select命令,但是却不知道如何更新数据库和删除、添加数据库,请问用什么函数牙,能不能给出函数和其参数的类型?谢谢  
  还有就是如何用目录(catalog)?主要是我想知道如何动态枚举出任意表单名称  
  100分送上 问题点数:0、回复次数:11Top

1 楼codeproject(快乐的小熊)回复于 2003-02-10 10:32:48 得分 0

用sql   command   !!  
  插入:INSERT   INTO   a   VALUES   (1,23),(2,34),(4,33);  
  删除:DELETE     FROM   a  
              WHERE   ID=1  
               
  更新:UPDATE   a  
          SET   a.Value=12  
          WHERE   a.ID=2  
       
  Top

2 楼Purpleendurer(编程—>任是无情也动人^_^)回复于 2003-02-10 16:48:57 得分 0

masm   +   odbc   ????????  
   
  关注.....Top

3 楼gilbe(xxxaxxx)回复于 2003-02-13 21:07:22 得分 0

up者同样有分Top

4 楼vcshcn(黑天的猩猩)回复于 2003-02-14 00:08:57 得分 0

不知道,是不是要调dll呀Top

5 楼Purpleendurer(编程—>任是无情也动人^_^)回复于 2003-02-14 17:22:18 得分 0

I   don't   know!  
   
  UP....Top

6 楼LeLeGhost(禅师)回复于 2003-02-14 17:53:12 得分 0

希望对你有帮助   :-^  
   
  摘自[Iczelion's   Win32   Assembly   Homepage]  
  -----------------------------------------------------------  
   
  准备与使用语句  
  继续我们的学习,在这一章,我们来看看如何通过ODBC来操作数据源.  
   
  在上一章,我们已学习了第一步,怎样连接一个数据源。一个连接定义了用户与数据源的数据通道.它是静态的.如果要想操作数据源,我们就必须使用语句(statement).可以认为语句就是发给数据源的命令.这个"命令"必须用SQL写成.通过使用语句,我们就可以修改数据源的结构、在其中执行查询、修改及删除数据.  
   
  准备及使用语句可分为以下几个步骤:  
   
  分配一个语句句柄(statement   handle)    
  创建SQL语句    
  执行语句    
  销毁语句    
  分配一个语句句柄  
  可以通过调用函数   SQLAllocHandle来分配一个语句句柄。例子如下:  
   
  .data?  
  hStmt   dd   ?  
   
  .code  
  ......  
  invoke   SQLAllocHandle,   SQL_HANDLE_STMT,   hConn,   addr   hStmt  
   
  创建SQL语句  
  这部分你就得靠自己了你必须知道SQL的语法.比如说,当你想创建一个表时,你就得知道CREATE   TABLE语句.    
   
  执行语句  
  执行语句有四种方法,由它们是否被数据库引擎编译过(准备好)及被怎样定义有关.  
   
  直接执行(Direct   Execution)   由用户程序定义SQL语句.语句在运行时(runtime)被编译并执行.    
  编译执行(Prepared   Execution)   也是由用户程序定义SQL语句,但编译和执行被分为两步:首先SQL被准备好(被编译),接下来被执行.通过这种方法,我们可以只编译SQL语句一次但执行相同的语句多次以节省时间.    
  存储过程(Procedures)   SQL语句被编译并存放在数据源内,用户程序可以在运行时调用这些语句.    
  目录(Catalog)   SQL被硬编码(hardcoded)在ODBC驱动程序内.   目录函数的目的是返回预定义的结果集例如数据库中的所有表名.   总的来说,目录函数用来获得数据源的信息的用户程序可以在运行时调用它们.    
   
  这四种方法各有优缺点.当你只运行某一SQL语句一次时,直接执行是一个很好的选择;如果你要经常运行某一语句,则应首选编译执行因为SQL语句仅在第一次运行时被编译,在接下来的运行中,它将运行更快,因为已被编译过了;存储过程是注重速度的最佳选择,因为它已被编译过并存放在数据源中了。缺点是并不是所有的数据存储都支持存储过程.目录主要是是用来获得数据源结构的一些信息。  
   
  在本章中,我们主要看一下直接执行和编译执行,因为它们是由我们的程序来完成的.编写存储过程是DBMS(数据库管理系统)的事.而目录将在稍后讨论.  
   
  直接执行  
  要直接并快速执行SQL语句,以如下语法调用函数SQLExecDirect:  
   
  SQLExecDirect   proto   StatementHandle:DWORD,                                                                     pStatementText:DWORD,                                                                     TextLength:DWORD  
  StatementHandle.   要使用的语句句柄    
  pStatementText.   指向要执行的SQL语句的指针    
  TextLength.   SQL语句的长度.    
  可能的返回值如下:  
   
  SQL_SUCCESS   操作顺利    
  SQL_SUCCESS_WITH_INFO   操作顺利但可能产生非致命错误    
  SQL_ERROR   操作失败    
  SQL_INVALID_HANDLE   使用的语句句柄非法    
  SQL_NEED_DATA   如果在执行SQL语句前没有提供足够的参数将会获得这个返回值.这时需调用SQLParamData   或   SQLPutData函数来提交参数.    
  SQL_NO_DATA   如果SQL语句不返回结果集,例如只是一个查询动作,将获得这个返回值。使用户知道动作成功,但没有结果集被返回。    
  SQL_STILL_EXECUTING   如果异步执行SQL语句,   SQLExecDirect   会立刻返回这个值,表明语句正在执行。在通常情况下,如果你使用的一个多线程操作系统,异步执行是一个好主意。如果你希望异步执行,旧可以通过SQLSetStmtAttr来设置语句属性。    
   
  例子:  
   
  .data  
  SQLStmt   db   "select   *   from   Sales",0  
   
  .data?  
  hStmt   dd   ?  
   
  .code  
  .....  
  invoke   SQLAllocHandle,   SQL_HANDLE_STMT,   hConn,   addr   hStmt  
  .if   ax==SQL_SUCCESS   ||   ax==SQL_SUCCESS_WITH_INFO    
  invoke   SQLExecDirect,   hStmt,   addr   SQLStmt,   sizeof   SQLStmt  
   
  编译执行  
  SQL的执行被分为两步:第一步,必须通过调用函数SQLPrepare来*准备*语句。第二步,通过调用SQLExecute函数来执行语句.在使用编译执行时,我们可以多次调用SQLExecute来执行同一语句.   结合使用SQL参数,这个方法对执行同一语句极为有效。  
   
  SQLPrepare   与SQLExecDirect使用相同的三个参数,所以这里不再写出函数原型。   SQLExecute   语法:  
   
  SQLExecute   proto   StatementHandle:DWORD  
  只须这一个参数,我想不再需要解释了;)  
   
  例子:  
   
  .data  
  SQLStmt   db   "select   *   from   Sales",0  
   
  .data?  
  hStmt   dd   ?  
   
  .code  
  .....  
  invoke   SQLAllocHandle,   SQL_HANDLE_STMT,   hConn,   addr   hStmt  
  .if   ax==SQL_SUCCESS   ||   ax==SQL_SUCCESS_WITH_INFO    
  invoke   SQLPrepare,   hStmt,   addr   SQLStmt,   sizeof   SQLStmt  
  invoke   SQLExecute,   hStmt  
   
  你也许会想,编译执行没什么强于直接执行的。上面的例子还不明显。我们需要知道SQL语句的参数来仔细研究它。  
   
  语句参数(Statement   Parameters)  
  这里的参数是指由SQL语句使用的变量.比如说我们有一个叫做   "employee"的表,它有三个字段:"name",   "surname"和   "TelephoneNo"   。现在我们要找一个叫做"Bob"的职员的电话号码,   就可以使用以下SQL语句:  
   
  select   telephoneNo   from   employee   where   name='Bob'  
  这条SQL语句象我们希望的那样工作了。但是,如果我们又想找另一个职员的电话号码怎么办?如果不使用参数,那只好再写一条SQL语句,然后再一次编译、执行它。  
   
  现在我们不会允许这种低效率的行为了。我们可以使用参数来实现目标。在上面的例子中,我们必须将字符串/值替换为   '?'   (被称为参数标志符(parameter   marker)).SQL   语句将变成这样:  
   
  select   telephoneNo   from   employee   where   name=?  
  现在想一下这个问题:ODBC驱动程序如何知道用什么值来替换参数标志符'?'?答案是:   我们必须提供需要的值.这种方法被称为参数绑定(parameter   binding).简单点说,就是将一个参数标志符与用户程序中的变量建立连接的过程.在上面的例子中,我们需要创建一个缓冲区来告诉ODBC驱动程序,当它需要一个参数的具体值时,将从我们提供的字符串缓冲区中获得。一旦一个参数与一个变量绑定,它将一直保持绑定,直到被绑定到另一变量,或直到所有参数都被函数   SQLFreeStmt以(函数)参数   SQL_RESET_PARAMS释放,或直到该语句被释放.  
   
  将一个参数绑定到一个变量是通过调用函数   SQLBindParameter实现,语法如下:  
   
  SQLBindParameter   proto   StatementHandle:DWORD,                                                                                   ParameterNumber:DWORD,                                                                                   InputOutputType:DWORD,                                                                                   ValueType:DWORD,                                                                                   ParameterType:DWORD,                                                                                   ColumnSize:DWORD,                                                                                   DecimalDigits:DWORD,                                                                                   ParameterValuePtr:DWORD,                                                                                   BufferLength:DWORD,                                                                                   pStrLenOrIndPtr:DWORD  
  StatementHandle   语句句柄    
  ParameterNumber   参数个数,由1开始。这就是ODBC用来判断参数描述符的方法。如果有三个参数,则最左边是第一个参数,最右边是第三个参数。    
  InputOutputType   表明参数是用来输入还是输出的标志.这里的输入是指ODBC驱动程序将使用参数中获得的值,输出是指ODBC驱动程序将在操作结束时将结果放入参数中.大多数情况下,我们使用参数作为输入。而输出参数经常与存储过程有关.这个参数的两个可能值为:   SQL_PARAM_INPUT、   SQL_PARAM_INPUT_OUTPUT和SQL_PARAM_OUTPUT(译者:似应为三个参数,但原文如此)    
  ValueType   指明用户程序将要绑定到参数的值或缓冲区的类型。可能的类型为一组常数,以SQL_C_开头。    
  ParameterType   参数的SQL类型。例如,如果SQL参数是文本字段,我们就在这里填入值SQL_CHAR.查看MSDN中的ODBC程序员指南来获得完整列表(ODBC   Programmer's   reference)。    
  ColumnSize   参数的长度。换句话说,可认为是与参数标志符相连接的列(字段)的长度.在我们的例子中,   我们的参数标志符对列"name"使用了标准值.如果该列被定义了20字节长,我们就该在ColumnSize中填入20.    
  DecimalDigits   与参数描述符连接的列的小数位.    
  ParameterValuePtr   指向包含参数数据的缓冲区的指针.    
  BufferLength   由ParameterValuePtr指向的缓冲区的长度.    
  pStrLenOrIndPtr   指向一个双字的指针,包含以下之一:    
  由ParameterValuePtr指向的缓冲区中包含的参数长度.   除非参数的类型是字符串或二进制值,否则这个值被忽略.别把它与BufferLength混淆,看一下这个例子就会明白:假设该参数是一个字符串,该列有20字节宽.所以我们分配了一个21字节长的缓冲区,并将其地址传送到ParameterValuePtr。在调用函数SQLExecute前,   我们在缓冲区中放入了字符串"Bob".这个字符串有3字节长,因此我们需要在pStrLenOrIndPtr指向的双字中放入3这个值.    
  SQL_NTS.   这个参数是一个0结尾字符串(null-terminated   string).    
  SQL_NULL_DATA.   参数值为NULL.    
  SQL_DEFAULT_PARAM.   存储过程将使用参数的默认值,而不是从用户程序中获得的值.   它仅适用于已定义了默认参数值的存储过程.    
  SQL_DATA_AT_EXEC.   参数的数据将由SQLPutData传送.   由于数据可能太大无法放入内存(比如整个文件的数据),我们可以告诉ODBC驱动程序我们将用SQLPutData替代.  
   
  可能你会说   pStrLenOrIndPtr的参数太多了,但通常情况下,我们只会用到第一或第三个选项。    
  例子:  
   
  .data  
  SQLString   db   "select   telephoneNo   from   employee   where   name=?",0  
  Sample1   db   "Bob",0  
  Sample2   db   "Mary",0  
   
  .data?  
  buffer   db   21   dup(?)  
  StrLen   dd   ?  
   
  .code  
  ........  
  invoke   SQLPrepare,   hStmt,   addr   SQLStrTop

7 楼loveyou1234(fuck)回复于 2003-02-15 07:24:36 得分 0

我靠,  
  是在计嵌入式SQL  
  呀Top

8 楼gilbe(xxxaxxx)回复于 2003-02-21 19:48:51 得分 0

....up  
  关键问题还是没人回答Top

9 楼vcshcn(黑天的猩猩)回复于 2003-02-24 01:17:01 得分 0

前几天我看到了一篇文章,也是   LeLeGhost(禅师)   的思路Top

10 楼gilbe(xxxaxxx)回复于 2003-02-27 20:28:56 得分 0

up一下了Top

11 楼ahalf(ahalf)回复于 2003-02-28 08:34:19 得分 0

SQLPrepareTop

相关问题

  • asp中ODBC设置ACCESS2000数据库
  • 在jsp中连接odbc的数据库
  • odbc 中 多数据库的处理
  • mfc通过odbc连接mysql数据库如何读出mysql数据库中的中文?
  • odbc中如何操作同一数据库中的多个表
  • vc用ODBC访问SQL server数据库,修改的结果为何在数据库的表中没有显示?
  • DELPHI中不用ODBC而只用BDE访问ACCESS数据库
  • 谁有VC++中应用ODBC API 连接数据库的例子?
  • 谁有VC++中用ODBC API连接数据库的例子?
  • 不用ODBC在VC中用ADO连接Oracle数据库怎样

关键词

  • 语句
  • 执行
  • 编译
  • 函数
  • 数据
  • 存储过程
  • 数据库
  • 参数
  • 调用
  • 句柄

得分解答快速导航

  • 帖主:gilbe

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo