【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[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);?
總結
以上是生活随笔為你收集整理的【SQL】使用调用层接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [家里蹲大学数学杂志]第427期与反对称
- 下一篇: 函数式 vs 指令式