C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查
前言
通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表的增删改查功能。
WinFrm桌面搭建
主要控件:GroupBox、Label、TextBox、Button和DataGridView。
如下图:
NuGet程序包管理 - Oracle.ManagedDataAccess.dll安装
通过NuGet程序包管理界面安装Oracle.managedDataAccess程序包,注意这里我安装的是12.1.24版本,高版本的不好用(坑太多,自己体会)。
安装完成后,Oracle.managedDataAccess.dll文件将会自动添加到Bin文件夹下。
核心代码
Oracle数据库操作封装类OracleHelper.cs
请看代码:
using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using Oracle.ManagedDataAccess.Client;
using System.Text;
using System.IO; /// <summary>
/// Oracle数据库操作类
/// </summary>
public static class OracleHelper
{
//连接字符串
public static string oraConnStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.0.0.0)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=testdb)));Persist Security Info=True;User ID=sa;Password=123"; #region Oracle数据库操作通用方法
/// <summary>
/// 测试数据库连接是否正常
/// </summary>
/// <param name="strConn"></param>
/// <returns></returns>
public static bool CheckOracleConnect(string strConn)
{
try
{
OracleConnection conn = new OracleConnection();
conn.ConnectionString = strConn;
conn.Open();
return true;
}
catch
{
return false;
}
} /// <summary>
/// 执行数据库非查询操作,返回受影响的行数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="cmdType">命令的类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作影响的数据行数</returns>
public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
using (OracleConnection conn = new OracleConnection(connectionString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
}
} /// <summary>
/// 执行数据库事务非查询操作,返回受影响的行数
/// </summary>
/// <param name="transaction">数据库事务对象</param>
/// <param name="cmdType">Command类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前事务查询操作影响的数据行数</returns>
public static int ExecuteNonQuery(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
} /// <summary>
/// 执行数据库非查询操作,返回受影响的行数
/// </summary>
/// <param name="connection">Oracle数据库连接对象</param>
/// <param name="cmdType">Command类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作影响的数据行数</returns>
public static int ExecuteNonQuery(OracleConnection connection, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
if (connection == null)
throw new ArgumentNullException("当前数据库连接不存在");
OracleCommand cmd = new OracleCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return val;
} /// <summary>
/// 执行数据库查询操作,返回OracleDataReader类型的内存结果集
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="cmdType">命令的类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作返回的OracleDataReader类型的内存结果集</returns>
public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return reader;
}
catch
{
cmd.Dispose();
conn.Close();
throw;
}
} /// <summary>
/// 执行数据库查询操作,返回DataSet类型的结果集
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="cmdType">命令的类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作返回的DataSet类型的结果集</returns>
public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
DataSet ds = null;
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = cmd;
ds = new DataSet();
adapter.Fill(ds);
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
} return ds;
} /// <summary>
/// 执行数据库查询操作,返回DataTable类型的结果集
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="cmdType">命令的类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作返回的DataTable类型的结果集</returns>
public static DataTable ExecuteDataTable(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
DataTable dt = null; try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = cmd;
dt = new DataTable();
adapter.Fill(dt);
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
} return dt;
} /// <summary>
/// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="cmdType">命令的类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>
public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
OracleCommand cmd = new OracleCommand();
OracleConnection conn = new OracleConnection(connectionString);
object result = null;
try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
} return result;
} /// <summary>
/// 执行数据库事务查询操作,返回结果集中位于第一行第一列的Object类型的值
/// </summary>
/// <param name="trans">一个已存在的数据库事务对象</param>
/// <param name="commandType">命令类型</param>
/// <param name="commandText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前事务查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>
public static object ExecuteScalar(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
if (trans == null)
throw new ArgumentNullException("当前数据库事务不存在");
OracleConnection conn = trans.Connection;
if (conn == null)
throw new ArgumentException("当前事务所在的数据库连接不存在"); OracleCommand cmd = new OracleCommand();
object result = null; try
{
PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
trans.Dispose();
cmd.Dispose();
conn.Close();
conn.Dispose();
} return result;
} /// <summary>
/// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值
/// </summary>
/// <param name="conn">数据库连接对象</param>
/// <param name="cmdType">Command类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
/// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>
public static object ExecuteScalar(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms)
{
if (conn == null) throw new ArgumentException("当前数据库连接不存在");
OracleCommand cmd = new OracleCommand();
object result = null; try
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
result = cmd.ExecuteScalar();
cmd.Parameters.Clear();
}
catch
{
throw;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
} return result;
} /// <summary>
/// 执行数据库命令前的准备工作
/// </summary>
/// <param name="cmd">Command对象</param>
/// <param name="conn">数据库连接对象</param>
/// <param name="trans">事务对象</param>
/// <param name="cmdType">Command类型</param>
/// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param>
/// <param name="cmdParms">命令参数集合</param>
private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = cmdText; if (trans != null)
cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null)
{
foreach (OracleParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
} /// <summary>
/// 将.NET日期时间类型转化为Oracle兼容的日期时间格式字符串
/// </summary>
/// <param name="date">.NET日期时间类型对象</param>
/// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns>
public static string GetOracleDateFormat(DateTime date)
{
return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','YYYY-MM-DD')";
} /// <summary>
/// 将.NET日期时间类型转化为Oracle兼容的日期格式字符串
/// </summary>
/// <param name="date">.NET日期时间类型对象</param>
/// <param name="format">Oracle日期时间类型格式化限定符</param>
/// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns>
public static string GetOracleDateFormat(DateTime date, string format)
{
if (format == null || format.Trim() == "") format = "YYYY-MM-DD";
return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','" + format + "')";
} /// <summary>
/// 将指定的关键字处理为模糊查询时的合法参数值
/// </summary>
/// <param name="source">待处理的查询关键字</param>
/// <returns>过滤后的查询关键字</returns>
public static string HandleLikeKey(string source)
{
if (source == null || source.Trim() == "") return null; source = source.Replace("[", "[]]");
source = source.Replace("_", "[_]");
source = source.Replace("%", "[%]"); return ("%" + source + "%");
}
#endregion
}
业务逻辑封装类OracleSQL.cs
请看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _004___VS2019连接Oracle数据库并实现数据库表的增删改查
{
/// <summary>
/// 业务逻辑类,主要封装SQL语句
/// </summary>
class OracleSQL
{
// 查询表数据
public static string GetWZJPerson = "select * from wzj_person where name =:name order by syid";
// 模糊查询表数据
public static string GerWZJPersonLike = "select * from wzj_person where name like :name order by syid";
// 根据syid删除数据
public static string DeleteWZJPersonData = "delete from wzj_person where syid = :syid";
// 添加数据
public static string InsertWZJPersonData = "insert into wzj_person(name, age, birthday, syid, ptoneno, workno, address) values(:name, :age, :birthday, :syid, :ptoneno, :workno, :address) ";
// 更新数据
public static string UpdateWZJPersonData = "update wzj_person set name=:name, age=:age, birthday=:birthday, ptoneno=:ptoneno, workno=:workno, address=:address where syid =:syid";
}
}
增删改查
/// <summary>
/// 启用编辑、添加
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAdd_Click(object sender, EventArgs e)
{
// 启用编辑
dgvMain.ReadOnly = false;
// 滚动到最后一行
this.dgvMain.FirstDisplayedScrollingRowIndex = this.dgvMain.Rows.Count - ;
// 选中最后一行
this.dgvMain.Rows[this.dgvMain.Rows.Count - ].Selected = true;
} /// <summary>
/// 删除某一行,同步删除数据库表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDelete_Click(object sender, EventArgs e)
{
// 获取选中行
int strRowIdex = dgvMain.CurrentCell.RowIndex;
// 获取strSyID
string strSyID = dgvMain.Rows[strRowIdex].Cells["SyID"].Value.ToString();
// 创建参数对象
OracleParameter[] param = new OracleParameter[] { new OracleParameter(":SyID", OracleDbType.Varchar2) };
param[].Value = strSyID;
// 删除数据库表
int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.DeleteWZJPersonData, param);
// 移除选中行
dgvMain.Rows.RemoveAt(strRowIdex);
// 消息提示
MessageBox.Show("删除成功!", "提示"); } /// <summary>
/// 保存添加的数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPost_Click(object sender, EventArgs e)
{
// 获取选中行
int strRowIdex = dgvMain.CurrentCell.RowIndex;
// 创建参数对象 name, age, birthday, syid, ptoneno, workno, address
OracleParameter[] param = new OracleParameter[] {
new OracleParameter(":name", OracleDbType.Varchar2),
new OracleParameter(":age", OracleDbType.Int32),
new OracleParameter(":birthday", OracleDbType.Date),
new OracleParameter(":syid", OracleDbType.Varchar2),
new OracleParameter(":ptoneno", OracleDbType.Varchar2),
new OracleParameter(":workno", OracleDbType.Varchar2),
new OracleParameter(":address", OracleDbType.Varchar2)
};
param[].Value = dgvMain.Rows[strRowIdex].Cells["name"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["age"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["birthday"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["syid"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["ptoneno"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["workno"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["address"].Value; // 插入数据库表
int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.InsertWZJPersonData, param);
// 消息提示
MessageBox.Show("保存成功!", "提示");
} /// <summary>
/// 更新DataGridView选中行数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUpdate_Click(object sender, EventArgs e)
{
// 获取选中行
int strRowIdex = dgvMain.CurrentCell.RowIndex;
// 创建参数对象 name, age, birthday, syid, ptoneno, workno, address
OracleParameter[] param = new OracleParameter[] {
new OracleParameter(":name", OracleDbType.Varchar2),
new OracleParameter(":age", OracleDbType.Int32),
new OracleParameter(":birthday", OracleDbType.Date),
new OracleParameter(":ptoneno", OracleDbType.Varchar2),
new OracleParameter(":workno", OracleDbType.Varchar2),
new OracleParameter(":address", OracleDbType.Varchar2),
new OracleParameter(":syid", OracleDbType.Varchar2)
};
param[].Value = dgvMain.Rows[strRowIdex].Cells["name"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["age"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["birthday"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["ptoneno"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["workno"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["address"].Value;
param[].Value = dgvMain.Rows[strRowIdex].Cells["syid"].Value; // 更新数据库表
int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.UpdateWZJPersonData, param);
// 消息提示
MessageBox.Show("更新成功!", "提示");
}
运行效果
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查的更多相关文章
- AngularJS中使用$http对MongoLab数据表进行增删改查
本篇体验使用AngularJS中的$http对MongoLab数据表进行增删改查. 主页面: <button ng-click="loadCourse()">Load ...
- Mysql数据表的增删改查
---恢复内容开始--- Mysql数据表的增删改查 1.创建表 语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...
- MySQL数据库 | 数据表的增删改查
MySQL数据的增删改查(crud) 本文结构 一.增加 create 二.修改 update 三.查询 retrieve(简单查询,下篇详细展开) 四.删除 delete 首先,创建简单的class ...
- C#winform窗体实现对sql server数据库的增删改查
1.运行效果截图 2.输入用户名,密码进行查询 查找成功则显示 查找不成功显示用户信息不存在 3.输入用户名与密码,向数据库中添加用户信息 添加后数据库表信息 4.查看全部信息 5.根据编号信息进行查 ...
- python django对数据表的增删改查操作
新增操作:方式1:book = BookInfo(title='西游记',price=99)book.save() 方式2:BookInfo.objects.create(title='西游记',pr ...
- python利用xmlrpc方式对odoo数据表进行增删改查操作
# -*- encoding: utf-8 -*- import xmlrpclib #导入xmlrpc库,这个库是python的标准库. username ='admin' #用户登录名 pwd = ...
- mysql 数据表的增删改查 目录
mysql 表的增删改查 mysql 表的增删改查 修改表结构 mysql 复制表 mysql 删除表
- oracle 临时表空间的增删改查
oracle 临时表空间的增删改查 oracle 临时表空间的增删改查 1.查看临时表空间 (dba_temp_files视图)(v_$tempfile视图)select tablespace_nam ...
- spool命令、创建一个表,创建而且copy表,查看别的用户下的表,rowid行地址 索引的时候使用,表的增删改查,删除表,oracle的回收站
1.spool命令 spool "D:\test.txt" spool off SQL> host cls 2.创建一个表 SQL> --条件(1):有创建 ...
随机推荐
- netty源码解解析(4.0)-24 ByteBuf基于内存池的内存管理
io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分.PooledByteBu ...
- hibernate 搭建框架
需要用的包 Hibernate的日志记录: * Hibernate日志记录使用了一个slf4j: * SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具 ...
- 虚拟机上安装centos8.0
一.准备宿主机 为了培训Hadoop生态的部署和调优技术,需要准备3台虚拟机部署Hadoop集群环境,能够保证HA,即主要服务没有单点故障,可执行基本功能,完成小内存模式的参数调整. 1.1.准备安装 ...
- 机器学习回顾篇(7):决策树算法(ID3、C4.5)
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- “零基础”如何快速掌握web前端核心技术?
前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,今天想强调一下,学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而且互联 ...
- ArrayList源码解析[一]
ArrayList源码解析[一] 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 在工作中集合list集合用的相对来 ...
- opencv::处理边缘
卷积边界问题 图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理. 处理边缘 ...
- boost::multi_index 多索引容器
#include "stdafx.h" #include <string> #include <boost/multi_index_container.hpp&g ...
- c++异常处理的方法
c++异常处理 程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0:用户输入年龄时输入了一个负数:用 new 运算符动态分配空间时,空间不够导致无法分配:访问数组元素时,下标越界:打开文件读 ...
- Python 爬取豆瓣TOP250实战
学习爬虫之路,必经的一个小项目就是爬取豆瓣的TOP250了,首先我们进入TOP250的界面看看. 可以看到每部电影都有比较全面的简介.其中包括电影名.导演.评分等. 接下来,我们就爬取这些数据,并将这 ...