前言
通过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 /// <summary> 10 /// Oracle数据库操作类 11 /// </summary> 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 /// <summary> 19 /// 测试数据库连接是否正常 20 /// </summary> 21 /// <param name="strConn"></param> 22 /// <returns></returns> 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 /// <summary> 39 /// 执行数据库非查询操作,返回受影响的行数 40 /// </summary> 41 /// <param name="connectionString">数据库连接字符串</param> 42 /// <param name="cmdType">命令的类型</param> 43 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 44 /// <param name="cmdParms">命令参数集合</param> 45 /// <returns>当前查询操作影响的数据行数</returns> 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 /// <summary> 59 /// 执行数据库事务非查询操作,返回受影响的行数 60 /// </summary> 61 /// <param name="transaction">数据库事务对象</param> 62 /// <param name="cmdType">Command类型</param> 63 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 64 /// <param name="cmdParms">命令参数集合</param> 65 /// <returns>当前事务查询操作影响的数据行数</returns> 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 /// <summary> 76 /// 执行数据库非查询操作,返回受影响的行数 77 /// </summary> 78 /// <param name="connection">Oracle数据库连接对象</param> 79 /// <param name="cmdType">Command类型</param> 80 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 81 /// <param name="cmdParms">命令参数集合</param> 82 /// <returns>当前查询操作影响的数据行数</returns> 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 /// <summary> 95 /// 执行数据库查询操作,返回OracleDataReader类型的内存结果集 96 /// </summary> 97 /// <param name="connectionString">数据库连接字符串</param> 98 /// <param name="cmdType">命令的类型</param> 99 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 100 /// <param name="cmdParms">命令参数集合</param> 101 /// <returns>当前查询操作返回的OracleDataReader类型的内存结果集</returns> 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 /// <summary> 122 /// 执行数据库查询操作,返回DataSet类型的结果集 123 /// </summary> 124 /// <param name="connectionString">数据库连接字符串</param> 125 /// <param name="cmdType">命令的类型</param> 126 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 127 /// <param name="cmdParms">命令参数集合</param> 128 /// <returns>当前查询操作返回的DataSet类型的结果集</returns> 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 /// <summary> 158 /// 执行数据库查询操作,返回DataTable类型的结果集 159 /// </summary> 160 /// <param name="connectionString">数据库连接字符串</param> 161 /// <param name="cmdType">命令的类型</param> 162 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 163 /// <param name="cmdParms">命令参数集合</param> 164 /// <returns>当前查询操作返回的DataTable类型的结果集</returns> 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 /// <summary> 195 /// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值 196 /// </summary> 197 /// <param name="connectionString">数据库连接字符串</param> 198 /// <param name="cmdType">命令的类型</param> 199 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 200 /// <param name="cmdParms">命令参数集合</param> 201 /// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns> 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 /// <summary> 228 /// 执行数据库事务查询操作,返回结果集中位于第一行第一列的Object类型的值 229 /// </summary> 230 /// <param name="trans">一个已存在的数据库事务对象</param> 231 /// <param name="commandType">命令类型</param> 232 /// <param name="commandText">Oracle存储过程名称或PL/SQL命令</param> 233 /// <param name="cmdParms">命令参数集合</param> 234 /// <returns>当前事务查询操作返回的结果集中位于第一行第一列的Object类型的值</returns> 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 /// <summary> 268 /// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值 269 /// </summary> 270 /// <param name="conn">数据库连接对象</param> 271 /// <param name="cmdType">Command类型</param> 272 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 273 /// <param name="cmdParms">命令参数集合</param> 274 /// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns> 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 /// <summary> 302 /// 执行数据库命令前的准备工作 303 /// </summary> 304 /// <param name="cmd">Command对象</param> 305 /// <param name="conn">数据库连接对象</param> 306 /// <param name="trans">事务对象</param> 307 /// <param name="cmdType">Command类型</param> 308 /// <param name="cmdText">Oracle存储过程名称或PL/SQL命令</param> 309 /// <param name="cmdParms">命令参数集合</param> 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 /// <summary> 331 /// 将.NET日期时间类型转化为Oracle兼容的日期时间格式字符串 332 /// </summary> 333 /// <param name="date">.NET日期时间类型对象</param> 334 /// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns> 335 public static string GetOracleDateFormat(DateTime date) 336 { 337 return "TO_DATE('" + date.ToString("yyyy-M-dd") + "','YYYY-MM-DD')"; 338 } 339 340 /// <summary> 341 /// 将.NET日期时间类型转化为Oracle兼容的日期格式字符串 342 /// </summary> 343 /// <param name="date">.NET日期时间类型对象</param> 344 /// <param name="format">Oracle日期时间类型格式化限定符</param> 345 /// <returns>Oracle兼容的日期时间格式字符串(如该字符串:TO_DATE('2007-12-1','YYYY-MM-DD'))</returns> 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 /// <summary> 353 /// 将指定的关键字处理为模糊查询时的合法参数值 354 /// </summary> 355 /// <param name="source">待处理的查询关键字</param> 356 /// <returns>过滤后的查询关键字</returns> 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 /// <summary> 10 /// 业务逻辑类,主要封装SQL语句 11 /// </summary> 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 /// <summary> 2 /// 启用编辑、添加 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 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 /// <summary> 17 /// 删除某一行,同步删除数据库表 18 /// </summary> 19 /// <param name="sender"></param> 20 /// <param name="e"></param> 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 /// <summary> 40 /// 保存添加的数据 41 /// </summary> 42 /// <param name="sender"></param> 43 /// <param name="e"></param> 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 /// <summary> 73 /// 更新DataGridView选中行数据 74 /// </summary> 75 /// <param name="sender"></param> 76 /// <param name="e"></param> 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 }