【SQL】使用调用层接口
只记录C语言相关的,java相关的JDBC和PHP相关的都先跳过。
C相关的也只是记录一下,这里面的语句我都不知道如何运行,在我的vs2010里面连头文件都找不到... 我觉得这里只是讲解了一下基本的原理,具体的还跟我们采用哪一个数据库有关。
用C和SQL/CLI编写的程序能够创建和处理四种记录:
1.环境记录(SQLHENV):为连接做准备
2.连接记录(SQLHDBC):连接应用程序和数据库
3.语句记录(SQLHSTMT):SQL语句信息
4.描述记录(SQLHDESC):保存元组或参数的信息。一般不可见。
创建记录:
SQLAllocHandle(hType, hIn, hOut);
hType:表示希望的句柄类型。SQL_HANDLE_ENV表示新的环境;SQL_HANDLE_DBC表示新的连接;SWL_HANDLE_STMT表示新的语句。
hIn:是高层元素的句柄,如果要得到新的环境句柄则这里填入SQL_NULL_HANDLE
hOut:创建的句柄的地址
返回值:一个SQLRETURN(整数)类型的值。0表示成功,非0为出错。
#include "sqlcli.h"
SQLHENV myEnv;
SQLHDBC myCon;
SQLHSTMT execStat;
SQLRETURN errorCode1, errorCode2, errorCode3; errorCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);
if(!errorCode1)
{
errorCode2 = SQLAllocHandle(SQL_HANDLE_DBC, SQL_HANDLE_ENV, &myCon);
}
if(!errorCode2)
{
errorCode3 = SQLAllocHandle(SQL_HANDLE_STMT, SQL_HANDLE_DBC, &myCon);
}
进程语句
SQLPrepare(sh, st, sl);//作用是使句柄sh代表特定的SQL语句st
sh:语句句柄
st:SQL语句
sl:st的长度,如果不知道可以使用SQL_NTS通知SQLPrepare从字符串本身计算出长度。
SQLExecute(sh); //执行句柄sh代表的语句
SQLPrepare(execStat, "SELECT netWorth FROM MovieExec",SQL_NTS);
SQLExecute(execStat);
上面两句代码可以合成一句:
SQLExecDirect(execStat, "SELECT netWorth FROM MovieExec", SQL_NTS);
从查询结果中取数据
与PSM中FETCH命令相当的函数是
SQLFetch(sh);
返回值是SQLRETURN类型,表明是否成功。
把分量绑定到宿主语言变量:
SQLBindCol(sh,colNo,colType,pVar,varSize,varInfo)
sh:语句的句柄
ColNo要获得的元素的值的(元组内)分量的数目
colType:代码,表示存放的分量值的变量类型。如SQL_CHAR、SQL_INTEGER
pVar:指针,存放值的变量
varSize:pVar指向的变量值的字节长度
varInfo:整型指针,用于提供输出值附加信息。
#include "sqlcli.h"
void worthRanges(){
int i, digits, counts[];
SQLHENV myEnv;
SQLHDBC myCon;
SQLHSTMT execStat;
SQLINTEGER worth, worthInfo; SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);
SQLAllocHandle(SQL_HANDLE_DBC, SQL_HANDLE_ENV, &myCon);
SQLAllocHandle(SQL_HANDLE_STMT, SQL_HANDLE_DBC, &execStat);
SQLPrepare(execStat, "SELECT netWorth FROM MovieExec", SQL_NTS);
SQLExecute(execStat);
SQLBindCol(execStat, 1, SQL_INTEGER, &worth, sizeof(worth), &worthInfo);
for(i = 1; i < 15; i++)
counts[i] = 0;
while(SQLFetch(execStat) != SQL_NO_DATA)
{
digits = 1;
while((worth/=10) >0) digits++;
if(digits <= 14) counts[digits]++;
}
for(i = 1; i < 15; i++)
{
printf("digits = %d: number of execs = %d\n", i, counts[i]);
}
}
向查询传递参数:
1.用SQLPrepare准备语句,参数部分用问号代替
2.SQLBindParameter将值绑定到有问号的地方,有10个参数。
3.调用SQLExecute来执行带绑定的查询
SQLPrepare(myStat, "INSERT INTO Studio(name, address) VALUES(?, ?)", SQL_NTS);
SQLBindParameter(myStat,1, ..., studioName, ...);
SQLBindParameter(myStat,2, ..., studioAddr, ...);
SQLExecute(myStat);
【SQL】使用调用层接口的更多相关文章
- 【SQL】宿主语言接口
一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的.有两种嵌套方式: 1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用 2.直接嵌套SQL:在代码中嵌套SQL语句,提交给预处 ...
- SQL调用WebService接口
今天在做一个非常奇葩的东西.中间有个过程要在SQL触发器里面调用webservice接口.呵呵~ ALTER TRIGGER tgr_UpdateMemcached ON dbo.[User] AFT ...
- mapper.xml是怎样实现Dao层接口
上午写了一个简单的 从xml读取信息实例化一个Bean对象.下午就开始想mybatis是怎么通过xml文件来实现dao层接口的,一开始想直接用Class.forName(String name)然后调 ...
- MyBatis框架的XML数据访问Dao层接口的组合使用
MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF)
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十三)万能的用户层接口,(强大的WPF) 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt ...
- SQL映射器Mapper接口(MyBatis)
SQL映射器Mapper接口 MyBatis基于代理机制,可以让我们无需再写Dao的实现.直接把以前的dao接口定义成符合规则的Mapper. 注意事项: 1.接口必须以Mapper结尾,名字是Dom ...
- 远程调用内核接口(remote call kernel)
-------------------------------------------------------------------------------- 标题: 远程调用内核接口(remote ...
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
原文:Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候, ...
随机推荐
- Python调用MySQL的一些用法小结
目标:1个excel表内容导入到数据库中,例如:原始excel文件为 aaa.xls 首先:将aaa.xls 转换成aaa.txt ,注意当文件中含有中文字符时,可以通过notepad++打开,在“格 ...
- Sql Express数据备份和还原
参考文章:在SQL Server Express版本中没有代理功能如何自动备份数据库 首先用以下脚本,生成可以自动备份数据库的存储过程: USE [master] GO SET ANSI_NULLS ...
- 基于网络的 Red Hat 无人值守安装
基于网络的 Red Hat 无人值守安装 本文介绍了 PC 平台上的一种快速 Red Hat Linux 安装方案.它具有很高的自动化程度--用户只需手工启动机器并选择从网络启动,就可以完成整个安装过 ...
- hbase表的写入
hbase列式存储给我们画了一个很美好的大饼,好像有了它,很多问题都可以轻易解决.但在实际的使用过程当中,你会发现没有那么简单,至少一些通用的准则要遵守,还需要根据业务的实际特点进行集群的参数调整,不 ...
- 设置select和option的文字居中的方法
给select设置text-align:center在火狐浏览器下ok,但是在chrome浏览器无效,然后option在两个浏览器下设置text-align:center都是无效的,解决方法,设置样式 ...
- request.getParameterMap() 获取表单提交的键值对 并且 也能获取动态表单的key
Map<String,String[]> map = request.getParameterMap();Set<String> keys = map.keySet(); 获取 ...
- [bzoj5285] [HNOI2018]寻宝游戏
Description 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生的你,对这个活动非常感兴趣. ...
- C++——继承时的this指针
1.this指针只在类的成员函数中使用,当类的成员函数需要用到自己的指针时就要用到this指针.但静态函数不能使用this关键字,其解释是:因为this是个引用,哪个对象调用方法就引用哪个对象. 而静 ...
- ext radiogroup如何取值和设值
var radios = Ext.create('Ext.form.Panel', { title: 'RadioGroup Example', width: 300, height: 125, bo ...
- Ubuntu下安装LNMP之nginx的安装
Nginx 最初是作为一个 Web 服务器创建的,用于解决 C10k 的问题.作为一个 Web 服务器,它可以以惊人的速度为您的数据服务.但 Nginx 不仅仅是一个 Web 服务器,你还可以将其用作 ...