使用 .net 程序操作数据库 ======================= 除了使用SQL内核执行SQL语句直接操作数据库,使用最多的是使用用.net程序操作数据库: + ado.net 原生操作 + 使用ORM框架,比如 Daper、EFCore、SqlSugar、FreeSQL等 ## 初始化 ```csharp #!import "./Base.ipynb" //共享 #r "nuget:Microsoft.Data.SqlClient" #r "nuget:MySql.Data" #r "nuget:Npgsql" #r "nuget:Microsoft.Data.Sqlite" #r "nuget:DuckDB.NET.Data.Full" #r "nuget:Dapper" #r "nuget:Microsoft.EntityFrameworkCore" #r "nuget:Microsoft.EntityFrameworkCore.SqlServer" #r "nuget:Microsoft.EntityFrameworkCore.Sqlite" #r "nuget:Npgsql.EntityFrameworkCore.PostgreSQL" #r "nuget:MySql.EntityFrameworkCore" //#r "nuget:Pomelo.EntityFrameworkCore.MySql" #r "nuget:MongoDB.EntityFrameworkCore" global using System.Text.Json; global using System.Text.Json.Schema; global using System.Text.Json.Serialization; global using System.Data; global using System.Data.Common; global using System.Data.SqlTypes; global using System.Data.SqlClient; //global using System.Data.OracleClient; global using Microsoft.Data.SqlClient; global using Microsoft.Data.SqlClient.Server; global using MySql.Data; global using MySql.Data.Types; global using MySql.Data.MySqlClient; global using Microsoft.Data.Sqlite; global using DuckDB.NET.Data; global using DuckDB.NET.Data.DataChunk; global using Dapper; global using Npgsql; global using Npgsql.Schema; global using Npgsql.PostgresTypes; global using Npgsql.TypeMapping; global using Npgsql.Util; global using Npgsql.NameTranslation; global using Npgsql.BackendMessages; global using Microsoft.EntityFrameworkCore; global using Microsoft.EntityFrameworkCore.SqlServer; global using Microsoft.EntityFrameworkCore.Sqlite; global using Npgsql.EntityFrameworkCore.PostgreSQL; global using MySql.EntityFrameworkCore; global using MongoDB.EntityFrameworkCore; //共享方法 public static List DatatableToStudent(DataTable studentTable) { var students = new List(); if(studentTable == null) { return students; } if(studentTable.Columns.Count ==0) { return students; } if(studentTable.Rows.Count <=0) { return students; } foreach(DataRow row in studentTable.Rows) { var student = new Student() { Id = (int)row["Id"], Name = row["Name"] == DBNull.Value ? "" : (string)row["Name"].ToString(), Age = row["Age"] == DBNull.Value ? 0 : (int)row["Age"] }; students.Add(student); } return students; } ``` ## 使用 ADO.NET ### SQL Server 数据库(2019为例) ```csharp //Ado.Net 操作SQL Server { DataSet ds = new DataSet(); using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString)) { mssqlConnection.Open(); var querySql = "select * FROM student where age >@age;"; SqlParameter[] parameters = new SqlParameter[] { new SqlParameter() { ParameterName = "age", SqlDbType = SqlDbType.Int, Value = 50, Direction = ParameterDirection.Input, Size = 4, DbType = DbType.Int32, IsNullable = false, } }; var command = new SqlCommand(querySql, mssqlConnection); command.Parameters.AddRange(parameters); var adapter = new SqlDataAdapter(command); adapter.Fill(ds); mssqlConnection.Close(); mssqlConnection.Dispose(); } var students = DatatableToStudent(ds.Tables[0]); Console.WriteLine($"查询到: {students.Count()} 行数据"); var jsonText = System.Text.Json.JsonSerializer.Serialize(students.Take(2), new System.Text.Json.JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All), WriteIndented = false, }); Console.WriteLine($"前2行:{jsonText}"); } ``` ### MySQL ```csharp //Ado.Net 操作MySQL { //查询数据 DataSet ds = new DataSet(); using(var sqlConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString)) { sqlConnection.Open(); var querySql = "SELECT * FROM `Student` LIMIT 2;"; var command = new MySqlCommand(querySql, sqlConnection); var adapter = new MySqlDataAdapter(command); adapter.Fill(ds); sqlConnection.Close(); sqlConnection.Dispose(); } //输出数据 var dt = ds.Tables[0]; int padRightCount = 15; //输出列 List columnNames = new List(100); foreach(DataColumn c in dt.Columns) { columnNames.Add(c.ColumnName.PadRight(padRightCount)); } Console.WriteLine(string.Join("", columnNames)); //输出数据 foreach(DataRow row in dt.Rows) { List rowItemValues = new List(100); for(int i=0; i columnNames = new List(100); foreach(DataColumn c in dt.Columns) { columnNames.Add(c.ColumnName.PadRight(padRightCount)); } Console.WriteLine(string.Join("", columnNames)); //输出数据 foreach(DataRow row in dt.Rows) { List rowItemValues = new List(100); for(int i=0; i columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList(); Console.WriteLine(string.Join("", columnNames)); //循环输出行数据 while (await reader.ReadAsync()) { List rowItemValues = new List(100); for(int i=0; i(i).ToString(); rowItemValues.Add(valueText.PadRight(padRightCount)); } Console.WriteLine(string.Join("",rowItemValues)); } } } ``` ### SQLite ```csharp //Ado.Net 操作SQLite { //查询数据 DataSet ds = new DataSet(); int padRightCount = 15; using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString)) { sqlConnection.Open(); var querySql = """ SELECT * FROM Student LIMIT 5; """; var cmd = sqlConnection.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = querySql; using (var reader = await cmd.ExecuteReaderAsync()) { //输出列名 List columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList(); Console.WriteLine(string.Join("", columnNames)); //循环输出行数据 while (await reader.ReadAsync()) { List rowItemValues = new List(100); for(int i=0; i(i).ToString(); rowItemValues.Add(valueText.PadRight(padRightCount)); } Console.WriteLine(string.Join("",rowItemValues)); } } sqlConnection.Close(); sqlConnection.Dispose(); } } ``` ### DuckDB ```csharp //Ado.Net 操作DuckDB数据库 { int padRightCount = 15; using(var sqlConnection = new DuckDBConnection(SharedDbConnect.DuckDBConnectionString)) { sqlConnection.Open(); //1、创建表 var createTableSql = """ CREATE TABLE Student ( Id INTEGER, Name TEXT, Age INTEGER ); """; var createCommand = sqlConnection.CreateCommand(); createCommand.CommandType = CommandType.Text; createCommand.CommandText = createTableSql; var createCount = createCommand.ExecuteNonQuery(); //Console.WriteLine($"{createCount}"); //2、插入示例数据 var insertSql = """ INSERT INTO Student VALUES (1, '张三', 10), (2, '李四', 33), (3, '王五', 66); """; var insertCommand = sqlConnection.CreateCommand(); insertCommand.CommandType = CommandType.Text; insertCommand.CommandText = insertSql; var insertCount = insertCommand.ExecuteNonQuery(); //Console.WriteLine($"{insertCount}"); //3、查询数据 var querySql = """ SELECT * FROM Student ORDER BY Age """; var queryCommand = sqlConnection.CreateCommand(); queryCommand.CommandType = CommandType.Text; queryCommand.CommandText = querySql; using (var reader = await queryCommand.ExecuteReaderAsync()) { //输出列名 List columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList(); Console.WriteLine(string.Join("", columnNames)); //循环输出行数据 while (await reader.ReadAsync()) { List rowItemValues = new List(100); for(int i=0; i(querySql).Take(2); var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All), WriteIndented = false, }); Console.WriteLine(jsonText); } } ``` ### Dapper 操作 MySQL ```csharp //Dapper 操作MySQL { using(var dbConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString)) { var querySql = "SELECT * FROM `Student` LIMIT @top;"; var students = dbConnection.Query(querySql, new {top=2}); var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All), WriteIndented = false, }); Console.WriteLine(jsonText); } } ``` ### Dapper 操作 PostgreSQL ```csharp //Dapper 操作 PSQL { using(var dbConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString)) { var querySql = "SELECT * FROM \"Student\" Where \"Age\" > @Age LIMIT @Top;"; var students = dbConnection.Query(querySql, new {Age = 50, top = 2}); var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions() { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All), WriteIndented = false, }); Console.WriteLine(jsonText); } } ``` ## 使用 EF Core ```csharp //共享 /// /// SQL Server DbContext /// public class StudyDbContext: DbContext { public StudyDbContext(DbContextOptions option):base(option) { } public DbSet Student {get; set;} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if(!optionsBuilder.IsConfigured) { Console.WriteLine("没有设置"); } } } ``` ### EF Core 操作 SQL Server ```csharp { //EF Core SQL Server var builder = new DbContextOptionsBuilder(); builder.UseSqlServer(SharedDbConnect.MsSqlConnectionString); var dbContext = new StudyDbContext(builder.Options); var students = dbContext.Student.Where(s => s.Age> 95).ToList(); students.Display(); } ``` ### EF Core 查询 MySQL ```csharp { //EF Core MySQL var builder = new DbContextOptionsBuilder(); builder.UseMySQL(SharedDbConnect.MySQLConnectionString); var dbContext = new StudyDbContext(builder.Options); var students = dbContext.Student.Where(s => s.Age> 95).ToList(); students.Display(); } ``` ### EFCore PostgreSQL ```csharp { var builder = new DbContextOptionsBuilder(); builder.UseNpgsql(SharedDbConnect.PSQLConnectionString); var dbContext = new StudyDbContext(builder.Options); var students = dbContext.Student.Where(s => s.Age> 95).ToList(); students.Display(); } ```