原生OracleClient驱动在工具中自带驱动,引入简单使用起来也很方便,提供了对数据库原生操作的API函数。开发的时候通过API函数来执行与操作SQL语句来完成对应的业务逻辑。但是缺点也很明显,PWF程序发打包成客户端之后安装到客户机器运行的时候,在客户的机器上同样也需要安装oracle客户端,才能来完成对数据库的操作。使用起来维护起来很不方便,开发调试还可以,但是正是项目部太适合。System.Data.OracleClient驱动运行的原理就是操作本机上的Oracle客户端来与Oracle服务进行通行。

引入数据库驱动

wpf access 数据库 wpf建立数据库_wpf access 数据库


检索到oracle驱动加载

wpf access 数据库 wpf建立数据库_SQL_02


Oracle.ManagedDataAccess 驱动引入

Oracle.ManagedDataAccess驱动需要在Nuget中下载到项目工程中来,在引入Oracle.ManagedDataAccess驱动后通过API函数来操作数据库,Oracle.ManagedDataAccess驱动与System.Data.OracleClient驱动最大的区别就是Oracle.ManagedDataAccess不需要本机安装Oracle客户端。发布程序后在客户端机器上不需要在安装Oracle客户端那么麻烦,维护起来非常方便。

wpf access 数据库 wpf建立数据库_数据库_03

wpf access 数据库 wpf建立数据库_数据库_04

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无法执行。需要在项目上右键属性,在应用程序中设置启动对象为要运行测试的主函。

右键项目

wpf access 数据库 wpf建立数据库_wpf access 数据库_05

选择属性

wpf access 数据库 wpf建立数据库_数据库_06


wpf access 数据库 wpf建立数据库_wpf_07

设置应用程序中的启动对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ME2aLaCC-1658716922258)(D:\build\Typora\wpf\Snipaste_2021-12-15_17-37-22.png)]

执行主函数

wpf access 数据库 wpf建立数据库_c#_08

主函数中的 Console.WriteLine打印函数。例如: Console.WriteLine(“====” + reader.GetString(0));

public static void Main(string[] arg) {
    Console.WriteLine("====");
}