原生OracleClient驱动在工具中自带驱动,引入简单使用起来也很方便,提供了对数据库原生操作的API函数。开发的时候通过API函数来执行与操作SQL语句来完成对应的业务逻辑。但是缺点也很明显,PWF程序发打包成客户端之后安装到客户机器运行的时候,在客户的机器上同样也需要安装oracle客户端,才能来完成对数据库的操作。使用起来维护起来很不方便,开发调试还可以,但是正是项目部太适合。System.Data.OracleClient驱动运行的原理就是操作本机上的Oracle客户端来与Oracle服务进行通行。
引入数据库驱动
检索到oracle驱动加载
Oracle.ManagedDataAccess 驱动引入
Oracle.ManagedDataAccess驱动需要在Nuget中下载到项目工程中来,在引入Oracle.ManagedDataAccess驱动后通过API函数来操作数据库,Oracle.ManagedDataAccess驱动与System.Data.OracleClient驱动最大的区别就是Oracle.ManagedDataAccess不需要本机安装Oracle客户端。发布程序后在客户端机器上不需要在安装Oracle客户端那么麻烦,维护起来非常方便。
2 原生数据库API操作
调用Oracle.ManagedDataAccess 驱动中提供的API操作数据库,API操作分为以下几个步骤。
1 OracleConnection 加载数据库连接源。设置数据库连接源参数,IP地址,端口,用户名称,密码等信息。
2 Open() 通过数据库连接源打开数据库连接。(打开后别忘记关闭)
3 数据库连接成功后,在数据连接源中获得数据库SQL操作类的对象引用。OracleCommand cmd = conn.CreateCommand();
4 SQL操作类设置执行的SQL文内容。cmd.CommandText =SQL文
5 SQL操作类操作SQL文,并获得SQL文返回的数据结果集对象。
6 在数据结果集对象中将数据遍历取出。
7 关闭数据库连接。
using Oracle.ManagedDataAccess.Client;//---------引入ManagedDataAccess 驱动
public class Zht {
static void Main(string[] args) {
Console.WriteLine("--------- Oracle -------");
string str = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.101.2.201)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ora10g)));Persist Security Info=True;User ID=jx_jmdj;Password=jx_jmdj;";
//OracleConnection 加载数据库连接源。设置数据库连接源参数,IP地址,端口,用户名称,密码等信息。
OracleConnection conn = new OracleConnection(str);
conn.Open();//开数据库连接
OracleCommand cmd = conn.CreateCommand();//获得数据库SQL操作类
cmd.CommandText = "select * from sys_user";//编写SQL文
OracleDataReader reader = cmd.ExecuteReader();//执行SQL文,返回数据集对象
while (reader.Read()) {//取出数据集中的数据内容
Console.WriteLine("===="+ reader.GetString(0));
}
conn.Close(); //关闭数据库
}
数据库的增、删、改操作API
OracleCommand cmd = conn.CreateCommand();//获得数据库SQL操作类
cmd.CommandText = "INSERT INTO SZPT(id) VALUES (sys_guid())";
cmd.ExecuteNonQuery();
返回一行一列的数据
OracleCommand cmd = conn.CreateCommand();//获得数据库SQL操作类
cmd.CommandText = "SELECT COUNT(*) FROM SZPT";
decimal i= (decimal)cmd.ExecuteScalar();
存储过程操作
CREATE OR REPLACE PROCEDURE zht_list(
z1 IN varchar2,----参数一
z2 IN varchar2,----参数一
o_rezht OUT SYS_REFCURSOR,----返回游标
o_z1 out VARCHAR2) as ----返回游标
BEGIN
OPEN o_rezht FOR select * from sys_user;----返回游标集合
o_z1:=z1||z2;----字符串
END zht_list;
)
存储过程参数使用Parameters 方法进行设置
在设置Parameters存储过程返回是字符串的时候,一定要设置 sqlCmd.Parameters[2].Size 长度,如果不设置C#会默认成字符串长度是1。
会报错误ORA-06502: PL/SQL: numeric or value error: character string bu
//定义游标查询方法 存储过程名称 zht_list
OracleCommand sqlCmd = new OracleCommand("zht_list", conn);
//设置存储过程 参数z1
sqlCmd.Parameters.Add("z1", OracleDbType.Varchar2, "参数1", ParameterDirection.Input);
//设置存储过程 参数z2
sqlCmd.Parameters.Add("z2", OracleDbType.Varchar2, "参数2", ParameterDirection.Input);
//设置存储过程 返回游标
sqlCmd.Parameters.Add("o_rezht", OracleDbType.RefCursor,ParameterDirection.Output);
//设置存储过程 返回字符串 一定在设置长度
sqlCmd.Parameters.Add("o_z1", OracleDbType.Varchar2,500,"", ParameterDirection.Output);
sqlCmd.CommandType = CommandType.StoredProcedure;//设置 使用存储过程
sqlCmd.ExecuteNonQuery();//执行措辞过程
// 获得参数o_z1 数据
Console.WriteLine("====" + sqlCmd.Parameters[3].Value.ToString());
// 将游标设置成 数据集合读取器对象
OracleDataReader reader = ((OracleRefCursor)sqlCmd.Parameters[2].Value).GetDataReader();
while (reader.Read()){
//读取游标中的数据
Console.WriteLine("====" + reader.GetString(0));
}
conn.Close();
3 调用主函数测试
在PWF项目工程中执行启动后都是启动的PWF窗体,项目为了测试而写的主函数static void Main无法执行。需要在项目上右键属性,在应用程序中设置启动对象为要运行测试的主函。
右键项目
选择属性
设置应用程序中的启动对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ME2aLaCC-1658716922258)(D:\build\Typora\wpf\Snipaste_2021-12-15_17-37-22.png)]
执行主函数
主函数中的 Console.WriteLine打印函数。例如: Console.WriteLine(“====” + reader.GetString(0));
public static void Main(string[] arg) {
Console.WriteLine("====");
}