『壹』 OTL操作資料庫如果資料庫語句錯誤怎麼判斷
請查api命令表,話說你得先學下sql的操作規范。
『貳』 vc6.0與oracle編程採用什麼方式最好
肯定最好使用otl(Oracle, Odbc and DB2-CLI Template Library),它直接用oracle提供的oci介面訪問oracle(直接調用oracle的API),採用流操作,速度最快,與C語言直接調用API相當。具體可查詢otlv4.168.h。
同時也是跨平台的,也不需要ADO組件以及.net framework 等
『叄』 VC中如何正確使用ADO
資料庫與資料庫編程:
當前各種主流資料庫有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2,
Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。
資料庫編程是對資料庫的創建、讀寫等一列的操作。資料庫編程分為資料庫客戶端編程與資料庫伺服器端編程。資料庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;資料庫服務端編程主要使用OLE DB等方法。
資料庫編程需要掌握一些訪問資料庫技術方法,還需要注意怎麼設計高效的資料庫、資料庫管理與運行的優化、資料庫語句的優化。
ADO編程的一般步驟:
創建一個Connection對象
打開數據源,建立同數據源的連接
執行一個SQL命令
使用結果集
終止連接
ADO最重要的三個對象:
連接對象(Connection)
命令對象(Command)
記錄集對象(RecordSet)
在使用這三個對象的時候,需要定義與之相對應的智能指針:_ConnectionPtr、_CommandPtr、_RecordsetPtr
使用智能指針要:定義指針變數、創建其實例(實例化)、調用方法和屬性。該智能指針在析構對象時,自動調用Release方法,即使用後不需要手動釋放內存,代碼更加簡潔。
但需要調用Close方法,關閉連接Connection或者記錄集RecordSet。
『肆』 哪一種編程語言適合人工智慧
LISP:是一門高級的語言,在人工智慧中備受青睞,因為它具備垃圾收集、動態類型、數據函數、統一語法、互動式環境、可擴展性等特性,所以非常適合人工智慧編程。
PROLOG:提供了針對關於邏輯相關問題的解決方案,或者說它的解決方案有著簡潔的邏輯特徵,主要缺點就是學習起來很難。
C/C++:主要用於對執行速度要求很高的時候,它主要用於簡單程序,統計人工智慧,如神經網路就是一個常見的例子。
java:使用了LISP中的幾個理念,最明顯的就是垃圾收集,它的可移植性使它可以適用於任何程序,它還有一套內置類型,Java沒有LISP和Prolog高級,又沒有C那樣快,但如果要求可移植性它是最好的。
Python:是一種用LISP和Java編譯的語言,按照比較,這兩種語言彼此非常相似,僅有一些細小的差別;還有JPython,提供了訪問Java圖像用戶界面的途徑,這是PeterNorvig選擇用JPyhton翻譯他人工智慧書籍中程序的的原因,JPython可以讓他使用可移植的GUI演示,和可移植的http/ftp/html庫,所以它非常適合作為人工智慧語言。
綜合情況來講,Python更適合人工智慧編程,因為Python具有優質的文檔、設計非常好、快速、堅固、可移植、可擴展等,這些對於人工智慧而言都是非常重要的因素。
『伍』 我是高中生,學編程入門要看什麼書
不同意樓上說的。我建議先學VB,比較簡單。等差不多掌握編程思想後再學C,進而C++或者java。
C語言是面向過程的語言,程序界面不夠友好,適合編對人機交互性要求不高的程序。而且C語言涉及到指針操作和大量演算法,對於高中學生有些難。而VB是完全面向對象的語言,用戶界面設置簡單友好,編程效率高,編譯器使用也比較人性化,非常適合初學者。
『陸』 歐太力k801門禁說明書OTL K801門禁使用說明書 誰有 我想添加ID卡
摘要 你好,初始編程密碼是*9999#。
『柒』 求助大牛!C++編程,如何查詢資料庫中多條記錄的多個欄位值,並且返回到一個數據塊中...急急急!
額。。寫個個簡單的樣列,用的是ODBC,比較直接。使用ADO的話雖然代碼少,但是看起來不是很好理解。你可以自己去網路學學~
用到的函數都比較容易理解,我就沒多加說明了,如果有不理解的復制函數名網路一下,會有詳細的說明的。大概的流程就是這樣了~
//包含頭文件
#include "windows.h"
#include "sqlext.h"
#pragma comment(lib,"odbc32.lib")
int main(int argc, char* argv[]){
//1.連接數據源(前提是你已經配置好了數據源,我用的sqlserver資料庫,怎麼配數據源網路一下~很簡單的)
//分配環境句柄, 保存一些驅動程序的信息
SQLHENV henv;//環境句柄
SQLRETURN sqlRet;
sqlRet = SQLAllocEnv(&henv);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配環境句柄失敗!\n");
return -1;
}
//分配連接句柄
SQLHDBC hdbc;//連接句柄
sqlRet = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("分配連接句柄失敗!\n");
return -1;
}
//連接數據源(test是資料庫名字,sa 和sa 是用戶們和密碼,你替換即可)
sqlRet = SQLConnect(hdbc,(SQLCHAR*)"test",strlen("test"),(SQLCHAR*)"sa",2,(SQLCHAR*)"sa",2);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("連接數據源失敗!\n");
return -1;
}
//2.執行SQL語句
//准備語句句柄
SQLHSTMT hstmt;
sqlRet = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("連接語句句柄失敗!\n");
return -1;
}
//設置游標類型(參看:http://blog.csdn.net/bichenggui/article/details/5601381)
sqlRet = SQLSetStmtOption(hstmt,SQL_ATTR_CURSOR_TYPE,SQL_CURSOR_KEYSET_DRIVEN);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("設置游標類型失敗!\n");
return -1;
}
//執行SQL語句
//直接執行(你替換成你自己的sqlserver語句即可)
sqlRet = SQLExecDirect(hstmt,(SQLCHAR*)"insert into student values('lsk',21)",SQL_NTS);
if (sqlRet != SQL_SUCCESS && sqlRet != SQL_SUCCESS_WITH_INFO)
{
printf("執行SQL語句失敗!\n");
return -1;
}
//獲取結果集
SQLCHAR value[20]={0};
SQLINTEGER len = 0;
//移動游標(不移動前游標指向結果集第一列的前面)
SQLFetch(hstmt);
//取值(取的是結果集的第一列的值),第二個參數表示取第幾列
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
printf("結果為:%s\n",value);
//假如結果集有多行則再次移動游標即可
SQLFetch(hstmt);
//然後再次取值
SQLGetData(hstmt,1,SQL_C_CHAR,value,20,&len);
//關閉句柄,釋放資源
SQLFreeHandle(SQL_HANDLE_STMT, hstmt); //釋放語句句柄
SQLDisconnect(hdbc); //斷開連接
SQLFreeHandle(SQL_HANDLE_DBC, hdbc); //釋放連接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv); //釋放環境句柄
return 0;
}
『捌』 十萬火急~~求教OTL 我修改了N遍還是有錯,請問像我這樣 函數調用,指針,數組該怎麼處理呀
void main()
{void sort(int a[],int q);///////////////////////////////這里最後少一個分號
。。。
sort(*p,i);///////////////////調用函數寫的不對,int sort(struct st *p,int i)改為sort(*p,i)
。。。
}
void sort(int a[],int q)//這里的參數q和下面的臨時變數q重復了,需要改一下
{int j,q;
int t;
for(j=0;j<0;j++)
for(q=0;q<9-j;q++)
if (a[q]<a[q+1])
{t=a[q];a[q]=a[q+1];a[q+1]=t;}
return (a[q]);
}
『玖』 下面這些OCI函數到底是在哪個lib庫中實現的用的是ORACLE11g
一、開始前的准備工作
在使用OTL進行編程之前,要首先確定使用的Oralce版本以及所選用的字元集。OTL支持目前幾乎所有的主流資料庫,可以通過宏啟用otlv4.h中對應的資料庫操作介面。
如:使用Oracle 11g R2、字元集選擇UTF8,則可在包含otlv4.h之前聲明以下兩個宏:
#define OTL_ORA11G_R2
#define OTL_ORA_UTF8
#include "otlv4.h"
....
二、常用類及其常用成員
1. otl_connect類
static int otl_initialize(const int threaded_mode=0):
用於初始化OTL環境的靜態函數,參數指定是用於多線程還是單線程。它不保證線程安全,也就是說,如果多個線程共享使用一個otl_connect對象,需要加鎖進行控制。有個同事因為在多線程環境下使用了默認的參數0,就導致了程序異常。但是單線程環境下,參數設1是沒有問題的。所以,可以考慮將此參數直接設為1。
void rlogon(...):
這個函數有多個版本,請注意參考官方文檔中與相應資料庫版本對應的函數聲明。11g中用到的參數說明如下:
const char *connect_str:連接字元串,格式為:"用戶名/密碼@資料庫服務名"
const int aauto_commit:自動提交模式。若此參數設為0(默認),則通過此連接對象執行的事務不會自動提交。如使用direct_exec執行刪除記錄的操作時,需要手動調用commit()成員函數提交事務;若設為1則通過此otl_connect對象開啟的事務會自動提交。
long direct_exec(...):
const char *sqlstm: 指定所要執行的「靜態SQL語句」,即不產生輸入或輸出的SQL語句。如delete from book where name='c++『 。但是不能執行如select sysdate from al或select * from book亦或delete from book where name=:f1之類的語句,因為它們會帶有輸入或輸出,此類SQL語句可以通過otl_stream實現,下面會有介紹。
int ignore_error:是否忽略異常。可以指定otl_exception::disable禁用異常,否則程序需要使用try...catch(otl_exception &e)...捕獲並處理異常。
int connected:
此成員變數標識了連接對象是否連接成功,一旦連接成功其值即為1。即便後來網路斷掉了,此值仍舊保持不變,logoff()後此值變為0。所以此變數只能用於檢查rlogon是否連接成功,而不能判斷當前與資料庫的連接是否正常。
2. otl_stream類
void open(...):
為流對象關聯一個SQL語句,可以是帶輸入或輸出的SQL語句或PL/SQL塊。
const int arr_size:指定流緩沖區的大小。作為輸出流使用時,若輸出緩沖區中的記錄數達到此值即緩沖區滿時,會自動刷新緩沖區,若已設設置了自動提交則一並提交數據(默認);
const char *sqlstm:SQL語句,可以指定綁定變數,如:delete from book where id = :f1 and price = :f2;
otl_connect &db:流所使用的資料庫連接對象。
void set_commit(int auto_commit=0):
設置流被刷新時否自動提交事務。兩種條件下流會被刷新:a.緩沖區滿 b.手動調用flush成員函數
void flush(...):
執行和流關聯的SQL語句。如執行:
otl_stream delStream;
delStream.open(100, delete from book where id = :f1 and price = :f2, dbConnect); //正常情況下向流中加入100條記錄時才執行刪除
delStream << 1;
delSteam << 'C++';
delStream.flush(); //立即執行刪除操作,盡管當前流中只有一條記錄
long get_rpc():
獲取流中SQL語句執行後所影響到的記錄數,如插入100條記錄,則調用此函數返回的即為100
int good():
判斷流對象是否已正常打開,已打開返回1。注意:若復用一個流對象時,必須先調用close函數將其關閉,然後再調用open重新打開。
int get_dirty_buf_len():
獲取當前流對象緩沖區中的記錄數,其最大值為緩沖區size-1。每當緩沖區滿時會自動刷新,刷新後再調用此函數時返回0
3.otl_exception類
該類的幾個成員用於表示異常的信息,如:
char stm_text[2048]:出錯的SQL語句;
char var_info[256]:若在流中使用了與實際類型不符的綁定變數,此數組的值為綁定變數的信息;
unsigned char msg[1000]:這個我比較喜歡用,此數組顯示出具體的異常信息(包括oracle返回的錯誤碼),如連接超時等等。
三、對於網路異常的處理
現在項目對於程序的異常處理能力要求越來越高,比如網路中斷或資料庫出現異常等,要求在故障恢復後,程序能正常與資料庫保持連接,使業務盡可能的少受影響。可以通過以下方法解決此種情況。這也是折磨了我兩天的一個問題:(
首先,程序要在提交數據的地方使用try...catch捕獲otl_exception異常,當提交失敗時,otl會拋出此異常並攜帶異常信息;
其次,要在捕獲到異常之後,關閉之前的連接對象(如果有流使用此連接對象,則一定要先關閉流對象,然後再斷開otl_connect對象);
最後,重新連接資料庫並再次初始化流對象。
如:
void ReConnect(otl_connect &otlConnect, const char *pConnStr, int iAutoCommit);
....
//聲明otl對象並初始化對象
otl_connect dbConn;
otl_stream outStream;
void Init(void)
{
try
{
otl_connect::otl_initialize(1);
dbConn.rlogon("test1/password@testdb");
outStream.open(100, "insert into book values(:f1, :f2, :f3, :f4)", dbConn);
outStream.set_commit(1);
}
catch (otl_exception &e)
{
//處理異常
}
}
//提交數據的函數
void Submit(void)
{
try
{
for (int i = 0; i < 5000; i++)
{
outStream << i;
outStream << "abc";
outStream << i;
outStream << "null";
}
}
catch(otl_exception &e)
{
//提交數據異常,重新連接資料庫並重新初始化流對象
outStream.close(); //必須先關閉流對象。若先斷開連接會出現關閉流對象時報OCIHandleFree異常導致流對象無法正常關閉引起內存泄漏
ReConnect(dbConn, "test1/password@testdb", 0);
outStream.open(100, "insert into book values(:f1, :f2, :f3, :f4)", dbConn);
outStream.set_commit(1);
}
}
//重新連接連接資料庫函數
void ReConnect(otl_connect &otlConnect, const char *pConnStr, int iAutoCommit)
{
if (1 == otlConnect.connected)
{
otlConnect.logoff();
}
Retry:
try
{
otlConnect.rlogon(pConnStr, iAutoCommit);
}
catch (otl_exception &e)
{
Sleep(1000);
goto Retry;
}
}
這樣,調用Submit函數提交數據時,就有了網路異常處理功能,若提交失敗則會一直嘗試重新連接,直到連接成功為止。
『拾』 otl編程中(oracle) insert中對於date型欄位怎麼給值呀,知道用sysdate,具體怎麼弄呀
tk_idate=sysdate