oracle字符集乱码及返回 REF CURSOR 的存储过程执行问题

来源:互联网 发布:北京java软件培训班 编辑:程序博客网 时间:2024/05/22 06:51


关于oracle字符集乱码问题:

1.OracleClient方式 存在乱码问题。(比如:当Oracle数据库服务器端采用英文字符集比如 US7ASCII 时,客户端不管字符集如何设置,读出的中文都是乱码;若服务器端用中文字符集比如 ZHS16GBK ,则无乱码问题。)

2. OleDb方式 微软 为“provider=MSDAORA.1;” 存在乱码问题。 (比如:服务器oracle为utf8,客户端为日文系统时,中文显示乱码)

3.OleDb方式 Oracle为“provider='OraOleDb.Oracle';”。 不管Oracle服务器端用何字符集,读写中文均无乱码问题。


关于要执行返回 REF CURSOR 的存储过程问题:

1 OracleClient:

必须在 OracleParameterCollection 中定义参数,包括 Cursor 的 OracleType 以及 Output 的 Direction。数据提供程序只支持作为输出参数绑定 REF CURSOR。提供程序不支持 REF CURSOR 作为输入参数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Data.OracleClient;
namespace pro
{
    public partial class WebForm4 : System.Web.UI.Page
    {
        string OracleConnectionString = ConfigurationManager.ConnectionStrings["scott"].ConnectionString;
        protected void Page_Load(object sender, EventArgs e)
        {
            OracleConnection conn = new OracleConnection(OracleConnectionString);
            OracleCommand comm = new OracleCommand();
            comm.Connection = conn;
            comm.CommandType = CommandType.StoredProcedure;
            comm.CommandText = "curspkg.open_one_cursor";
            comm.Parameters.Add(new OracleParameter("n_empno", OracleType.Number)).Value = "0";
            comm.Parameters.Add(new OracleParameter("io_cursor", OracleType.Cursor)).Direction = ParameterDirection.Output;
            conn.Open();
            OracleDataReader rdr = comm.ExecuteReader();
                GridView1.DataSource = rdr;
                GridView1.DataBind();         
            conn.Close();
        }
    }
}

2. OleDb方式 微软

  provider=MSDAORA提供程序不会自动绑定 REF CURSOR 数据类型

create or replace package PKG_TEST_SYH is

  TYPE T_CURSOR IS REF CURSOR;

  procedure TEST001(io_cursor in out T_CURSOR);

end PKG_TEST_SYH;


create or replace package BODY PKG_TEST_SYH is

   procedure TEST001(O_NumRowUI out Number)
   is
   begin
        SELECT count(*) INTO O_NumRowUI
        FROM F101HEADER

   end TEST001;

begin
  null;
end PKG_TEST_SYH;


.net中调用存储过程时,不必要设置cursor的类型和输出方式

oleDbCommand.CommandText = procedureName;
   try
   {
    OleDbDataAdapter myAdapter = new OleDbDataAdapter();
    myAdapter.SelectCommand = oleDbCommand;
    myAdapter.Fill(ds,tbName);
   }
   catch(Exception ex)
   {
    Console.WriteLine(ex.Message);
   }


3.OleDb方式 Oracle

provider='OraOleDb.Oracle' 数据提供程序不会自动绑定 REF CURSOR 数据类型,oledb也没有提供对应(System.Data.OracleClient.OracleType.Cursor)的cursor类型。

目前能想到的方法是:

1) 建立临时表,将cursor数据集依次存储在临时表中,再从临时表中得到。


2)

Ø        Oracle数据库连接方式:

Provider=OraOLEDB.Oracle.1;User ID=username;password=dbpassword;Data Source=databasename;Persist Security Info=True;Extended Properties='PLSQLRSet=1';

 

Extended Properties='PLSQLRSet=1'

注意:上面这个属性一定要带上,否则无法操作有返回游标参数的存储过程;



参照:

http://blog.csdn.net/cuizm/article/details/6528869


http://blog.csdn.net/lizhenhuatop/article/details/2986303

关于oracle字符集乱码问题:

1 OracleClient方式,是微软专门针对Oracle数据库开发的,仅在 .NET Framework 1.1 版中受支持。当Oracle数据库服务器端采用英文字符集比如 US7ASCII 时,客户端不管字符集如何设置,读出的中文都是乱码;若服务器端用中文字符集比如 ZHS16GBK ,则无乱码问题。
引用类库:System.Data.OracleClient.dll。 
命名空间:System.Data.OracleClient。
常用类:OracleConnection、OracleCommand、OracleDataAdapter、OracleTransaction、OracleDataReader等。
典型连接字符串:“data source=oratest;user id=scott;password=tiger”(注意:可不指定 provider 驱动)。

2. OleDb方式,微软和Oracle公司各自提供了OleDb的驱动程序,使用方法的差别很少。
相同之处
命名空间:System.Data.OleDb。
常用类:OleDbConnection、OleDbCommand、OleDbDataAdapter、OleDbTransaction、OleDbDataReader等。
不同之处
引用类库:微软的只需要System.Data.dll;若用Oracle的驱动,虽然也只要引入System.Data.dll,但前提是首先安装
Oracle针对.Net的数据访问组件
连接字符串:与OracleClient方式相比,要添加一个provider,微软为“provider=MSDAORA.1;”,Oracle为“provider='OraOleDb.Oracle';”。

provider=MSDAORA.1 存在乱码问题。 (比如:服务器oracle为utf8,客户端为日文系统时,中文显示乱码)

provider='OraOleDb.Oracle' 不管Oracle服务器端用何字符集,读写中文均无乱码问题。


http://bbs.csdn.net/topics/360194128 

作为返回参数的Cursor,直接使用DataTable接受就可以了
因为性能的原因,除非您显式指定,否则,Oracle 数据提供程序不会自动绑定 REF CURSOR 数据类型,因为 MSDAORA 会这样做。

数据提供程序不支持任何 ODBC 转义序列,包括用于指定 REF CURSOR 参数的 {resultset} 转义。

要执行返回 REF CURSOR 的存储过程,必须在 OracleParameterCollection 中定义参数,包括 Cursor 的 OracleType 以及 Output 的 Direction。数据提供程序只支持作为输出参数绑定 REF CURSOR。提供程序不支持 REF CURSOR 作为输入参数。

不支持从参数值获取 OracleDataReader。在执行命令后,值属于 DBNull 类型。

适用于 REF CURSOR 的唯一 CommandBehavior 枚举值(例如在调用 ExecuteReader 时)是 CloseConnection;所有其他枚举值均将被忽略。

REF CURSOR 在 OracleDataReader 中的顺序取决于参数在 OracleParameterCollection 中的顺序。ParameterName 属性被忽略。

不支持 PL/SQL TABLE 数据类型。但是,REF CURSOR 的效率更高。如果必须使用 TABLE 数据类型,请使用 OLE DB .NET 数据提供程序和 MSDAORA。



0 0
原创粉丝点击