經(jīng)過(guò)一周的IIS折騰,一周的ORACLE折騰。在經(jīng)過(guò)今天下午的一點(diǎn)小曲折,終于在VS2005下對(duì)MFC引用WEBSERVICE連接ORACLE數(shù)據(jù)庫(kù)取得了初步的成功。現(xiàn)總結(jié)一下:
這個(gè)過(guò)程分三步走: 一創(chuàng)建WEBSERVICE(C#) 二 C#連接ORACLE (PS:我開(kāi)發(fā)WEBSERVICE用的是C#); 三 VS下MFC程序調(diào)用WEBSERVICE。 現(xiàn)將其中碰到的問(wèn)題及解決過(guò)程記錄如下: 一 IIS的配置及WEBSERVICE的初實(shí)例: 剛開(kāi)始就需要用到IIS及WEBSERVICE,折騰了我一周,深表惡心。關(guān)于IIS及WEBSERVICE的問(wèn)題,在上兩篇博 客中已做過(guò)介紹; 二 ORACLE數(shù)據(jù)庫(kù)的初步認(rèn)識(shí): ORACLE也折騰我將近一周,也很惡心,遠(yuǎn)遠(yuǎn)沒(méi)有SQL SERVER用起來(lái)順手。我目前的認(rèn)識(shí)有限,網(wǎng)上說(shuō)它是多 進(jìn)程多線程的,而SQLSERVER是單進(jìn)程,多線程的。ORACLE默認(rèn)的有許多用戶,(例如SCOTT,SYS。)在這些 用戶中有它們各自的表,索引之類(lèi)的。 三 C#連接ORACLE: 關(guān)于連接代碼,網(wǎng)上多的是,在此我也寫(xiě)在這吧。 頭部添加下面兩句話 using System.Data;
using System.Data.OracleClient; 添加一個(gè)按鈕,添加代碼如下: string ConnectionString = "Data Source=orcl;user=scott;password=wu001";//寫(xiě)連接串
OracleConnection conn = new OracleConnection(ConnectionString);//創(chuàng)建一個(gè)新連接
try
{ conn.Open(); OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into test values(4,'f')";//在這兒寫(xiě)sql語(yǔ)句
cmd.ExecuteNonQuery();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message); //如果有錯(cuò)誤,輸出錯(cuò)誤信息
}
finally
{
conn.Close(); //關(guān)閉連接
} 我需要說(shuō)明三點(diǎn): 1 添加using System.Data.OracleClient;這句話,如果你直接寫(xiě)的可能是沒(méi)有的。按如下方法添加即可,在 項(xiàng)目名稱上點(diǎn)右鍵,添加引用,在.NET選項(xiàng)卡找到System.Data.OracleClient,確定即可,然后再在頭部添 加using System.Data.OracleClient; 2 最好寫(xiě)上MessageBox.Show(ee.Message);這句話,因?yàn)槿绻B接不成功出現(xiàn)異常,這句話即可提示你錯(cuò)誤在 那里,百度就O了。在我做的過(guò)程中,幫了我大忙。 然后把代碼寫(xiě)在WEBSERVICE的頁(yè)面即可,上面的代碼是我在C#的WINDOWS應(yīng)用程序中調(diào)試的,我確保無(wú)誤后 直接簡(jiǎn)化如下,寫(xiě)在WERSERVICE的頁(yè)面里。 [WebMethod]
public void LinkOracle()
{ string ConnectionString = "Data Source=orcl;user=scott;password=wu001";//寫(xiě)連接串
OracleConnection conn = new OracleConnection(ConnectionString);//創(chuàng)建一個(gè)新連接
conn.Open();
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into test values(4,'f')";//在這兒寫(xiě)sql語(yǔ)句
cmd.ExecuteNonQuery(); } 不要以為我這段代碼不夠健壯,可是如果沒(méi)錯(cuò)的話就不用考慮健壯性的問(wèn)題。然后添加開(kāi)始生成網(wǎng)站,發(fā)布網(wǎng)站即可。我用VS自帶的HTTP方法調(diào)用方法是沒(méi)錯(cuò)的。可是用MFC添加引用時(shí)就不行了。糾結(jié)了10分鐘,回來(lái)再在IIS的添加虛擬目錄后,在此瀏覽就錯(cuò)了。后面的介紹具體的解決辦法,耐心耐心,哈哈。 3 string ConnectionString = "Data Source=orcl;user=scott;password=wu001";的具體解釋: DataSource 即為默認(rèn)的全局?jǐn)?shù)據(jù)名。建議大家在裝ORACL的時(shí)候就創(chuàng)建數(shù)據(jù)庫(kù)。在安裝目錄下的的NETWORK里的ADMIN里的tnsnames.ora文件中,用記事本打開(kāi)。我的內(nèi)容如下:DataSource即為這里的ORCL,寫(xiě)上去即可。 # tnsnames.ora Network Configuration File: D:\oracle\product\10.1.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools. ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = abae3bcbcc0c47e)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
) EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
) 4 在虛擬目錄中,瀏覽servece.asmx時(shí),報(bào)錯(cuò),需要oracle客戶端8.7.1上以上的版本.不要驚慌,按如下方法解決即可. System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本。
說(shuō)明: 執(zhí)行當(dāng)前 Web 請(qǐng)求期間,出現(xiàn)未處理的異常。請(qǐng)檢查堆棧跟蹤信息,以了解有關(guān)該錯(cuò)誤以及代碼中導(dǎo)致錯(cuò)誤的出處的詳細(xì)信息。 異常詳細(xì)信息: System.Exception: System.Data.OracleClient 需要 Oracle 客戶端軟件 8.1.7 或更高版本。 文件夾沒(méi)有顯示'安全’,按照如下操作即可調(diào)出。 第一種方法:打開(kāi)我的電腦——工具——文件夾選項(xiàng)——查看——使用簡(jiǎn)單文件夾共享前的對(duì)勾取掉一切就ok! 第二種方法:WIN+R打開(kāi)運(yùn)行——輸入secpol.msc-----本地策略——安全選項(xiàng)——網(wǎng)絡(luò)訪問(wèn)——本地用戶共享安全模式——改為經(jīng)典就ok!
要解決以上問(wèn)題,只要給Authenticated Users 組加上訪問(wèn)Oracle Home目錄的權(quán)限即可 1、以Administrator權(quán)限登錄Windows 2、啟動(dòng)Window 資源瀏覽器找到ORACLE_HOME目錄,如C:\Oracle\ora92 3、右鍵彈出菜單,選擇該目錄共享與安全(Win2000下要點(diǎn)擊屬性) 4、點(diǎn)擊 “安全” 頁(yè)簽 5、在組和用戶名稱列表中點(diǎn)擊“Authenticated Users” 項(xiàng). 6、在該用戶的權(quán)限列表中,將“讀取和運(yùn)行”的選擇框置為不選中狀態(tài) 7、再次點(diǎn)擊“讀取和運(yùn)行”的選擇框,將其設(shè)置為選中狀態(tài) 8、點(diǎn)擊“高級(jí)”按鈕并在權(quán)限項(xiàng)目中確定“Authenticated Users” 是否擁有“讀取并運(yùn)行”權(quán)限并應(yīng)用于“該文件夾,及子文件夾和文件”. 如果不是,雙擊這樣,并確保權(quán)限可以“應(yīng)用于” “該文件夾,及子文件夾和文件”. 該項(xiàng)非常重要你一定要核查. 9、點(diǎn)擊“確定” 按鈕 10、重啟動(dòng), 以使得所有的修改生效.
=============================================================================
注意,權(quán)限設(shè)置好后,不用機(jī)器重啟的,直接IIS重啟下就行了,方法,開(kāi)始-運(yùn)行-CMD-IISRESET
。
四 MFC應(yīng)用程序引用WEBSERVICE: 我用的VS2005,沒(méi)出現(xiàn)網(wǎng)上說(shuō)的添加WEB引用是灰色的問(wèn)題。在項(xiàng)目名稱上點(diǎn)擊右鍵,添加WEB引用即可。 因是我是在本機(jī)上,所以點(diǎn)擊查看本地的引用即可。輸入引用名,確定。而后,會(huì)有生成的對(duì)應(yīng)的.h文件, 拖入頭文件中.我們?cè)谛┰倥粋(gè)按鈕,在其對(duì)應(yīng)的函數(shù)中添加如下代碼: CoInitialize(NULL);
HRESULT hr = S_OK;
CService *ws = new CService;
hr = ws->LinkOracle();
if (S_OK==hr)
{
AfxMessageBox("insert ok");
}
else
{
AfxMessageBox("insert error");
}
CoUninitialize(); 當(dāng)然.cpp頭中應(yīng)該包含WEBSEVICE對(duì)應(yīng)的頭文件,如下: #include "WebService.h"
using namespace Service; 到此,一個(gè)用VS下用webservice連接oracle即O了.嚴(yán)謹(jǐn)起見(jiàn),哈哈,補(bǔ)充一下: 我已解鎖scott用戶,在其下建表test,建表命令如下:create table test(id number(4),name varchar2(5)). 在用oracle創(chuàng)建數(shù)據(jù)庫(kù)時(shí)提示有口令管理,那時(shí)解鎖用戶即可,可設(shè)置密碼(我的密碼是wu001).我用的是10g,oracle惡心的是密碼必須包含字母. 這樣就O拉. 打開(kāi) sql/plus,用SCOTT進(jìn)入,輸入select *from test;() 
主機(jī)字符串這行不用管,我也不知道是干啥的.那位清楚,可給我留言說(shuō)聲,歡迎交流哪.即可看到插入成功拉. 貼個(gè)圖: 
以上是我的一些體會(huì),希望對(duì)想學(xué)習(xí)的人有所幫助,大家相互交流,一起進(jìn)步哈。
|