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。
- oracle字符集乱码及返回 REF CURSOR 的存储过程执行问题
- oracle 存储过程及REF CURSOR的使用
- oracle 存储过程及REF CURSOR的使用
- oracle执行存储过程返回游标cursor
- Oralce中返回结果集的存储过程ref cursor
- oracle存储过程中使用Ref Cursor强类型游标返回结果集
- 使用jdbc调用oracle存储过程(返回cursor)的错误及解决方法- -
- Java获取Oracle存储过程返回的Cursor
- java 处理oracle 存储过程返回的cursor
- ibatis 调用oracle存储过程 返回cursor
- java调用Oracle存储过程返回Cursor
- Oracle Ref Cursor的使用,以及返回记录数
- oracle存储过程cursor
- oracle ref cursor的介绍
- oracle 的 REF CURSOR小结
- 如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回
- ibatis配置oracle存储过程返回cursor类型
- 解决C#中用Oracle执行存储过程返回DataSet的问题
- 畅通工程
- hdu 3473 Minimum Sum
- Opengl 绘图出现白板、像素不清晰的问题解决办法
- urllib2使用总结
- source、sh、bash、./执行脚本的区别
- oracle字符集乱码及返回 REF CURSOR 的存储过程执行问题
- 促销价格 功能设计
- 【NTT】 HDOJ 5322 Hope
- python设计模式之组合模式
- 说说Android 两种为自定义组件添加属性的使用方法和区别
- 5年后重拾博客
- IOS--文件管理NSFileManager
- 使用eclipse搭建maven多module项目
- ScrollView与ListView共存代码