寫在前面:
這里的代碼只是為了同學們學習的時候入門,很多該優化、簡寫的東西都沒有處理。
這種訪問數據庫的方法還存在嚴重的安全漏洞(sql注入漏洞),實際開發中禁止使用。
工作中可以使用改良后的類,安全,結構復雜,使用方法類似。不利於此處學習,故不在此列出。
數據庫操作類代碼:
1 #define WIN 2 //#define NET 3 //********ACCESS要開類型和版本兩個****** 4 //#define ACCESS 5 //#define ACCESS_2003 6 //#define ACCESS_2010 7 //********EXCEL開一個具體版本就行了****** 8 //(#define EXCEL) 9 //#define EXCEL_2010 10 //******************************** 11 #define SQLSERVER 12 //(sql2000測試通過) 13 //******************************* 14 //#define MYSQL 15 16 using System; 17 using System.Collections.Generic; 18 using System.Linq; 19 using System.Text; 20 using System.Data; 21 using System.Data.OleDb; 22 using System.Data.SqlClient; 23 //using MySql.Data.MySqlClient; 24 #if NET 25 using System.Web; 26 #endif 27 28 namespace HC 29 { 30 //操作access等數據庫的類 31 class Hc_db 32 { 33 public Hc_db() 34 { 35 } 36 #if SQLSERVER 37 static SqlConnection createConn() 38 #elif MYSQL 39 static MySqlConnection createConn() 40 #else 41 static OleDbConnection createConn() 42 #endif 43 { 44 #if SQLSERVER 45 string s1 = "server=(localdb)\\mssqllocaldb;initial catalog=d1;user ID=sa;password=123456;"; 46 #endif 47 #if ACCESS_2003 48 string s1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; 49 #endif 50 #if ACCESS_2010 51 string s1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="; 52 #endif 53 #if ACCESS 54 #if NET 55 string s2 =@HttpContext.Current.Server.MapPath(@"~/data/d1.accdb"); 56 #endif 57 #if WIN 58 string s2 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)+@"\data\yangbiao.mdb"; 59 #endif 60 #endif 61 62 #if EXCEL_2010 63 string s1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="; 64 #if NET 65 string s2 =@HttpContext.Current.Server.MapPath(@"~/data/e1.xlsx")+";Extended Properties='Excel 12.0;HDR=YES'";//HDR=YES表示有標題 66 #endif 67 #if WIN 68 string s2 =System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)+@"\data\e1.xlsx"+";Extended Properties='Excel 12.0;HDR=YES'";//HDR=YES表示有標題 69 #endif 70 //說明: 71 //若要引用完全使用的工作表的范圍,請指定后面跟有美元符號的工作表名稱。例如: 72 //select * from [Sheet1$] 73 //若要引用工作表上的特定地址范圍,請指定后面跟有美元符號和該范圍的工作表名稱。例如: 74 //select * from [Sheet1$A1:B10] 75 //關於IMEX: 76 //若為 0,則為輸出模式,此情況下只能用作寫入 Excel; 77 //若為 1,則為輸入模式,此情況下只能用作讀取 Excel,並且始終將 Excel 數據作為文本類型讀取; 78 //若為 2,則為連接模式,此情況下既可用作寫入、也可用作讀取。 79 //所以若要讀取混合數據類型,應該將 IMEX 設置為 1;若誤設置為 0,則讀取不到任何行;若誤設置為 2 或省略,則有些數據讀取出來是空白。 80 //注意:輸出模式對應寫入、輸入模式對應讀取。 81 #endif 82 #if MYSQL 83 string s1 = "Database=ipt_authd;Data Source=10.10.XXX.XXX;User Id=XXXX;allow zero datetime=true"; 84 //標准寫法:myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"; 85 #endif 86 #if SQLSERVER 87 SqlConnection conn = new SqlConnection(s1); 88 #elif MYSQL 89 MySqlConnection conn = new MySqlConnection(s1); 90 #else 91 OleDbConnection conn = new OleDbConnection(s1+s2); 92 #endif 93 return conn; 94 } 95 96 public static DataTable get_datatable(string s1) 97 { 98 #if SQLSERVER 99 SqlConnection myconn = Hc_db.createConn(); 100 SqlDataAdapter myda = new SqlDataAdapter(s1, myconn); 101 #elif MYSQL 102 MySqlConnection myconn = Hc_db.createConn(); 103 MySqlDataAdapter myda = new MySqlDataAdapter(s1, myconn); 104 #else 105 OleDbConnection myconn = Hc_db.createConn(); 106 OleDbDataAdapter myda = new OleDbDataAdapter(s1, myconn); 107 #endif 108 DataSet myds = new DataSet(); 109 try 110 { 111 myconn.Open(); 112 myda.Fill(myds, "No1"); 113 myconn.Close(); 114 //myconn.Dispose(); 115 return myds.Tables["No1"]; 116 } 117 catch (Exception e1) 118 { 119 throw (e1); 120 } 121 } 122 public static int do_nonquery(string s1) 123 { 124 #if SQLSERVER 125 SqlConnection myconn = Hc_db.createConn(); 126 SqlCommand mycomm = new SqlCommand(s1, myconn); 127 #elif MYSQL 128 MySqlConnection myconn = Hc_db.createConn(); 129 MySqlCommand mycomm = new MySqlCommand(s1, myconn); 130 #else 131 OleDbConnection myconn = Hc_db.createConn(); 132 OleDbCommand mycomm = new OleDbCommand(s1, myconn); 133 #endif 134 try 135 { 136 int c; 137 myconn.Open(); 138 c = mycomm.ExecuteNonQuery(); 139 myconn.Close(); 140 //myconn.Dispose(); 141 return c; 142 } 143 catch (Exception e1) 144 { 145 //HttpContext.Current.Response.Write("<script language='javascript' defer>alert('" + e1.ToString() + "');</script>"); 146 throw (e1); 147 //return false; 148 } 149 } 150 } 151 } 152 //INSERT INTO 表 [(字段1[,字段2[, ...]])] 153 ////VALUES (值1[,值2[, ...]) 154 // string str_sql = "insert into myt1(姓名,性別,年齡) values('"+textBox2.Text+"','"+textBox3.Text+"',"+textBox4.Text+")";
以上代碼可用作控制台下操作localdb數據庫。對於其他的sqlserver,修改第45行信息。
在mvc等web環境下使用,修改前兩行即可。
數據庫內容如下:
控制台程序如下:
static void Main(string[] args) { DataTable dt; string sql; sql = "select * from t1"; dt = Hc_db.get_datatable(sql); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { Console.Write(dt.Rows[i][j].ToString()+"\t"); } Console.WriteLine(); ; } Hc_db.do_nonquery("delete from t1 where xm='ls'"); dt = Hc_db.get_datatable(sql); Console.WriteLine(dt.Rows.Count); Console.ReadKey(); }
運行結果: