只记录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[15]; 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);