PolyglotNotebooksStudy/Docs/多语言笔记.2.2.操作数据库-C#.ipynb

1049 lines
59 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "19839fa7",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"source": [
"使用 .net 程序操作数据库\n",
"=======================\n",
"除了使用SQL内核执行SQL语句直接操作数据库使用最多的是使用用.net程序操作数据库\n",
"+ ado.net 原生操作\n",
"+ 使用ORM框架比如 Daper、EFCore、SqlSugar、FreeSQL等"
]
},
{
"cell_type": "markdown",
"id": "4ca948bd",
"metadata": {},
"source": [
"## 初始化"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "4f5767d2",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>Dapper, 2.1.66</span></li><li><span>DuckDB.NET.Data.Full, 1.2.1</span></li><li><span>Microsoft.Data.SqlClient, 6.0.1</span></li><li><span>Microsoft.Data.Sqlite, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore.Sqlite, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore.SqlServer, 9.0.4</span></li><li><span>MongoDB.EntityFrameworkCore, 9.0.0</span></li><li><span>MySql.Data, 9.3.0</span></li><li><span>MySql.EntityFrameworkCore, 9.0.3</span></li><li><span>Npgsql, 9.0.3</span></li><li><span>Npgsql.EntityFrameworkCore.PostgreSQL, 9.0.4</span></li></ul></div></div>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>Microsoft.Extensions.Configuration, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.Binder, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.CommandLine, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.EnvironmentVariables, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.ini, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.json, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.KeyPerFile, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.UserSecrets, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.xml, 9.0.4</span></li><li><span>microsoft.extensions.dependencyinjection, 9.0.4</span></li><li><span>microsoft.extensions.logging, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Configuration, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Console, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Debug, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.EventSource, 9.0.4</span></li><li><span>microsoft.extensions.options, 9.0.4</span></li><li><span>Microsoft.Extensions.Options.ConfigurationExtensions, 9.0.4</span></li><li><span>Microsoft.Extensions.Options.DataAnnotations, 9.0.4</span></li></ul></div></div>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#!import \"./Base.ipynb\"\n",
"\n",
"//共享\n",
"#r \"nuget:Microsoft.Data.SqlClient\"\n",
"#r \"nuget:MySql.Data\"\n",
"#r \"nuget:Npgsql\"\n",
"#r \"nuget:Microsoft.Data.Sqlite\"\n",
"#r \"nuget:DuckDB.NET.Data.Full\"\n",
"\n",
"#r \"nuget:Dapper\"\n",
"\n",
"#r \"nuget:Microsoft.EntityFrameworkCore\"\n",
"#r \"nuget:Microsoft.EntityFrameworkCore.SqlServer\"\n",
"#r \"nuget:Microsoft.EntityFrameworkCore.Sqlite\"\n",
"#r \"nuget:Npgsql.EntityFrameworkCore.PostgreSQL\"\n",
"#r \"nuget:MySql.EntityFrameworkCore\"\n",
"//#r \"nuget:Pomelo.EntityFrameworkCore.MySql\"\n",
"#r \"nuget:MongoDB.EntityFrameworkCore\"\n",
"\n",
"global using System.Text.Json;\n",
"global using System.Text.Json.Schema;\n",
"global using System.Text.Json.Serialization;\n",
"\n",
"global using System.Data;\n",
"global using System.Data.Common;\n",
"global using System.Data.SqlTypes;\n",
"global using System.Data.SqlClient;\n",
"//global using System.Data.OracleClient;\n",
"\n",
"global using Microsoft.Data.SqlClient;\n",
"global using Microsoft.Data.SqlClient.Server;\n",
"\n",
"global using MySql.Data;\n",
"global using MySql.Data.Types;\n",
"global using MySql.Data.MySqlClient;\n",
"\n",
"global using Microsoft.Data.Sqlite;\n",
"\n",
"global using DuckDB.NET.Data;\n",
"global using DuckDB.NET.Data.DataChunk;\n",
"\n",
"global using Dapper;\n",
"\n",
"global using Npgsql;\n",
"global using Npgsql.Schema;\n",
"global using Npgsql.PostgresTypes;\n",
"global using Npgsql.TypeMapping;\n",
"global using Npgsql.Util;\n",
"global using Npgsql.NameTranslation;\n",
"global using Npgsql.BackendMessages;\n",
"\n",
"\n",
"global using Microsoft.EntityFrameworkCore;\n",
"global using Microsoft.EntityFrameworkCore.SqlServer;\n",
"global using Microsoft.EntityFrameworkCore.Sqlite;\n",
"global using Npgsql.EntityFrameworkCore.PostgreSQL;\n",
"global using MySql.EntityFrameworkCore;\n",
"global using MongoDB.EntityFrameworkCore;\n",
"\n",
"//共享方法\n",
"public static List<Student> DatatableToStudent(DataTable studentTable)\n",
"{\n",
" var students = new List<Student>();\n",
" if(studentTable == null)\n",
" {\n",
" return students;\n",
" }\n",
"\n",
" if(studentTable.Columns.Count ==0)\n",
" {\n",
" return students;\n",
" }\n",
"\n",
" if(studentTable.Rows.Count <=0)\n",
" {\n",
" return students;\n",
" }\n",
"\n",
" foreach(DataRow row in studentTable.Rows)\n",
" {\n",
" var student = new Student()\n",
" {\n",
" Id = (int)row[\"Id\"],\n",
" Name = row[\"Name\"] == DBNull.Value ? \"\" : (string)row[\"Name\"].ToString(),\n",
" Age = row[\"Age\"] == DBNull.Value ? 0 : (int)row[\"Age\"]\n",
" };\n",
"\n",
" students.Add(student);\n",
" }\n",
"\n",
" return students;\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "c66c5da7",
"metadata": {},
"source": [
"## 使用 ADO.NET"
]
},
{
"cell_type": "markdown",
"id": "6b1ebc4f",
"metadata": {},
"source": [
"### SQL Server 数据库(2019为例)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "f64d17d8",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"查询到: 528 行数据\n",
"前2行[{\"Id\":1,\"Name\":\"吕宇宁\",\"Age\":74},{\"Id\":6,\"Name\":\"林杰宏\",\"Age\":73}]\n"
]
}
],
"source": [
"//Ado.Net 操作SQL Server\n",
"{\n",
" DataSet ds = new DataSet();\n",
"\n",
" using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))\n",
" {\n",
" mssqlConnection.Open();\n",
"\n",
" var querySql = \"select * FROM student where age >@age;\";\n",
" SqlParameter[] parameters = new SqlParameter[]\n",
" {\n",
" new SqlParameter()\n",
" {\n",
" ParameterName = \"age\",\n",
" SqlDbType = SqlDbType.Int,\n",
" Value = 50,\n",
" Direction = ParameterDirection.Input,\n",
" Size = 4,\n",
" DbType = DbType.Int32,\n",
" IsNullable = false,\n",
" }\n",
" };\n",
" var command = new SqlCommand(querySql, mssqlConnection);\n",
" command.Parameters.AddRange(parameters);\n",
"\n",
" var adapter = new SqlDataAdapter(command);\n",
" adapter.Fill(ds);\n",
"\n",
" mssqlConnection.Close();\n",
" mssqlConnection.Dispose();\n",
" }\n",
"\n",
" var students = DatatableToStudent(ds.Tables[0]);\n",
"\n",
" Console.WriteLine($\"查询到: {students.Count()} 行数据\");\n",
" var jsonText = System.Text.Json.JsonSerializer.Serialize(students.Take<Student>(2), new System.Text.Json.JsonSerializerOptions()\n",
" {\n",
" Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
" WriteIndented = false,\n",
" });\n",
"\n",
" Console.WriteLine($\"前2行{jsonText}\");\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "a604fbea",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"source": [
"### MySQL"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "90085b98",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id Name Age \n",
"1 江子韬 28 \n",
"2 苏震南 48 \n"
]
}
],
"source": [
"//Ado.Net 操作MySQL\n",
"{\n",
" //查询数据\n",
" DataSet ds = new DataSet();\n",
"\n",
" using(var sqlConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n",
" {\n",
" sqlConnection.Open();\n",
"\n",
" var querySql = \"SELECT * FROM `Student` LIMIT 2;\";\n",
" var command = new MySqlCommand(querySql, sqlConnection);\n",
"\n",
" var adapter = new MySqlDataAdapter(command);\n",
" adapter.Fill(ds);\n",
"\n",
" sqlConnection.Close();\n",
" sqlConnection.Dispose();\n",
" }\n",
"\n",
" //输出数据\n",
" var dt = ds.Tables[0];\n",
" int padRightCount = 15;\n",
"\n",
" //输出列\n",
" List<string> columnNames = new List<string>(100);\n",
" foreach(DataColumn c in dt.Columns)\n",
" {\n",
" columnNames.Add(c.ColumnName.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\", columnNames));\n",
"\n",
" //输出数据\n",
" foreach(DataRow row in dt.Rows)\n",
" {\n",
" List<string> rowItemValues = new List<string>(100);\n",
"\n",
" for(int i=0; i<columnNames.Count(); i++)\n",
" {\n",
" var valueText = row[i] == DBNull.Value? \"null\" : row[i].ToString();\n",
" rowItemValues.Add(valueText.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\",rowItemValues));\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "c601df54",
"metadata": {},
"source": [
"### PostgreSQL"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "bb00b479",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id Name Age \n",
"1 邵致远 62 \n",
"2 孙致远 4 \n",
"3 陶震南 60 \n",
"4 邹安琪 63 \n",
"5 宋安琪 17 \n"
]
}
],
"source": [
"//Ado.Net 操作PostgreSQL\n",
"{\n",
" //查询数据\n",
" DataSet ds = new DataSet();\n",
" using(var sqlConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))\n",
" {\n",
" sqlConnection.Open();\n",
" \n",
" var querySql = \n",
" \"\"\"\n",
" SELECT * FROM \"Student\" LIMIT 5;\n",
" \"\"\";\n",
" var command = new NpgsqlCommand(querySql, sqlConnection);\n",
"\n",
" var adapter = new NpgsqlDataAdapter(command);\n",
" adapter.Fill(ds);\n",
"\n",
" sqlConnection.Close();\n",
" sqlConnection.Dispose();\n",
" }\n",
"\n",
" //输出数据\n",
" var dt = ds.Tables[0];\n",
" int padRightCount = 15;\n",
"\n",
" //输出列\n",
" List<string> columnNames = new List<string>(100);\n",
" foreach(DataColumn c in dt.Columns)\n",
" {\n",
" columnNames.Add(c.ColumnName.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\", columnNames));\n",
"\n",
" //输出数据\n",
" foreach(DataRow row in dt.Rows)\n",
" {\n",
" List<string> rowItemValues = new List<string>(100);\n",
"\n",
" for(int i=0; i<columnNames.Count(); i++)\n",
" {\n",
" var valueText = row[i] == DBNull.Value? \"null\" : row[i].ToString();\n",
" rowItemValues.Add(valueText.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\",rowItemValues));\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "a52047f6",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id Name Age \n",
"1 邵致远 62 \n",
"2 孙致远 4 \n",
"3 陶震南 60 \n",
"4 邹安琪 63 \n",
"5 宋安琪 17 \n"
]
}
],
"source": [
"//Ado.Net 操作PostgreSQL: 客户端官方用法(异步)\n",
"{\n",
" //查询数据\n",
" DataSet ds = new DataSet();\n",
" int padRightCount = 15;\n",
" \n",
" await using var dataSource = NpgsqlDataSource.Create(SharedDbConnect.PSQLConnectionString);\n",
"\n",
" await using (var cmd = dataSource.CreateCommand(\"SELECT * FROM \\\"Student\\\" LIMIT 5;\"))\n",
"\n",
" await using (var reader = await cmd.ExecuteReaderAsync())\n",
" {\n",
" //输出列名\n",
" List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
" Console.WriteLine(string.Join(\"\", columnNames));\n",
"\n",
" //循环输出行数据\n",
" while (await reader.ReadAsync())\n",
" {\n",
" List<string> rowItemValues = new List<string>(100);\n",
" for(int i=0; i<columnNames.Count(); i++)\n",
" {\n",
" var valueText = reader.GetFieldValue<object>(i).ToString();\n",
" rowItemValues.Add(valueText.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\",rowItemValues));\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "e1c9381b",
"metadata": {},
"source": [
"### SQLite"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "96de0cac",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id Name Age \n",
"1 龚致远 70 \n",
"2 潘宇宁 48 \n",
"3 陶杰宏 5 \n",
"4 彭晓明 46 \n",
"5 江震南 63 \n"
]
}
],
"source": [
"//Ado.Net 操作SQLite\n",
"{\n",
" //查询数据\n",
" DataSet ds = new DataSet();\n",
" int padRightCount = 15;\n",
"\n",
" using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))\n",
" {\n",
" sqlConnection.Open();\n",
" \n",
" var querySql = \n",
" \"\"\"\n",
" SELECT * FROM Student LIMIT 5;\n",
" \"\"\";\n",
" var cmd = sqlConnection.CreateCommand();\n",
" cmd.CommandType = CommandType.Text;\n",
" cmd.CommandText = querySql;\n",
"\n",
" using (var reader = await cmd.ExecuteReaderAsync())\n",
" {\n",
" //输出列名\n",
" List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
" Console.WriteLine(string.Join(\"\", columnNames));\n",
"\n",
" //循环输出行数据\n",
" while (await reader.ReadAsync())\n",
" {\n",
" List<string> rowItemValues = new List<string>(100);\n",
" for(int i=0; i<columnNames.Count(); i++)\n",
" {\n",
" var valueText = reader.GetFieldValue<object>(i).ToString();\n",
" rowItemValues.Add(valueText.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\",rowItemValues));\n",
" }\n",
" }\n",
"\n",
" sqlConnection.Close();\n",
" sqlConnection.Dispose();\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "b0035452",
"metadata": {},
"source": [
"### DuckDB"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "f986fed7",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Id Name Age \n",
"1 张三 10 \n",
"2 李四 33 \n",
"3 王五 66 \n"
]
}
],
"source": [
"//Ado.Net 操作DuckDB数据库\n",
"{\n",
" int padRightCount = 15;\n",
"\n",
" using(var sqlConnection = new DuckDBConnection(SharedDbConnect.DuckDBConnectionString))\n",
" {\n",
" sqlConnection.Open();\n",
" //1、创建表\n",
" var createTableSql = \n",
" \"\"\"\n",
" CREATE TABLE Student \n",
" (\n",
" Id INTEGER,\n",
" Name TEXT,\n",
" Age INTEGER\n",
" );\n",
" \"\"\";\n",
"\n",
" var createCommand = sqlConnection.CreateCommand();\n",
" createCommand.CommandType = CommandType.Text;\n",
" createCommand.CommandText = createTableSql;\n",
"\n",
" var createCount = createCommand.ExecuteNonQuery();\n",
" //Console.WriteLine($\"{createCount}\");\n",
"\n",
" //2、插入示例数据\n",
" var insertSql = \n",
" \"\"\"\n",
" INSERT INTO Student VALUES (1, '张三', 10), (2, '李四', 33), (3, '王五', 66);\n",
" \"\"\";\n",
"\n",
" var insertCommand = sqlConnection.CreateCommand();\n",
" insertCommand.CommandType = CommandType.Text;\n",
" insertCommand.CommandText = insertSql;\n",
"\n",
" var insertCount = insertCommand.ExecuteNonQuery();\n",
" //Console.WriteLine($\"{insertCount}\");\n",
"\n",
" //3、查询数据\n",
" var querySql = \n",
" \"\"\"\n",
" SELECT * FROM Student ORDER BY Age\n",
" \"\"\";\n",
" var queryCommand = sqlConnection.CreateCommand();\n",
" queryCommand.CommandType = CommandType.Text;\n",
" queryCommand.CommandText = querySql;\n",
"\n",
" using (var reader = await queryCommand.ExecuteReaderAsync())\n",
" {\n",
" //输出列名\n",
" List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
" Console.WriteLine(string.Join(\"\", columnNames));\n",
"\n",
" //循环输出行数据\n",
" while (await reader.ReadAsync())\n",
" {\n",
" List<string> rowItemValues = new List<string>(100);\n",
" for(int i=0; i<columnNames.Count(); i++)\n",
" {\n",
" var valueText = reader.GetValue(i).ToString();\n",
" rowItemValues.Add(valueText.PadRight(padRightCount));\n",
" }\n",
"\n",
" Console.WriteLine(string.Join(\"\",rowItemValues));\n",
" }\n",
" }\n",
"\n",
" sqlConnection.Close();\n",
" sqlConnection.Dispose();\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "63376dfe",
"metadata": {},
"source": [
"## 使用 Dapper"
]
},
{
"cell_type": "markdown",
"id": "77e6b7bb",
"metadata": {},
"source": [
"### Dapper 操作 SQL Server 2019"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "3068074b",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{\"Id\":1,\"Name\":\"吕宇宁\",\"Age\":74},{\"Id\":2,\"Name\":\"韦子异\",\"Age\":3}]\r\n"
]
}
],
"source": [
"//Dapper 操作SQL Server\n",
"{\n",
" using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))\n",
" {\n",
" var querySql = \"select * FROM student;\";\n",
" var students = mssqlConnection.Query<Student>(querySql).Take(2);\n",
" var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
" {\n",
" Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
" WriteIndented = false,\n",
" });\n",
"\n",
" Console.WriteLine(jsonText);\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "d5daa579",
"metadata": {},
"source": [
"### Dapper 操作 MySQL"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "0cd87012",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{\"Id\":1,\"Name\":\"江子韬\",\"Age\":28},{\"Id\":2,\"Name\":\"苏震南\",\"Age\":48}]\r\n"
]
}
],
"source": [
"//Dapper 操作MySQL\n",
"{\n",
" using(var dbConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n",
" {\n",
" var querySql = \"SELECT * FROM `Student` LIMIT @top;\";\n",
" var students = dbConnection.Query<Student>(querySql, new {top=2});\n",
"\n",
" var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
" {\n",
" Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
" WriteIndented = false,\n",
" });\n",
"\n",
" Console.WriteLine(jsonText);\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "bac2b8e0",
"metadata": {},
"source": [
"### Dapper 操作 PostgreSQL"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "7a476608",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{\"Id\":1,\"Name\":\"邵致远\",\"Age\":62},{\"Id\":3,\"Name\":\"陶震南\",\"Age\":60}]\r\n"
]
}
],
"source": [
"//Dapper 操作 PSQL\n",
"{\n",
" using(var dbConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))\n",
" {\n",
" var querySql = \"SELECT * FROM \\\"Student\\\" Where \\\"Age\\\" > @Age LIMIT @Top;\";\n",
" var students = dbConnection.Query<Student>(querySql, new {Age = 50, top = 2});\n",
"\n",
" var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
" {\n",
" Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
" WriteIndented = false,\n",
" });\n",
"\n",
" Console.WriteLine(jsonText);\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "9075b64b",
"metadata": {},
"source": [
"## 使用 EF Core"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "047da44c",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [],
"source": [
"//共享\n",
"/// <summary>\n",
"/// SQL Server DbContext\n",
"/// </summary>\n",
"public class StudyDbContext: DbContext\n",
"{\n",
" public StudyDbContext(DbContextOptions<StudyDbContext> option):base(option)\n",
" {\n",
"\n",
" }\n",
"\n",
" public DbSet<Student> Student {get; set;}\n",
"\n",
" protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n",
" {\n",
" base.OnConfiguring(optionsBuilder);\n",
" if(!optionsBuilder.IsConfigured)\n",
" {\n",
" Console.WriteLine(\"没有设置\");\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "3c61973d",
"metadata": {},
"source": [
"### EF Core 操作 SQL Server\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "6da513fd",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>33</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>戴嘉伦</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>45</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>曾震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>55</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>丁子韬</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>65</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>冯宇宁</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>167</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>严睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>199</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>孔秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>232</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>王睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>305</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>董子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>318</pre></div></td></tr><tr><td>Name</td><td><div c
".dni-code-hint {\r\n",
" font-style: italic;\r\n",
" overflow: hidden;\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview {\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview td {\r\n",
" vertical-align: top;\r\n",
" text-align: start;\r\n",
"}\r\n",
"details.dni-treeview {\r\n",
" padding-left: 1em;\r\n",
"}\r\n",
"table td {\r\n",
" text-align: start;\r\n",
"}\r\n",
"table tr { \r\n",
" vertical-align: top; \r\n",
" margin: 0em 0px;\r\n",
"}\r\n",
"table tr td pre \r\n",
"{ \r\n",
" vertical-align: top !important; \r\n",
" margin: 0em 0px !important;\r\n",
"} \r\n",
"table th {\r\n",
" text-align: start;\r\n",
"}\r\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"{ //EF Core SQL Server\n",
" var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
" builder.UseSqlServer(SharedDbConnect.MsSqlConnectionString);\n",
"\n",
" var dbContext = new StudyDbContext(builder.Options);\n",
" var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
" students.Display();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "c4b85b82",
"metadata": {},
"source": [
"### EF Core 查询 MySQL"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "9d5dc22b",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>26</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>邱璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>58</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>曾致远</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>59</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>苏秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>80</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>廖詩涵</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>顾岚</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>148</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>金震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>172</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>武秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>246</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>金云熙</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>268</pre></div></td></tr><tr><td>Name</td><td><div cl
".dni-code-hint {\r\n",
" font-style: italic;\r\n",
" overflow: hidden;\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview {\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview td {\r\n",
" vertical-align: top;\r\n",
" text-align: start;\r\n",
"}\r\n",
"details.dni-treeview {\r\n",
" padding-left: 1em;\r\n",
"}\r\n",
"table td {\r\n",
" text-align: start;\r\n",
"}\r\n",
"table tr { \r\n",
" vertical-align: top; \r\n",
" margin: 0em 0px;\r\n",
"}\r\n",
"table tr td pre \r\n",
"{ \r\n",
" vertical-align: top !important; \r\n",
" margin: 0em 0px !important;\r\n",
"} \r\n",
"table th {\r\n",
" text-align: start;\r\n",
"}\r\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"{ //EF Core MySQL\n",
" var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
" builder.UseMySQL(SharedDbConnect.MySQLConnectionString);\n",
"\n",
" var dbContext = new StudyDbContext(builder.Options);\n",
" var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
" students.Display();\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "81d3e14d",
"metadata": {},
"source": [
"### EFCore PostgreSQL"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "42dd5655",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>11</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>张子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>19</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>范璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>51</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贾震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>54</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>董子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>60</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>张安琪</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>81</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>郭震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>86</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>罗璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>94</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贺睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>100</pre></div></td></tr><tr><td>Name</td><td><div class=\"
".dni-code-hint {\r\n",
" font-style: italic;\r\n",
" overflow: hidden;\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview {\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview td {\r\n",
" vertical-align: top;\r\n",
" text-align: start;\r\n",
"}\r\n",
"details.dni-treeview {\r\n",
" padding-left: 1em;\r\n",
"}\r\n",
"table td {\r\n",
" text-align: start;\r\n",
"}\r\n",
"table tr { \r\n",
" vertical-align: top; \r\n",
" margin: 0em 0px;\r\n",
"}\r\n",
"table tr td pre \r\n",
"{ \r\n",
" vertical-align: top !important; \r\n",
" margin: 0em 0px !important;\r\n",
"} \r\n",
"table th {\r\n",
" text-align: start;\r\n",
"}\r\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"{ \n",
" var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
" builder.UseNpgsql(SharedDbConnect.PSQLConnectionString);\n",
"\n",
" var dbContext = new StudyDbContext(builder.Options);\n",
" var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
" students.Display();\n",
"}"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
},
"polyglot_notebook": {
"kernelInfo": {
"defaultKernelName": "csharp",
"items": [
{
"aliases": [],
"languageName": "csharp",
"name": "csharp"
}
]
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}