【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的时候, ...
随机推荐
- 总结const
int b; const int *a=&b; int const * a=&b; int * const a =&b; const int *const a=&b; ...
- const在c/c++中的区别
#include <iostream> using namespace std; int main() { ; ; }; ; i < sizeof array / sizeof *a ...
- lintcode-99-重排链表
99-重排链表 给定一个单链表L: L0→L1→-→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→- 必须在不改变节点值的情况下进行原地操作. 样例 给出链表 1-> ...
- php静态文件缓存示例
//开始缓冲区 ob_start(); $cache_file = "./cache/4.3-static.html"; $cache_time = 1; //设置缓存更新时间 i ...
- (转)Foundation-性能优化之NSDateFormatter
性能优化之NSDateFormatter 为什么要优化NSDateFormatter? 首先,过度的创建NSDateFormatter用于NSDate与NSString之间转换,会导致App卡顿,打开 ...
- [洛谷P1430]序列取数
题目大意:给定一个序列$s$,每个人每轮可以从两端(任选一端)取任意个数的整数,不能不取.在两个人都足够聪明的情况下,求先手的最大得分. 题解:设$f_{i,j}$表示剩下$[i,j]$,先手的最大得 ...
- php: Can't use function return value in write context
关于empty()函数, php手册中提到,php5.5之前empty()函数只支持检查变量,传入任何其他的表达式或函数都会产生语法错误. Note: Prior to PHP 5.5, empty( ...
- 使用XTU降低CPU功耗,自动执行不失效
INTEL出品的XTU可以用来做软超频操作,给CPU/GPU加电压超频,也可以通过降低CPU/GPU电压来减少功耗. 以前用XTU设置好了之后,过一段时间就自动失效了,最近失效的频率突然很高,于是找了 ...
- HDU4289:Control(最小割)
Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 如何用listview显示服务端数据
https://www.cnblogs.com/caobotao/p/5061627.html