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