C#用ADO.NET访问数据库v31
注意:
1、.net6下调试通过。
2、需要引入对应的包(System.Data.SqlClient、System.Data.OleDb、MySql.Data)。
3、localdb版本“13.0.1601.5"。
4、Access支持accdb和mdb(2002-2003),系统提示仅支持Windows系统,在Asp.Net MVC里也调试通过。
5、MySql暂未测试。
调用注意事项:
根据项目需求,建议采用依赖注入或静态变量,以持久化对象。
后期待完善:
1、可使用内部类和读写接口,整合在一起。
2、所有“CommandExecute”方法,连接的打开也应该放到try里。
SQLSERVER:
测试数据库d1,表t1:
CREATE TABLE [dbo].[t1]( [xm] [nvarchar](10) NULL, [nl] [tinyint] NULL ) ON [PRIMARY]
数据:
xm nl zs 20 ls 18 ww 19 t1 21 t2 22
SqlHelper.cs提供操作:
using System.Data; using System.Data.SqlClient; namespace WanJinLiuSoft.DBHelper { internal partial class SqlHelper { SqlConnection connection; SqlDataAdapter adapter; SqlCommand command; DataSet ds; public SqlHelper(string ip_add, string user_name, string user_pass, string db_name) { string s1 = $"server={ip_add};initial catalog={db_name};user ID={user_name};password={user_pass};"; connection = new SqlConnection(s1); adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand(); adapter.SelectCommand.Connection = connection; command = new SqlCommand(); command.Connection = connection; ds = new DataSet(); } public DataTable 读(string sql) { ds.Clear(); adapter.SelectCommand.CommandText = sql; return AdapterRead(); } public DataTable 读_参数化(FormattableString sql) { ds.Clear(); set_Command(sql); adapter.SelectCommand = command; return AdapterRead(); } public string 写(string sql) { command.CommandText = sql; return CommandExecute(); } public string 写_参数化(FormattableString sql) { set_Command(sql); return CommandExecute(); } } }
SqlHelper_Function.cs提供辅助:
using System.Data; namespace WanJinLiuSoft.DBHelper { internal partial class SqlHelper { void set_Command(FormattableString x) { var t = x.Format; var args = x.GetArguments(); command.Parameters.Clear(); for (int i = 0; i < args.Length; i++) { t = t.Replace("{" + i + "}", $"@p{i}"); command.Parameters.AddWithValue($"p{i}", args[i]); } command.CommandText = t; } DataTable AdapterRead() { try { adapter.Fill(ds); return ds.Tables[0]; } catch (Exception e) { DataTable table = new DataTable(); DataColumn column; DataRow row; column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Message"; table.Columns.Add(column); row = table.NewRow(); row[0] = e.Message; table.Rows.Add(row); return table; } } string CommandExecute() { connection.Open(); try { return command.ExecuteNonQuery().ToString(); } catch (Exception e) { return e.Message; } finally { connection.Close(); } } } }
调试代码:
static void Main(string[] args) { var t1 = "t2"; var t2 = 22; var db = new SqlHelper("(localdb)\\mssqllocaldb","sa","123456","d1"); Console.WriteLine(db.写("delete from t1 where xm='t1'")); Console.WriteLine(db.写_参数化($"delete from t1 where xm={t1}")); var dt = db.读_参数化($"select * from t1"); showTable(dt); Console.WriteLine(db.写("insert into t1 values('t1',21)")); Console.WriteLine(db.写_参数化($"insert into t1 values({t1},{t2})")); dt = db.读_参数化($"select * from t1"); showTable(dt); } static void showTable(System.Data.DataTable t) { for (int i = 0; i < t.Rows.Count; i++) { for (int j = 0; j < t.Columns.Count; j++) { Console.Write($"{t.Rows[i][j]}\t"); } Console.WriteLine(); } }
运行结果:
1 1 zs 20 ls 18 ww 19 1 1 zs 20 ls 18 ww 19 t1 21 t2 22
Access:
测试数据库d1.accdb(mdb亲测可用),表t1:
数据:
ID xm nl 1 zs 20 2 ls 18 3 ww 19
帮助类OleHelper.cs:
1 using System.Data; 2 using System.Data.OleDb; 3 4 namespace WanJinLiuSoft.DBHelper 5 { 6 internal partial class AccessHelper 7 { 8 OleDbConnection connection; 9 OleDbDataAdapter adapter; 10 OleDbCommand command; 11 DataSet ds; 12 public AccessHelper(string dbpath)// @"\data\example1.mdb" 13 { 14 string s1, s2; 15 16 s1 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="; 17 18 s2 = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + dbpath; 19 20 try 21 { 22 connection = new OleDbConnection(s1 + s2); 23 adapter = new OleDbDataAdapter(); 24 adapter.SelectCommand = new OleDbCommand(); 25 adapter.SelectCommand.Connection = connection; 26 command = new OleDbCommand(); 27 command.Connection = connection; 28 ds = new DataSet(); 29 } 30 catch (Exception e1) 31 { 32 throw new Exception(e1.Message + "仅限Windows系统使用?"); 33 } 34 } 35 public DataTable 读(string sql) 36 { 37 ds.Clear(); 38 adapter.SelectCommand.CommandText = sql; 39 return AdapterRead(); 40 } 41 public DataTable 读_参数化(FormattableString sql) 42 { 43 ds.Clear(); 44 set_Command(sql); 45 adapter.SelectCommand = command; 46 return AdapterRead(); 47 } 48 public string 写(string sql) 49 { 50 command.CommandText = sql; 51 return CommandExecute(); 52 53 } 54 55 public string 写_参数化(FormattableString sql) 56 { 57 set_Command(sql); 58 return CommandExecute(); 59 } 60 } 61 }
帮助辅助类OleHelper_Function.cs:
1 using System.Data; 2 3 namespace WanJinLiusoft.DBHelper 4 { 5 internal partial class AccessHelper 6 { 7 void set_Command(FormattableString x) 8 { 9 var t = x.Format; 10 var args = x.GetArguments(); 11 command.Parameters.Clear(); 12 for (int i = 0; i < args.Length; i++) 13 { 14 t = t.Replace("{" + i + "}", $"@p{i}"); 15 command.Parameters.AddWithValue($"p{i}", args[i]); 16 } 17 command.CommandText = t; 18 } 19 DataTable AdapterRead() 20 { 21 try 22 { 23 adapter.Fill(ds); 24 return ds.Tables[0]; 25 } 26 catch (Exception e) 27 { 28 DataTable table = new DataTable(); 29 DataColumn column; 30 DataRow row; 31 32 column = new DataColumn(); 33 column.DataType = System.Type.GetType("System.String"); 34 column.ColumnName = "Message"; 35 table.Columns.Add(column); 36 37 row = table.NewRow(); 38 row[0] = e.Message; 39 table.Rows.Add(row); 40 41 return table; 42 } 43 } 44 string CommandExecute() 45 { 46 connection.Open(); 47 try 48 { 49 return command.ExecuteNonQuery().ToString(); 50 } 51 catch (Exception e) 52 { 53 return e.Message; 54 } 55 finally 56 { 57 connection.Close(); 58 } 59 } 60 } 61 }
测试主程序:
using System.Data; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { var t1 = "t2"; var t2 = 22; var db = new AccessHelper( @"\data\d1.mdb"); Console.WriteLine(db.写("insert into t1(xm,nl) values('t1',21)")); Console.WriteLine(db.写_参数化($"insert into t1(xm,nl) values({t1},{t2})")); var dt = db.读_参数化($"select * from t1"); showTable(dt); Console.WriteLine(db.写("delete from t1 where xm='t1'")); Console.WriteLine(db.写_参数化($"delete from t1 where xm={t1}")); dt = db.读_参数化($"select * from t1"); showTable(dt); } static void showTable(DataTable t) { for (int i = 0; i < t.Rows.Count; i++) { for (int j = 0; j < t.Columns.Count; j++) { Console.Write($"{t.Rows[i][j]}\t"); } Console.WriteLine(); } } } }
运行结果:
1 1 1 zs 20 2 ls 18 3 ww 19 4 t1 21 5 t2 22 1 1 1 zs 20 2 ls 18 3 ww 19
MySql(如前所述,待验证,注意下载的NuGet包是“MySql.Data”):
操作类MySqlHelper.cs:
using System.Data; using MySql.Data.MySqlClient; namespace WanJinLiuSoft.DBHelper { internal partial class MySqlHelper { MySqlConnection connection; MySqlDataAdapter adapter; MySqlCommand command; DataSet ds; public MySqlHelper(string ip_add, string user_name, string user_pass, string db_name) { string s1 = $"server={ip_add};initial catalog={db_name};user ID={user_name};password={user_pass};"; connection = new MySqlConnection(s1); adapter = new MySqlDataAdapter(); adapter.SelectCommand = new MySqlCommand(); adapter.SelectCommand.Connection = connection; command = new MySqlCommand(); command.Connection = connection; ds = new DataSet(); } public DataTable 读(string sql) { ds.Clear(); adapter.SelectCommand.CommandText = sql; return AdapterRead(); } public DataTable 读_参数化(FormattableString sql) { ds.Clear(); set_Command(sql); adapter.SelectCommand = command; return AdapterRead(); } public string 写(string sql) { command.CommandText = sql; return CommandExecute(); } public string 写_参数化(FormattableString sql) { set_Command(sql); return CommandExecute(); } } }
操作辅助类MySqlHelper_Function.cs:
using System.Data; namespace WanJinLiuSoft.DBHelper { internal partial class MySqlHelper { void set_Command(FormattableString x) { var t = x.Format; var args = x.GetArguments(); command.Parameters.Clear(); for (int i = 0; i < args.Length; i++) { t = t.Replace("{" + i + "}", $"?p{i}"); command.Parameters.AddWithValue($"p{i}", args[i]); } command.CommandText = t; } DataTable AdapterRead() { try { adapter.Fill(ds); return ds.Tables[0]; } catch (Exception e) { DataTable table = new DataTable(); DataColumn column; DataRow row; column = new DataColumn(); column.DataType = System.Type.GetType("System.String"); column.ColumnName = "Message"; table.Columns.Add(column); row = table.NewRow(); row[0] = e.Message; table.Rows.Add(row); return table; } } string CommandExecute() { connection.Open(); try { return command.ExecuteNonQuery().ToString(); } catch (Exception e) { return e.Message; } finally { connection.Close(); } } } }