1 由於交叉表的八個報表寫在sql中了,每個報表對應sql語句有300行之多,不能定義視圖,因為必須傳遞個參數,所以利用了預存程序實現。
首先,定義包,然後定義包體,在用.net調用產生資料集即可
.net調用oracle帶參數的預存程序,返回資料集
Oracle這個複雜一些,步驟如下:
在pl/sql中首先寫包的定義檔案
CREATE OR REPLACE PACKAGE ZHBB AS
TYPE t_cursor IS REF CURSOR ;
Procedure ZH11 (rq IN char, io_cursor IN OUT t_cursor);
Procedure ZH12 (rq IN char, io_cursor IN OUT t_cursor);
END ZHBB;
其次寫包體的定義檔案
CREATE OR REPLACE PACKAGE BODY ZHBB AS
Procedure ZH11(rq IN char, io_cursor IN OUT t_cursor) IS
v_cursor t_cursor;
BEGIN
OPEN v_cursor FOR
Select * from aa where ny=rq;
io_cursor := v_cursor;
END ZH11;
Procedure ZH12 (rq IN char, io_cursor IN OUT t_cursor) IS
。。。。。
END ZH12;
.net調用方法:
public static DataTable GetDataTable(string PackageName,string ProName,string connString,string rq)
{
connString=” Provider= MSDAORA.1;User ID=xx;Data Source=xx;Password=xx;”
//定義下新的連結方法,因為原來的驅動"OraOLEDB.Oracle"不能滿足需求,設定為"MSDAORA.1"
OleDbConnection Oraclecon = new OleDbConnection(connString);
Oraclecon.Open();
OleDbCommand cmd = new OleDbCommand("{Call "+ PackageName +"."+ ProName +"(?, {resultset 0, io_cursor} )}", Oraclecon);
cmd.Connection = Oraclecon;
cmd.Parameters.Add("rq", OleDbType.VarChar, 8).Value = ""+ rq +"";
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
//DataSet ds = new DataSet();
da.Fill(dt);
Oraclecon.Close();
Oraclecon.Dispose();
return dt;
}
}