1.
NET访问ORACLE数据库
命名空间System.Data.OracleClient
System.Data.OracleClient中访问Oracle数据库的连接串是:
User ID=用户名; Password=密码; Data Source=服务名
System.Data.OleDb 中的访问 Oracle 数据库的连接串是:
Provider=MSDAORA.1; User ID=用户名; Password=密码; Data Source=服务名
Provider=MSDAORA.1; User ID=用户名; Password=密码; Data Source=服务名
2.
Oracle 中的数据类型
Oracle 的数据类型和 SQL Server 相比,SQL Server 的大多数据类型很容易找到 .NET 中比较接近的类型,Oracle 中的类型就离 .NET 类型远了许多。
number: 数字类型,一般是 Number(M,N),M是有效数字,N是小数点后的位数(默认0),这个是按十进制说的。
nvarchar2: 可变长字符型(Unicode),这个比较像 SQL Server 的 nvarchar.
nvarchar2: 可变长字符型(Unicode),这个比较像 SQL Server 的 nvarchar.
nchar: 定长字符型(Unicode)。
nclob: "写作文"的字段,存储大量字符(Unicode)时用。
date: 日期类型,比较接近 SQL Server 的 datetime。
Oracle 中字段不能是 bit 或者 bool 之类的类型,一般是 number(1) 代替的。
nclob: "写作文"的字段,存储大量字符(Unicode)时用。
date: 日期类型,比较接近 SQL Server 的 datetime。
Oracle 中字段不能是 bit 或者 bool 之类的类型,一般是 number(1) 代替的。
和 SQL Server 一样在 SQL 命令中,字符类型需要用单引号(')隔开,两个单引号('')是单引号的字符转义
比较特殊的是日期类型:比如要写入 2004-7-20 15:20:07 这个时刻需要如下写:
UPDATE ... SET ... = TIMESTAMP '2004-7-20 15:20:07' ...
注意这里使用了 TIMESTAMP 关键字,并使用单引号隔开;另外请注意日期格式,上面的格式是可识别的,Oracle 识别的格式没有 SQL Server 那般多。这是和 SQL Server 不同的地方。
比较特殊的是日期类型:比如要写入 2004-7-20 15:20:07 这个时刻需要如下写:
UPDATE ... SET ... = TIMESTAMP '2004-7-20 15:20:07' ...
注意这里使用了 TIMESTAMP 关键字,并使用单引号隔开;另外请注意日期格式,上面的格式是可识别的,Oracle 识别的格式没有 SQL Server 那般多。这是和 SQL Server 不同的地方。
3.访问 Oracle 过程/函数
SQL Server 作程序时经常使用存储过程,Oracle 里也可以使用过程,还可以使用函数。Oracle 的过程似乎是不能有返回值的,有返回值的就是函数了(SQL Server 存储过程是可以有返回值的)。
.NET 访问 Oracle 过程/函数的方法很类似于 SQL Server,例如:
OracleParameter[] parameters = {
new OracleParameter("ReturnValue", OracleType.Int32, 0, ParameterDirection.ReturnValue, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull )
new OracleParameter("参数1", OracleType.NVarChar, 10),
new OracleParameter("参数2", OracleType.DateTime),
new OracleParameter("参数3", OracleType.Number, 1)
};
parameters[1].Value = "test";
parameters[2].Value = DateTime.Now;
parameters[3].Value = 1; // 也可以是 new OracleNumber(1);
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("函数/过程名", connection);
command.CommandType = CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
command.Parameters.Add( parameter );
connection.Open();
command.ExecuteNonQuery();
int returnValue = parameters[0].Value; //接收函数返回值
connection.Close();
Parameter 的 DbType 设定请参见 System.Data.OracleClient.OracleType 枚举的文档,比如:Oracle 数据库中 Number 类型的参数的值可以用 .NET decimal 或 System.Data.OracleClient.OracleNumber 类型指定; Integer 类型的参数的值可以用 .NET int 或 OracleNumber 类型指定。等等。
上面例子中已经看到函数返回值是用名为"ReturnValue"的参数指定的,该参数为 ParameterDirection.ReturnValue 的参数。
不返回记录集(没有 SELECT 输出)的过程/函数,调用起来和 SQL Server 较为类似。但如果想通过过程/函数返回记录集,在 Oracle 中就比较麻烦一些了。
在 SQL Server 中,如下的存储过程:
CREATE PROCEDURE GetCategoryBooks
(
@CategoryID int
)
AS
SELECT * FROM Books
WHERE CategoryID = @CategoryID
GO
在 Oracle 中,请按以下步骤操作:
(1)创建一个包,含有一个游标类型:(一个数据库中只需作一次)
CREATE OR REPLACE PACKAGE Test
AS
TYPE Test_CURSOR IS REF CURSOR;
END Test;
(2)过程:
CREATE OR REPLACE PROCEDURE GetCategoryBooks
(
p_CURSOR out Test.Test_CURSOR, -- 这里是上面包中的类型,输出参数
p_CatogoryID INTEGER
)
AS
BEGIN
OPEN p_CURSOR FOR
SELECT * FROM Books
WHERE CategoryID=p_CatogoryID;
END GetCategoryBooks;
(3).NET 程序中:
OracleParameters parameters = {
new OracleParameter("p_CURSOR", OracleType.CURSOR, 2000, ParameterDirection.Output, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull),
new OracleParameter("p_CatogoryID", OracleType.Int32)
};
parameters[1].Value = 22;
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("GetCategoryBooks", connection);
command.CommandType = CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
command.Parameters.Add( parameter );
connection.Open();
OracleDataReader dr = command.ExecuteReader();
while(dr.Read())
{
// 你的具体操作。这个就不需要我教吧?
}
connection.Close();
另外有一点需要指出的是,如果使用 DataReader 取得了一个记录集,那么在 DataReader 关闭之前,程序无法访问输出参数和返回值的数据。
SQL Server 作程序时经常使用存储过程,Oracle 里也可以使用过程,还可以使用函数。Oracle 的过程似乎是不能有返回值的,有返回值的就是函数了(SQL Server 存储过程是可以有返回值的)。
.NET 访问 Oracle 过程/函数的方法很类似于 SQL Server,例如:
OracleParameter[] parameters = {
new OracleParameter("ReturnValue", OracleType.Int32, 0, ParameterDirection.ReturnValue, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull )
new OracleParameter("参数1", OracleType.NVarChar, 10),
new OracleParameter("参数2", OracleType.DateTime),
new OracleParameter("参数3", OracleType.Number, 1)
};
parameters[1].Value = "test";
parameters[2].Value = DateTime.Now;
parameters[3].Value = 1; // 也可以是 new OracleNumber(1);
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("函数/过程名", connection);
command.CommandType = CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
command.Parameters.Add( parameter );
connection.Open();
command.ExecuteNonQuery();
int returnValue = parameters[0].Value; //接收函数返回值
connection.Close();
Parameter 的 DbType 设定请参见 System.Data.OracleClient.OracleType 枚举的文档,比如:Oracle 数据库中 Number 类型的参数的值可以用 .NET decimal 或 System.Data.OracleClient.OracleNumber 类型指定; Integer 类型的参数的值可以用 .NET int 或 OracleNumber 类型指定。等等。
上面例子中已经看到函数返回值是用名为"ReturnValue"的参数指定的,该参数为 ParameterDirection.ReturnValue 的参数。
不返回记录集(没有 SELECT 输出)的过程/函数,调用起来和 SQL Server 较为类似。但如果想通过过程/函数返回记录集,在 Oracle 中就比较麻烦一些了。
在 SQL Server 中,如下的存储过程:
CREATE PROCEDURE GetCategoryBooks
(
@CategoryID int
)
AS
SELECT * FROM Books
WHERE CategoryID = @CategoryID
GO
在 Oracle 中,请按以下步骤操作:
(1)创建一个包,含有一个游标类型:(一个数据库中只需作一次)
CREATE OR REPLACE PACKAGE Test
AS
TYPE Test_CURSOR IS REF CURSOR;
END Test;
(2)过程:
CREATE OR REPLACE PROCEDURE GetCategoryBooks
(
p_CURSOR out Test.Test_CURSOR, -- 这里是上面包中的类型,输出参数
p_CatogoryID INTEGER
)
AS
BEGIN
OPEN p_CURSOR FOR
SELECT * FROM Books
WHERE CategoryID=p_CatogoryID;
END GetCategoryBooks;
(3).NET 程序中:
OracleParameters parameters = {
new OracleParameter("p_CURSOR", OracleType.CURSOR, 2000, ParameterDirection.Output, true, 0, 0, "", DataRowVersion.Default, Convert.DBNull),
new OracleParameter("p_CatogoryID", OracleType.Int32)
};
parameters[1].Value = 22;
OracleConnection connection = new OracleConnection( ConnectionString );
OracleCommand command = new OracleCommand("GetCategoryBooks", connection);
command.CommandType = CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
command.Parameters.Add( parameter );
connection.Open();
OracleDataReader dr = command.ExecuteReader();
while(dr.Read())
{
// 你的具体操作。这个就不需要我教吧?
}
connection.Close();
另外有一点需要指出的是,如果使用 DataReader 取得了一个记录集,那么在 DataReader 关闭之前,程序无法访问输出参数和返回值的数据。
4.C#调用oracle存储过程(例子)
Oracle方面
(1)创建Oracle过程存储
create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)
as
varparam varchar2(28);
begin
varparam:=paramin;
paramout:=varparam|| paraminout;
end;
(2)测试过程存储
declare
param_out varchar2(28);
param_inout varchar2(28);
begin
param_inout:='ff';
proce_test('dd',param_out,param_inout);
dbms_output.put_line(param_out);
end;
C#方面
引用Oracle组件
using System;
using System.Data;
using System.Data.OracleClient;
namespace WebApplication4
{
public class OraOprater
{
private OracleConnection conn=null;
private OracleCommand cmd=null;
public OraOprater()
{
string mConn="data source=ora9i.ora.com;user id=ora;password=ora"; //连接数据库
conn=new OracleConnection(mConn);
try
{
conn.Open();
cmd=new OracleCommand();
cmd.Connection=conn;
}
catch(Exception e)
{
throw e;
}
}
public string SpExeFor(string m_A,string m_B)
{
//存储过程的参数声明
OracleParameter[] parameters={
new OracleParameter("paramin",OracleType.VarChar,20),
new OracleParameter("paramout",OracleType.VarChar,20),
new OracleParameter("paraminout",OracleType.VarChar,20)
};
parameters[0].Value=m_A;
parameters[2].Value=m_B;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Output;
parameters[2].Direction=ParameterDirection.InputOutput;
try
{
RunProcedure("proce_test",parameters);
return parameters[1].Value.ToString();
}
catch(Exception e)
{
throw e;
}
}
private void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
cmd.CommandText=storedProcName;//声明存储过程名
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
}
}
}
测试结果:ddff
(1)创建Oracle过程存储
create or replace procedure proce_test(paramin in varchar2,paramout out varchar2,paraminout in out varchar2)
as
varparam varchar2(28);
begin
varparam:=paramin;
paramout:=varparam|| paraminout;
end;
(2)测试过程存储
declare
param_out varchar2(28);
param_inout varchar2(28);
begin
param_inout:='ff';
proce_test('dd',param_out,param_inout);
dbms_output.put_line(param_out);
end;
C#方面
引用Oracle组件
using System;
using System.Data;
using System.Data.OracleClient;
namespace WebApplication4
{
public class OraOprater
{
private OracleConnection conn=null;
private OracleCommand cmd=null;
public OraOprater()
{
string mConn="data source=ora9i.ora.com;user id=ora;password=ora"; //连接数据库
conn=new OracleConnection(mConn);
try
{
conn.Open();
cmd=new OracleCommand();
cmd.Connection=conn;
}
catch(Exception e)
{
throw e;
}
}
public string SpExeFor(string m_A,string m_B)
{
//存储过程的参数声明
OracleParameter[] parameters={
new OracleParameter("paramin",OracleType.VarChar,20),
new OracleParameter("paramout",OracleType.VarChar,20),
new OracleParameter("paraminout",OracleType.VarChar,20)
};
parameters[0].Value=m_A;
parameters[2].Value=m_B;
parameters[0].Direction=ParameterDirection.Input;
parameters[1].Direction=ParameterDirection.Output;
parameters[2].Direction=ParameterDirection.InputOutput;
try
{
RunProcedure("proce_test",parameters);
return parameters[1].Value.ToString();
}
catch(Exception e)
{
throw e;
}
}
private void RunProcedure(string storedProcName,OracleParameter[] parameters)
{
cmd.CommandText=storedProcName;//声明存储过程名
cmd.CommandType=CommandType.StoredProcedure;
foreach(OracleParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
cmd.ExecuteNonQuery();//执行存储过程
}
}
}
测试结果:ddff
/***********************************************************************
* Module: OraHelper.cs http://csharp.xdowns.com
* Author: hellopj
* Purpose: Definition of the Class OraHelper
***********************************************************************/
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Collections;
using System.Configuration;
namespace OraHelper
{
public abstract class OraHelper
{
public static readonly string CONN_STRING_NON_DTC = ConfigurationSettings.AppSettings["ConnStr"].Trim();
public static OracleConnection conn = new OracleConnection(CONN_STRING_NON_DTC);
public static void OpenConnection()
{
if (conn.State != ConnectionState.Open)
conn.Open();
}
public static void CloseConnection()
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
public static DataSet getDataSet(string cmdText)
{
OracleDataAdapter Adapter = new OracleDataAdapter(cmdText,conn);
DataSet Data = new DataSet();
Adapter.Fill(Data);
return Data;
}
public static OracleDataReader ExecuteReader(string cmdText)
{
OracleCommand cmd = new OracleCommand();
* Module: OraHelper.cs http://csharp.xdowns.com
* Author: hellopj
* Purpose: Definition of the Class OraHelper
***********************************************************************/
using System;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Collections;
using System.Configuration;
namespace OraHelper
{
public abstract class OraHelper
{
public static readonly string CONN_STRING_NON_DTC = ConfigurationSettings.AppSettings["ConnStr"].Trim();
public static OracleConnection conn = new OracleConnection(CONN_STRING_NON_DTC);
public static void OpenConnection()
{
if (conn.State != ConnectionState.Open)
conn.Open();
}
public static void CloseConnection()
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
public static DataSet getDataSet(string cmdText)
{
OracleDataAdapter Adapter = new OracleDataAdapter(cmdText,conn);
DataSet Data = new DataSet();
Adapter.Fill(Data);
return Data;
}
public static OracleDataReader ExecuteReader(string cmdText)
{
OracleCommand cmd = new OracleCommand();