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

前言

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

WinFrm桌面搭建

主要控件:GroupBox、Label、TextBox、Button和DataGridView。數據庫

以下圖:ide

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

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

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

核心代碼

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

請看代碼:url

 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

請看代碼:spa

 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

運行效果

 

  做者:Jeremy.Wu
  出處:https://www.cnblogs.com/jeremywucnblog/
  本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。 code

原文出處:https://www.cnblogs.com/jeremywucnblog/p/11848235.htmlorm

相關文章
相關標籤/搜索