在利用ado連接數(shù)據(jù)庫之前,需要做一些準(zhǔn)備
10年的眉縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整眉縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“眉縣網(wǎng)站設(shè)計(jì)”,“眉縣網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
1.用#import指令引入ADO類型庫
我們在stdafx.h中加入如下語句:
#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","adoEOF") 。
這一語句有何作用呢?其最終作用同我們熟悉的#i nclude類似,編譯的時(shí)候系統(tǒng)會為我們生成msado15.tlh,ado15.tli兩個(gè)C++頭文件來定義ADO庫。
幾點(diǎn)說明:
(1) 您的環(huán)境中msado15.dll不一定在這個(gè)目錄下,請按實(shí)際情況修改
(2) 在編譯的時(shí)候肯能會出現(xiàn)如下警告,對此微軟在MSDN中作了說明,并建議我們不要理會這個(gè)警告。msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
2、初始化OLE/COM庫環(huán)境
必須注意的是,ADO庫是一組COM動(dòng)態(tài)庫,這意味應(yīng)用程序在調(diào)用ADO前,必須初始化OLE/COM庫環(huán)境。在MFC應(yīng)用程序里,一個(gè)比較好的方法是在應(yīng)用程序主類的InitInstance成員函數(shù)里初始化OLE/COM庫環(huán)境。
BOOL CMyAdoTestApp::InitInstance()
{
if(!AfxOleInit())//這就是初始化COM庫
{
AfxMessageBox(“OLE初始化出錯(cuò)!”);
return FALSE;
}
}
3.ADO庫包含三個(gè)基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。與數(shù)據(jù)庫的連接就是用_ConnectionPtr接口,它的連接字符串可以是自己直接寫,也可以指向一個(gè)ODBC DSN。以下的例子都測試通過,順便寫了SQL Server的例子。
BOOL CTestconDlg::ConnectDatabase()
{
CString m_server,m_data,m_uid,m_pwd;
m_server="192.168.0.24";//服務(wù)器ip或名稱
m_data="crmdb";//ODBC數(shù)據(jù)源
m_uid="njcrm";//用戶名
m_pwd="crmdbo";//密碼
BOOL retFt=false;
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///創(chuàng)建Connection對象
if(SUCCEEDED(hr))
{
_bstr_t connStr;
m_pConnection-CursorLocation=adUseClient;
//begin---------------Oracle ODBC 配置數(shù)據(jù)源-------------------------------------
//控制面板-管理工具-數(shù)據(jù)源(ODBC)-系統(tǒng)DNS-添加-Microsoft ODBC for Oracle-完成-配置……
// connStr="DSN="+m_data;
// m_pConnection-Open(_bstr_t(connStr),(_bstr_t)m_uid,(_bstr_t)m_pwd,adConnectUnspecified);
//end---------------Oracle ODBC 配置數(shù)據(jù)源---------------------------------------
//begin---------------Oracle 標(biāo)準(zhǔn)安全級別---------------------------------------
// connStr="Provider=OraOLEDB.Oracle;User ID=njcrm;Password=crmdbo;Data Source=192.168.0.24;";
// m_pConnection-Open(_bstr_t(connStr),(_bstr_t)_T(""),(_bstr_t)_T(""),adConnectUnspecified);
//end---------------Oracle 標(biāo)準(zhǔn)安全級別---------------------------------------
//begin---------------Oracle 微軟格式----------------------------------
外連接 : 使用外連接可以查存不滿足條件的數(shù)據(jù) 符號(+) SQL select e.ename,e.sal,d.dname,d.loc from emp e,dept d 2 where e.deptno=d.deptno(+); 自連接: SQL select w.ename||' work for '||m.job from emp w,emp m 2 where w.empno=m.empno;
具體的代碼如下:
/// summary
/// Oracle 的數(shù)據(jù)庫連接字符串.
/// /summary
private const String connString =
@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.210)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User
Id=TEST;Password=TEST123";
192.168.1.210 是 Oracle?數(shù)據(jù)庫服務(wù)器的 IP 地址
1521 是 默認(rèn)的端口號
SERVICE_NAME=ORCL 意思是Oracle 數(shù)據(jù)庫服務(wù)是ORCL
后面就是用戶名密碼了。
擴(kuò)展資料:
部分描述:
abstract:可以和類、方法、屬性、索引器及事件一起使用,標(biāo)識一個(gè)可以擴(kuò)展但不能被實(shí)體化的、必須被實(shí)現(xiàn)的類或方法。
as:一個(gè)轉(zhuǎn)換操作符,如果轉(zhuǎn)換失敗,就返回null。
base:用于訪問被派生類或構(gòu)造中的同名成員隱藏的基類成員。
catch:定義一個(gè)代碼塊,在特定類型異常拋出時(shí),執(zhí)行塊內(nèi)代碼。
checked:既是操作符又是語句,確保編譯器運(yùn)行時(shí),檢查整數(shù)類型操作或轉(zhuǎn)換時(shí)出現(xiàn)的溢出。
const:標(biāo)識一個(gè)可在編譯時(shí)計(jì)算出來的變量值,即一經(jīng)指派不可修改的值。
delegate:指定一個(gè)聲明為一種委托類型。委托把方法封裝為可調(diào)用實(shí)體,能在委托實(shí)體中調(diào)用。
enum:表示一個(gè)已命名常量群集的值類型。
event:允許一個(gè)類或?qū)ο筇峁┩ㄖ某蓡T,他必須是委托類型。
explicit:一個(gè)定義用戶自定義轉(zhuǎn)換操作符的操作符,通常用來將內(nèi)建類型轉(zhuǎn)換為用戶定義類型或反向操作,必須再轉(zhuǎn)換時(shí)調(diào)用顯示轉(zhuǎn)換操作符。
extern:標(biāo)識一個(gè)將在外部(通常不是c#語言)實(shí)現(xiàn)的方法。
參考資料來源:百度百科-c#
url=jdbc\:oracle\:thin\:@localhost\:1521\:SYSDBA
感覺上面這個(gè)有點(diǎn)問題呢,你的數(shù)據(jù)庫是sysdba嗎?比較標(biāo)準(zhǔn)的格式是
jdbc:oracle:thin:@//localhost:1521/[數(shù)據(jù)庫的服務(wù)名]
name=SYS
password=admin
這兩個(gè)也有問題,sys是系統(tǒng)管理帳號,你的軟件帳號是用sys嗎?
connection as SYS should be as SYSDBA or SYSOPER! 提示這個(gè)的原因是你使用了sys帳號的原因.換你系統(tǒng)應(yīng)該使用的帳號和密碼就不會出現(xiàn)這樣的問題了
Oracle數(shù)據(jù)庫:
驅(qū)動(dòng)程序包名:ojdbc14.jar
驅(qū)動(dòng)類的名字:oracle.jdbc.driver.OracleDriver
JDBC URL:jdbc:oracle:thin:@dbip:port:databasename
說明:驅(qū)動(dòng)程序包名有可能會變
JDBC URL中黑色字體部分必須原封不動(dòng)的保留,為該驅(qū)動(dòng)識別的URL格式。紅色字體部分需要根據(jù)數(shù)據(jù)庫的安裝情況填寫。其中各個(gè)部分含義如下:
dbip –為數(shù)據(jù)庫服務(wù)器的IP地址,如果是本地可寫:localhost或127.0.0.1。
port –為數(shù)據(jù)庫的監(jiān)聽端口,需要看安裝時(shí)的配置,缺省為1521。
databasename –為數(shù)據(jù)庫的SID,通常為全局?jǐn)?shù)據(jù)庫的名字。
舉例如果要訪問本地的數(shù)據(jù)庫allandb,端口1521,那么URL寫法如下:
jdbc:oracle:thin:@localhost:1521:allandb
配置Oracle服務(wù)器端與客戶端網(wǎng)絡(luò)連接方法:
1、打開Oracle自帶的Net Manager,選中目錄樹中的服務(wù)命名,再點(diǎn)擊左上側(cè)“+”按鈕,彈出如下圖示對話框:
2、在輸入框中填寫Net服務(wù)名,如Myoracle,點(diǎn)擊下一步,進(jìn)入下圖示對話框:
3、選中TCP/IP(Internet協(xié)議),點(diǎn)擊下一步:
4、填寫主機(jī)名與端口號。點(diǎn)擊下一步:
5、選中(Oracle8i或更高版本)服務(wù)名,輸入服務(wù)名。這里的服務(wù)名實(shí)際上就是數(shù)據(jù)庫服務(wù)器端監(jiān)聽器配置中的全局?jǐn)?shù)據(jù)庫名,前者與后者必須相同。配置好后點(diǎn)擊下一步:
6、配置完成的本地服務(wù)名如下圖示:
public void testOracle()
{
Connection con = null;// 創(chuàng)建一個(gè)數(shù)據(jù)庫連接
PreparedStatement pre = null;// 創(chuàng)建預(yù)編譯語句對象,一般都是用這個(gè)而不用Statement
ResultSet result = null;// 創(chuàng)建一個(gè)結(jié)果集對象
try
{
? ?Class.forName("oracle.jdbc.driver.OracleDriver");// 加載Oracle驅(qū)動(dòng)程序
? ?System.out.println("開始嘗試連接數(shù)據(jù)庫!");
? ?String url = "jdbc:oracle:" + "thin:@127.0.0.1:1521:XE";// 127.0.0.1是本機(jī)地址,XE是精簡版Oracle的默認(rèn)數(shù)據(jù)庫名
? ?String user = "system";// 用戶名,系統(tǒng)默認(rèn)的賬戶名
? ?String password = "147";// 你安裝時(shí)選設(shè)置的密碼
? ?con = DriverManager.getConnection(url, user, password);// 獲取連接
? ?System.out.println("連接成功!");
? ?String sql = "select * from student where name=?";// 預(yù)編譯語句,“?”代表參數(shù)
? ?pre = con.prepareStatement(sql);// 實(shí)例化預(yù)編譯語句
? ?pre.setString(1, "劉顯安");// 設(shè)置參數(shù),前面的1表示參數(shù)的索引,而不是表中列名的索引
? ?result = pre.executeQuery();// 執(zhí)行查詢,注意括號中不需要再加參數(shù)
? ?while (result.next())
? ? ? ?// 當(dāng)結(jié)果集不為空時(shí)
? ? ? ?System.out.println("學(xué)號:" + result.getInt("id") + "姓名:"
? ? ? ? ? ? ? ?+ result.getString("name"));
}
catch (Exception e)
{
? ?e.printStackTrace();
}
finally
{
? ?try
? ?{
? ? ? ?// 逐一將上面的幾個(gè)對象關(guān)閉,因?yàn)椴魂P(guān)閉的話會影響性能、并且占用資源
? ? ? ?// 注意關(guān)閉的順序,最后使用的最先關(guān)閉
? ? ? ?if (result != null)
? ? ? ? ? ?result.close();
? ? ? ?if (pre != null)
? ? ? ? ? ?pre.close();
? ? ? ?if (con != null)
? ? ? ? ? ?con.close();
? ? ? ?System.out.println("數(shù)據(jù)庫連接已關(guān)閉!");
? ?}
? ?catch (Exception e)
? ?{
? ? ? ?e.printStackTrace();
? ?}
}
}