C# - VS2019 經過DataGridView實現對Oracle數據表的增刪改查

前言

經過VS2019創建WinFrm應用程序,搭建桌面程序後,經過封裝數據庫操做OracleHelper類和業務邏輯操做OracleSQL類,進而經過DataGridView實現對Oracle數據表的增刪改查功能。數據庫

WinFrm桌面搭建

主要控件:GroupBox、Label、TextBox、Button和DataGridView。ide

以下圖:測試

NuGet程序包管理 - Oracle.ManagedDataAccess.dll安裝

經過NuGet程序包管理界面安裝Oracle.managedDataAccess程序包,注意這裏我安裝的是12.1.24版本,高版本的很差用(坑太多,本身體會)。this

安裝完成後,Oracle.managedDataAccess.dll文件將會自動添加到Bin文件夾下。spa

核心代碼

Oracle數據庫操做封裝類OracleHelper.cs

請看代碼:code

  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 }
View Code

業務邏輯封裝類OracleSQL.cs

請看代碼:orm

 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 }
View Code

 增刪改查

  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         }
View Code

運行效果

相關文章
相關標籤/搜索