diff --git a/Docs/assets/images/PocketView.jpg b/Docs/assets/images/PocketView.jpg
new file mode 100644
index 0000000..3ae3e9f
Binary files /dev/null and b/Docs/assets/images/PocketView.jpg differ
diff --git a/Docs/assets/images/操作数据库-C#.jpg b/Docs/assets/images/操作数据库-C#.jpg
new file mode 100644
index 0000000..1ba672c
Binary files /dev/null and b/Docs/assets/images/操作数据库-C#.jpg differ
diff --git a/Docs/多语言笔记.1.2.PocketView渲染html.md b/Docs/多语言笔记.1.2.PocketView渲染html.md
new file mode 100644
index 0000000..ecc7c74
--- /dev/null
+++ b/Docs/多语言笔记.1.2.PocketView渲染html.md
@@ -0,0 +1,111 @@
+使用PocketView,操作Html
+=======================
+PocketView是一个API,用于使用C#代码,用HTML的术语简明地编写HTML。就像HTML方法一样,它返回一个实现IHtmlCent的对象,因此输出将被假定为有效的HTML并呈现到您的笔记本中。这里有一个例子:
+```csharp
+using Microsoft.DotNet.Interactive.Formatting;
+using static Microsoft.DotNet.Interactive.Formatting.PocketViewTags;
+
+PocketView pocketView = PocketViewTags.span(img[src:"https://www.baidu.com/img/flexible/logo/pc/result.png",style:"height:1em"],HTML(" "), a[href:@"https://www.baidu.com"](i("百度")));
+pocketView.Display();
+
+//display(pocketView);
+```
+解析上面的代码:
++ 调用span方法:传递三个参数,img方法结果、HTML方法结果、a方法结果;
++ img方法是通过一个索引器调用的,该索引器传递了几个命名参数,src和style; 
++ HTML方法有一个字符串参数 ` ` 即空格的 html 转义字符;
++ a方法有另一个索引器参数(href)和一个参数,在本例中是对i方法的调用;
+
+实质:以C#对象的方式,组装了一段 html代码片断
+通过将PocketView转换为字符串,您可以看到它产生的实际HTML,该字符串将以纯文本而不是HTML显示
+```csharp
+//display(pocketView.ToDisplayString());
+display(pocketView.ToString());
+```
+由于HTML难以使用静态类型语言进行简洁表示,PocketView采用了动态类型。这使得你可以使用任意索引器名称来指定HTML属性。PocketViewTags上的每个方法都返回一个动态的PocketView。让我们更详细地了解你可以用PocketView实现的功能。
+
+注意:在本节的代码示例中,通过在笔记本中运行`using static Microsoft.DotNet.Interactive.Formatting.PocketViewTags`,你可以直接调用PocketView方法,而无需类名限定。
+
+如上所述,你可以使用方括号限定符来指定HTML属性,小括号填充HTML元素内容:
+```csharp
+//span html片断
+PocketView spanElement = span[style:"font-style:italic"]("你好,我带了倾斜样式");
+spanElement.Display();
+
+//图片 html片断
+PocketView imgElement = img[src:"https://www.baidu.com/img/flexible/logo/pc/result.png",style:"height:1em", title:"百度图片"];
+imgElement.Display();
+
+//超级连接 html片断
+PocketView linkElement = a[href:@"https://www.baidu.com"](i("百度连接"));
+linkElement.Display();
+```
+如果你将一个字符串传递给PocketView,它会为你进行HTML编码:
+```csharp
+//sapn本身作为html标签,被当作Html显示;但span里的html样式的内容不被当作html渲染,而是编码后直接显示
+PocketView view = span("<div>对我 进行编码</div>");
+//原样显示html片断自身,不作为html元素进行渲染
+display(view);
+
+//显示被html编码过的原始字符串
+display(view.ToString());
+```
+这就是HTML方法派上用场的地方。如果你想将一个字符串传递给PocketView,但又不希望它被HTML编码,你可以简单地将该字符串用HTML方法包裹起来:
+```csharp
+//HTML方法后,就作为 html片断进行 "渲染" 了
+PocketView view2 = span(HTML("<div>Don't encode me!</div>"));
+display(view2);
+display(view2.ToString());
+```
+HTML简单地将一个字符串捕获到一个实现IHtmlContent接口的实例中。该接口用于指示该值不应被HTML编码,而是应被视为有效的HTML并直接呈现。
+
+了解了这一点,可能不会感到惊讶的是,PocketView本身也实现了IHtmlContent接口。
+
+你还可以将其他类型的对象传递给PocketView。当你这样做时,它们会使用纯文本格式化器进行格式化,该格式化器默认会扩展对象的属性。
+```csharp
+PocketView view3 = b(
+    new {Fruit="apple", Texture="smooth"}
+);
+
+display(view3)
+```
+由于目前.NET Interactive的格式化API不支持为嵌套的HTML片段生成格式化器,PocketView会回退到text/plain格式化器来描述传递对象的属性。
+
+你也可以将对象列表传递给PocketView。这对于从数据生成HTML非常有用:
+```csharp
+var fruits = new []{"apple","banana","cherry"};
+var colors = new []{"green","#F1C40F","red"};
+
+
+ul(
+    fruits.Zip(colors).Select(x => li[style:$"color:{x.Item2}"](x.Item1))
+)
+```
+总结:其实这样的方式 "组装"html页面或片断,会非常繁琐;只适合临时做一些简单的html组装;
+方案:
++ 使用 html 内核: 但有个最大问题是"html内核不能使用共享数据";只适合纯静态页面;
++ 使用 javascript 内核: 虽然能使用 "共享数据"功能,但js内核长处是操作现有html并非生成html;
++ 使用 razor 或 blazor 库,像razor或blazor页面或组件一样,就非常方便了;`非常推荐的终极解决方案` 唯一缺点是智能提示差,可以在VS里写好,粘贴过来哈;
+使用 Razor的例子:体验下方不方便(后面专题讲解)
+```csharp
+#r "nuget:RazorInteractive"
+```
+```razor
+#!razor
+@{
+    
+    var dic = new Dictionary<string, string>()
+    {
+        {"apple","green"},
+        {"banana","#F1C40F"},
+        {"cherry","red"},
+    };
+}
+
+<ul>
+    @foreach(var item in dic)
+    {
+        <li style='color:@item.Value'>@item.Key</li>;
+    }
+</ul>
+```
diff --git a/Docs/多语言笔记.2.2.操作数据库-C#.md b/Docs/多语言笔记.2.2.操作数据库-C#.md
new file mode 100644
index 0000000..1c2a0f4
--- /dev/null
+++ b/Docs/多语言笔记.2.2.操作数据库-C#.md
@@ -0,0 +1,514 @@
+使用 .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<Student> DatatableToStudent(DataTable studentTable)
+{
+    var students = new List<Student>();
+    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<Student>(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<string> columnNames = new List<string>(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<string> rowItemValues = new List<string>(100);
+
+        for(int i=0; i<columnNames.Count(); i++)
+        {
+            var valueText = row[i] == DBNull.Value? "null" : row[i].ToString();
+            rowItemValues.Add(valueText.PadRight(padRightCount));
+        }
+
+        Console.WriteLine(string.Join("",rowItemValues));
+    }
+}
+```
+### PostgreSQL
+```csharp
+//Ado.Net 操作PostgreSQL
+{
+    //查询数据
+    DataSet ds = new DataSet();
+    using(var sqlConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))
+    {
+        sqlConnection.Open();
+        
+        var querySql = 
+        """
+            SELECT * FROM "Student" LIMIT 5;
+        """;
+        var command = new NpgsqlCommand(querySql, sqlConnection);
+
+        var adapter =  new NpgsqlDataAdapter(command);
+        adapter.Fill(ds);
+
+        sqlConnection.Close();
+        sqlConnection.Dispose();
+    }
+
+    //输出数据
+    var dt = ds.Tables[0];
+    int padRightCount = 15;
+
+    //输出列
+    List<string> columnNames = new List<string>(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<string> rowItemValues = new List<string>(100);
+
+        for(int i=0; i<columnNames.Count(); i++)
+        {
+            var valueText = row[i] == DBNull.Value? "null" : row[i].ToString();
+            rowItemValues.Add(valueText.PadRight(padRightCount));
+        }
+
+        Console.WriteLine(string.Join("",rowItemValues));
+    }
+}
+```
+```csharp
+//Ado.Net 操作PostgreSQL: 客户端官方用法(异步)
+{
+    //查询数据
+    DataSet ds = new DataSet();
+    int padRightCount = 15;
+   
+    await using var dataSource = NpgsqlDataSource.Create(SharedDbConnect.PSQLConnectionString);
+
+    await using (var cmd = dataSource.CreateCommand("SELECT * FROM \"Student\" LIMIT 5;"))
+
+    await using (var reader = await cmd.ExecuteReaderAsync())
+    {
+        //输出列名
+         List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();
+        Console.WriteLine(string.Join("", columnNames));
+
+        //循环输出行数据
+        while (await reader.ReadAsync())
+        {
+            List<string> rowItemValues = new List<string>(100);
+            for(int i=0; i<columnNames.Count(); i++)
+            {
+                var valueText = reader.GetFieldValue<object>(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<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();
+            Console.WriteLine(string.Join("", columnNames));
+
+            //循环输出行数据
+            while (await reader.ReadAsync())
+            {
+                List<string> rowItemValues = new List<string>(100);
+                for(int i=0; i<columnNames.Count(); i++)
+                {
+                    var valueText = reader.GetFieldValue<object>(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<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();
+            Console.WriteLine(string.Join("", columnNames));
+
+            //循环输出行数据
+            while (await reader.ReadAsync())
+            {
+                List<string> rowItemValues = new List<string>(100);
+                for(int i=0; i<columnNames.Count(); i++)
+                {
+                    var valueText = reader.GetValue(i).ToString();
+                    rowItemValues.Add(valueText.PadRight(padRightCount));
+                }
+
+                Console.WriteLine(string.Join("",rowItemValues));
+            }
+        }
+
+        sqlConnection.Close();
+        sqlConnection.Dispose();
+    }
+}
+```
+## 使用 Dapper
+### Dapper 操作 SQL Server 2019
+```csharp
+//Dapper 操作SQL Server
+{
+    using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))
+    {
+        var querySql = "select * FROM student;";
+        var students = mssqlConnection.Query<Student>(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<Student>(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<Student>(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
+//共享
+/// <summary>
+///  SQL Server DbContext
+/// </summary>
+public class StudyDbContext: DbContext
+{
+    public StudyDbContext(DbContextOptions<StudyDbContext> option):base(option)
+    {
+
+    }
+
+    public DbSet<Student> 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<StudyDbContext>();
+    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<StudyDbContext>();
+    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<StudyDbContext>();
+    builder.UseNpgsql(SharedDbConnect.PSQLConnectionString);
+
+    var dbContext = new StudyDbContext(builder.Options);
+    var students = dbContext.Student.Where(s => s.Age> 95).ToList();
+    students.Display();
+}
+```