首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

ASP.NET 應用程式存取 Oracle 資料庫完整實作指南

     編輯:Oracle 資料庫基礎

伺服器端環境建置

1. 安裝 Oracle Client

於 Web 伺服器安裝 Oracle Client(僅需 Client 元件),參考 Oracle 9i/10g 安裝圖解,安裝類型選「Runtime」或「Administrator」。

2. 設定 Net Service Name (TNS)

使用 Net Configuration Assistant 建立連線別名,對應遠端 DB 的 IP、Port、Service Name。測試 tnsping 確認連通。

3. 建立應用程式專用使用者並授權

以 SYS AS SYSDBA 登入,建立使用者並授予 CONNECT, RESOURCE 角色,視需求再給 DBA 或特定物件權限。避免直接使用 SYS/SYSTEM 連線。

4. 驗證預存程序可用性

在 PL/SQL Developer 或 SQL*Plus 中以該使用者執行預存程序,確認邏輯正確、權限足夠。

ASP.NET 專案整合範例

Web.config 連線字串設定

<connectionStrings>
  <add name="OracleConn" 
       connectionString="Data Source=ORCL;User Id=app_user;Password=******;" 
       providerName="System.Data.OracleClient" />
</connectionStrings>

亦可使用 Easy Connect 免 TNS:Data Source=192.168.1.100:1521/ORCL。

專案加入參考

右鍵專案 → Add Reference → System.Data.OracleClient(.NET Framework 內建,已標示 Obsolete,新專案建議改用 Oracle 官方 Oracle.ManagedDataAccess NuGet 套件)。

核心程式碼 (C#)

using System;
using System.Data;
using System.Configuration;
using System.Data.OracleClient; // 或 Oracle.ManagedDataAccess.Client

public partial class _Default : System.Web.UI.Page
{
    private string _connStr = ConfigurationManager.ConnectionStrings["OracleConn"].ConnectionString;

    // 1. 測試連線
    protected void Button1_Click(object sender, EventArgs e)
    {
        try
        {
            using (var conn = new OracleConnection(_connStr))
            using (var cmd = new OracleCommand("SELECT 1 FROM DUAL", conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
                Label1.Text = "連線成功";
            }
        }
        catch (Exception ex)
        {
            Label1.Text = "失敗:" + ex.Message;
        }
    }

    // 2. 查詢回傳 DataSet 並繫結 GridView
    protected void Button2_Click(object sender, EventArgs e)
    {
        using (var conn = new OracleConnection(_connStr))
        using (var da = new OracleDataAdapter("SELECT * FROM sys.test1", conn))
        {
            var ds = new DataSet();
            da.Fill(ds);
            GridView1.DataSource = ds.Tables[0];
            GridView1.DataBind();
        }
    }

    // 3. 呼叫帶 IN/OUT 參數的預存程序
    protected void Button3_Click(object sender, EventArgs e)
    {
        using (var conn = new OracleConnection(_connStr))
        using (var cmd = new OracleCommand("getName", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("name_out", OracleType.VarChar, 20).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("id_in", OracleType.VarChar, 20).Direction = ParameterDirection.Input;
            cmd.Parameters["id_in"].Value = "1";

            conn.Open();
            cmd.ExecuteNonQuery();
            TextBox1.Text = cmd.Parameters["name_out"].Value?.ToString();
        }
    }

    // 4. 呼叫回傳 REF CURSOR 的 Package 程序
    protected void Button4_Click(object sender, EventArgs e)
    {
        using (var conn = new OracleConnection(_connStr))
        using (var cmd = new OracleCommand("test.GETLIST", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("cur_OUT", OracleType.Cursor).Direction = ParameterDirection.Output;

            conn.Open();
            using (var da = new OracleDataAdapter(cmd))
            {
                var ds = new DataSet();
                da.Fill(ds);
                GridView2.DataSource = ds.Tables[0];
                GridView2.DataBind();
            }
        }
    }
}

常見問題排查

  • 「需要 Oracle Client 8.1.7 或更新版本」: 確認伺服器已安裝 Client、環境變數 PATH 包含 ORACLE_HOME\bin、IIS 應用程式集區啟用 32 位元(若 Client 為 32-bit)。
  • ORA-12154 (TNS 無法解析): 檢查 tnsnames.ora 路徑、權限、拼寫。
  • 權限不足: 確認使用者對目標物件有 SELECT/EXECUTE 權限。

最佳實踐建議

  1. 連線字串放 Web.config 並加密 connectionStrings 區段。
  2. 一律使用 using 區塊確保連線、命令、資料配接器正確釋放。
  3. 參數化查詢防止 SQL Injection。
  4. 新專案採用 Oracle.ManagedDataAccess 純 managed 驅動,免安裝 Client,部署更輕量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved