前言
通过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
请看代码:
1 using System; 2 using System.Data; 3 using System.Collections.Generic; 4 using System.Configuration; 5 using Oracle.ManagedDataAccess.Client; 6 using System.Text; 7 using System.IO; 8 9 ///10 /// Oracle数据库操作类 11 /// 12 public static class OracleHelper 13 { 14 //连接字符串 15 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"; 16 17 #region Oracle数据库操作通用方法 18 /// 19 /// 测试数据库连接是否正常 20 /// 21 /// 22 /// 23 public static bool CheckOracleConnect(string strConn) 24 { 25 try 26 { 27 OracleConnection conn = new OracleConnection(); 28 conn.ConnectionString = strConn; 29 conn.Open(); 30 return true; 31 } 32 catch 33 { 34 return false; 35 } 36 } 37 38 /// 39 /// 执行数据库非查询操作,返回受影响的行数 40 /// 41 /// 数据库连接字符串 42 /// 命令的类型 43 /// Oracle存储过程名称或PL/SQL命令 44 /// 命令参数集合 45 /// 当前查询操作影响的数据行数 46 public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 47 { 48 OracleCommand cmd = new OracleCommand(); 49 using (OracleConnection conn = new OracleConnection(connectionString)) 50 { 51 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 52 int val = cmd.ExecuteNonQuery(); 53 cmd.Parameters.Clear(); 54 return val; 55 } 56 } 57 58 /// 59 /// 执行数据库事务非查询操作,返回受影响的行数 60 /// 61 /// 数据库事务对象 62 /// Command类型 63 /// Oracle存储过程名称或PL/SQL命令 64 /// 命令参数集合 65 /// 当前事务查询操作影响的数据行数 66 public static int ExecuteNonQuery(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 67 { 68 OracleCommand cmd = new OracleCommand(); 69 PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms); 70 int val = cmd.ExecuteNonQuery(); 71 cmd.Parameters.Clear(); 72 return val; 73 } 74 75 /// 76 /// 执行数据库非查询操作,返回受影响的行数 77 /// 78 /// Oracle数据库连接对象 79 /// Command类型 80 /// Oracle存储过程名称或PL/SQL命令 81 /// 命令参数集合 82 /// 当前查询操作影响的数据行数 83 public static int ExecuteNonQuery(OracleConnection connection, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 84 { 85 if (connection == null) 86 throw new ArgumentNullException("当前数据库连接不存在"); 87 OracleCommand cmd = new OracleCommand(); 88 PrepareCommand(cmd, connection, null, cmdType, cmdText, cmdParms); 89 int val = cmd.ExecuteNonQuery(); 90 cmd.Parameters.Clear(); 91 return val; 92 } 93 94 /// 95 /// 执行数据库查询操作,返回OracleDataReader类型的内存结果集 96 /// 97 /// 数据库连接字符串 98 /// 命令的类型 99 /// Oracle存储过程名称或PL/SQL命令 100 /// 命令参数集合 101 /// 当前查询操作返回的OracleDataReader类型的内存结果集 102 public static OracleDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 103 { 104 OracleCommand cmd = new OracleCommand(); 105 OracleConnection conn = new OracleConnection(connectionString); 106 try 107 { 108 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 109 OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 110 cmd.Parameters.Clear(); 111 return reader; 112 } 113 catch 114 { 115 cmd.Dispose(); 116 conn.Close(); 117 throw; 118 } 119 } 120 121 /// 122 /// 执行数据库查询操作,返回DataSet类型的结果集 123 /// 124 /// 数据库连接字符串 125 /// 命令的类型 126 /// Oracle存储过程名称或PL/SQL命令 127 /// 命令参数集合 128 /// 当前查询操作返回的DataSet类型的结果集 129 public static DataSet ExecuteDataSet(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 130 { 131 OracleCommand cmd = new OracleCommand(); 132 OracleConnection conn = new OracleConnection(connectionString); 133 DataSet ds = null; 134 try 135 { 136 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 137 OracleDataAdapter adapter = new OracleDataAdapter(); 138 adapter.SelectCommand = cmd; 139 ds = new DataSet(); 140 adapter.Fill(ds); 141 cmd.Parameters.Clear(); 142 } 143 catch 144 { 145 throw; 146 } 147 finally 148 { 149 cmd.Dispose(); 150 conn.Close(); 151 conn.Dispose(); 152 } 153 154 return ds; 155 } 156 157 /// 158 /// 执行数据库查询操作,返回DataTable类型的结果集 159 /// 160 /// 数据库连接字符串 161 /// 命令的类型 162 /// Oracle存储过程名称或PL/SQL命令 163 /// 命令参数集合 164 /// 当前查询操作返回的DataTable类型的结果集 165 public static DataTable ExecuteDataTable(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 166 { 167 OracleCommand cmd = new OracleCommand(); 168 OracleConnection conn = new OracleConnection(connectionString); 169 DataTable dt = null; 170 171 try 172 { 173 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 174 OracleDataAdapter adapter = new OracleDataAdapter(); 175 adapter.SelectCommand = cmd; 176 dt = new DataTable(); 177 adapter.Fill(dt); 178 cmd.Parameters.Clear(); 179 } 180 catch 181 { 182 throw; 183 } 184 finally 185 { 186 cmd.Dispose(); 187 conn.Close(); 188 conn.Dispose(); 189 } 190 191 return dt; 192 } 193 194 /// 195 /// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值 196 /// 197 /// 数据库连接字符串 198 /// 命令的类型 199 /// Oracle存储过程名称或PL/SQL命令 200 /// 命令参数集合 201 /// 当前查询操作返回的结果集中位于第一行第一列的Object类型的值 202 public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 203 { 204 OracleCommand cmd = new OracleCommand(); 205 OracleConnection conn = new OracleConnection(connectionString); 206 object result = null; 207 try 208 { 209 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 210 result = cmd.ExecuteScalar(); 211 cmd.Parameters.Clear(); 212 } 213 catch 214 { 215 throw; 216 } 217 finally 218 { 219 cmd.Dispose(); 220 conn.Close(); 221 conn.Dispose(); 222 } 223 224 return result; 225 } 226 227 /// 228 /// 执行数据库事务查询操作,返回结果集中位于第一行第一列的Object类型的值 229 /// 230 /// 一个已存在的数据库事务对象 231 /// 命令类型 232 /// Oracle存储过程名称或PL/SQL命令 233 /// 命令参数集合 234 /// 当前事务查询操作返回的结果集中位于第一行第一列的Object类型的值 235 public static object ExecuteScalar(OracleTransaction trans, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 236 { 237 if (trans == null) 238 throw new ArgumentNullException("当前数据库事务不存在"); 239 OracleConnection conn = trans.Connection; 240 if (conn == null) 241 throw new ArgumentException("当前事务所在的数据库连接不存在"); 242 243 OracleCommand cmd = new OracleCommand(); 244 object result = null; 245 246 try 247 { 248 PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms); 249 result = cmd.ExecuteScalar(); 250 cmd.Parameters.Clear(); 251 } 252 catch 253 { 254 throw; 255 } 256 finally 257 { 258 trans.Dispose(); 259 cmd.Dispose(); 260 conn.Close(); 261 conn.Dispose(); 262 } 263 264 return result; 265 } 266 267 /// 268 /// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值 269 /// 270 /// 数据库连接对象 271 /// Command类型 272 /// Oracle存储过程名称或PL/SQL命令 273 /// 命令参数集合 274 /// 当前查询操作返回的结果集中位于第一行第一列的Object类型的值 275 public static object ExecuteScalar(OracleConnection conn, CommandType cmdType, string cmdText, params OracleParameter[] cmdParms) 276 { 277 if (conn == null) throw new ArgumentException("当前数据库连接不存在"); 278 OracleCommand cmd = new OracleCommand(); 279 object result = null; 280 281 try 282 { 283 PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms); 284 result = cmd.ExecuteScalar(); 285 cmd.Parameters.Clear(); 286 } 287 catch 288 { 289 throw; 290 } 291 finally 292 { 293 cmd.Dispose(); 294 conn.Close(); 295 conn.Dispose(); 296 } 297 298 return result; 299 } 300 301 /// 302 /// 执行数据库命令前的准备工作 303 /// 304 /// Command对象 305 /// 数据库连接对象 306 /// 事务对象 307 /// Command类型 308 /// Oracle存储过程名称或PL/SQL命令 309 /// 命令参数集合 310 private static void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, CommandType cmdType, string cmdText, OracleParameter[] cmdParms) 311 { 312 if (conn.State != ConnectionState.Open) 313 conn.Open(); 314 315 cmd.Connection = conn; 316 cmd.CommandText = cmdText; 317 318 if (trans != null) 319 cmd.Transaction = trans; 320 321 cmd.CommandType = cmdType; 322 323 if (cmdParms != null) 324 { 325 foreach (OracleParameter parm in cmdParms) 326 cmd.Parameters.Add(parm); 327 } 328 } 329 330 /// 331 /// 将.NET日期时间类型转化为Oracle兼容的日期时间格式字符串 332 /// 333 /// .NET日期时间类型对象 334 /// Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD')) 335 public static string GetOracleDateFormat(DateTime date) 336 { 337 return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','YYYY-MM-DD')"; 338 } 339 340 /// 341 /// 将.NET日期时间类型转化为Oracle兼容的日期格式字符串 342 /// 343 /// .NET日期时间类型对象 344 /// Oracle日期时间类型格式化限定符 345 /// Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD')) 346 public static string GetOracleDateFormat(DateTime date, string format) 347 { 348 if (format == null || format.Trim() == "") format = "YYYY-MM-DD"; 349 return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','" + format + "')"; 350 } 351 352 /// 353 /// 将指定的关键字处理为模糊查询时的合法参数值 354 /// 355 /// 待处理的查询关键字 356 /// 过滤后的查询关键字 357 public static string HandleLikeKey(string source) 358 { 359 if (source == null || source.Trim() == "") return null; 360 361 source = source.Replace("[", "[]]"); 362 source = source.Replace("_", "[_]"); 363 source = source.Replace("%", "[%]"); 364 365 return ("%" + source + "%"); 366 } 367 #endregion 368 }
业务逻辑封装类OracleSQL.cs
请看代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace _004___VS2019连接Oracle数据库并实现数据库表的增删改查 8 { 9 ///10 /// 业务逻辑类,主要封装SQL语句 11 /// 12 class OracleSQL 13 { 14 // 查询表数据 15 public static string GetWZJPerson = "select * from wzj_person where name =:name order by syid"; 16 // 模糊查询表数据 17 public static string GerWZJPersonLike = "select * from wzj_person where name like :name order by syid"; 18 // 根据syid删除数据 19 public static string DeleteWZJPersonData = "delete from wzj_person where syid = :syid"; 20 // 添加数据 21 public static string InsertWZJPersonData = "insert into wzj_person(name, age, birthday, syid, ptoneno, workno, address) values(:name, :age, :birthday, :syid, :ptoneno, :workno, :address) "; 22 // 更新数据 23 public static string UpdateWZJPersonData = "update wzj_person set name=:name, age=:age, birthday=:birthday, ptoneno=:ptoneno, workno=:workno, address=:address where syid =:syid"; 24 } 25 }
增删改查
1 ///2 /// 启用编辑、添加 3 /// 4 /// 5 /// 6 private void btnAdd_Click(object sender, EventArgs e) 7 { 8 // 启用编辑 9 dgvMain.ReadOnly = false; 10 // 滚动到最后一行 11 this.dgvMain.FirstDisplayedScrollingRowIndex = this.dgvMain.Rows.Count - 1; 12 // 选中最后一行 13 this.dgvMain.Rows[this.dgvMain.Rows.Count - 1].Selected = true; 14 } 15 16 /// 17 /// 删除某一行,同步删除数据库表 18 /// 19 /// 20 /// 21 private void btnDelete_Click(object sender, EventArgs e) 22 { 23 // 获取选中行 24 int strRowIdex = dgvMain.CurrentCell.RowIndex; 25 // 获取strSyID 26 string strSyID = dgvMain.Rows[strRowIdex].Cells["SyID"].Value.ToString(); 27 // 创建参数对象 28 OracleParameter[] param = new OracleParameter[] { new OracleParameter(":SyID", OracleDbType.Varchar2) }; 29 param[0].Value = strSyID; 30 // 删除数据库表 31 int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.DeleteWZJPersonData, param); 32 // 移除选中行 33 dgvMain.Rows.RemoveAt(strRowIdex); 34 // 消息提示 35 MessageBox.Show("删除成功!", "提示"); 36 37 } 38 39 /// 40 /// 保存添加的数据 41 /// 42 /// 43 /// 44 private void btnPost_Click(object sender, EventArgs e) 45 { 46 // 获取选中行 47 int strRowIdex = dgvMain.CurrentCell.RowIndex; 48 // 创建参数对象 name, age, birthday, syid, ptoneno, workno, address 49 OracleParameter[] param = new OracleParameter[] { 50 new OracleParameter(":name", OracleDbType.Varchar2), 51 new OracleParameter(":age", OracleDbType.Int32), 52 new OracleParameter(":birthday", OracleDbType.Date), 53 new OracleParameter(":syid", OracleDbType.Varchar2), 54 new OracleParameter(":ptoneno", OracleDbType.Varchar2), 55 new OracleParameter(":workno", OracleDbType.Varchar2), 56 new OracleParameter(":address", OracleDbType.Varchar2) 57 }; 58 param[0].Value = dgvMain.Rows[strRowIdex].Cells["name"].Value; 59 param[1].Value = dgvMain.Rows[strRowIdex].Cells["age"].Value; 60 param[2].Value = dgvMain.Rows[strRowIdex].Cells["birthday"].Value; 61 param[3].Value = dgvMain.Rows[strRowIdex].Cells["syid"].Value; 62 param[4].Value = dgvMain.Rows[strRowIdex].Cells["ptoneno"].Value; 63 param[5].Value = dgvMain.Rows[strRowIdex].Cells["workno"].Value; 64 param[6].Value = dgvMain.Rows[strRowIdex].Cells["address"].Value; 65 66 // 插入数据库表 67 int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.InsertWZJPersonData, param); 68 // 消息提示 69 MessageBox.Show("保存成功!", "提示"); 70 } 71 72 /// 73 /// 更新DataGridView选中行数据 74 /// 75 /// 76 /// 77 private void btnUpdate_Click(object sender, EventArgs e) 78 { 79 // 获取选中行 80 int strRowIdex = dgvMain.CurrentCell.RowIndex; 81 // 创建参数对象 name, age, birthday, syid, ptoneno, workno, address 82 OracleParameter[] param = new OracleParameter[] { 83 new OracleParameter(":name", OracleDbType.Varchar2), 84 new OracleParameter(":age", OracleDbType.Int32), 85 new OracleParameter(":birthday", OracleDbType.Date), 86 new OracleParameter(":ptoneno", OracleDbType.Varchar2), 87 new OracleParameter(":workno", OracleDbType.Varchar2), 88 new OracleParameter(":address", OracleDbType.Varchar2), 89 new OracleParameter(":syid", OracleDbType.Varchar2) 90 }; 91 param[0].Value = dgvMain.Rows[strRowIdex].Cells["name"].Value; 92 param[1].Value = dgvMain.Rows[strRowIdex].Cells["age"].Value; 93 param[2].Value = dgvMain.Rows[strRowIdex].Cells["birthday"].Value; 94 param[3].Value = dgvMain.Rows[strRowIdex].Cells["ptoneno"].Value; 95 param[4].Value = dgvMain.Rows[strRowIdex].Cells["workno"].Value; 96 param[5].Value = dgvMain.Rows[strRowIdex].Cells["address"].Value; 97 param[6].Value = dgvMain.Rows[strRowIdex].Cells["syid"].Value; 98 99 // 更新数据库表 100 int i = OracleHelper.ExecuteNonQuery(OracleHelper.oraConnStr, CommandType.Text, OracleSQL.UpdateWZJPersonData, param); 101 // 消息提示 102 MessageBox.Show("更新成功!", "提示"); 103 }
运行效果
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。