|
|
# 混合使用多语言并共享变量
|
|
|
混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。
|
|
|
## 语言及共享变量的支持情况
|
|
|
| 语言 | 变量共享 |
|
|
|
| ---- | ---- |
|
|
|
| C# | 支持 |
|
|
|
| F# | 支持 |
|
|
|
| PowerShell | 支持 |
|
|
|
| JavaScript | 支持 |
|
|
|
| SQL | 支持 |
|
|
|
| KQL | 支持 |
|
|
|
| Python | 支持 |
|
|
|
| R | 支持 |
|
|
|
| HTML | 不支持 |
|
|
|
| Mermaid | 不支持 |
|
|
|
## 初始化
|
|
|
```C#
|
|
|
//全局初始化
|
|
|
#!import "./Base.ipynb"
|
|
|
|
|
|
//共享
|
|
|
using Microsoft.DotNet.Interactive;
|
|
|
using Microsoft.DotNet.Interactive.Commands;
|
|
|
```
|
|
|
## 使用 SQL(SQLite为例)
|
|
|
+ 引用NuGet包
|
|
|
```C#
|
|
|
#r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*"
|
|
|
```
|
|
|
+ 连接 SQL内核(使用 `#!connect` 魔法命令)
|
|
|
```C#
|
|
|
/* 简单使用
|
|
|
|
|
|
#!connect sqlite --kernel-name SQLiteSharedKernel --connection-string "Data Source=.\assets\database\study.db;"
|
|
|
*/
|
|
|
|
|
|
//优化方法
|
|
|
using Microsoft.DotNet.Interactive;
|
|
|
using Microsoft.DotNet.Interactive.Commands;
|
|
|
{
|
|
|
//内核名:魔法命令中的内核名,执行后会自动加 sql- 前缀,做为内核名被使用
|
|
|
string magicCommandKernelName = "SQLiteSharedKernel";
|
|
|
string completeKernelName = "sql-" + magicCommandKernelName;
|
|
|
|
|
|
//引入内核:可重复执行
|
|
|
if(Microsoft.DotNet.Interactive.Kernel.Root.FindKernelByName(completeKernelName) == null)
|
|
|
{
|
|
|
var connectKernelCode = $"#!connect sqlite --kernel-name {magicCommandKernelName} --connection-string \"{SharedDbConnect.SQLiteConnectionString}\"";
|
|
|
await Kernel.Root.SendAsync(new SubmitCode( connectKernelCode, "csharp"));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine($"名为 {completeKernelName} 的内核已存在。需要新内核时,请为--kernel-name参数使用不同的值, 本次执行不做任何更改!");
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
+ 使用SQL内核(SQL语句操作数据库)
|
|
|
```C#
|
|
|
#!sql-SQLiteSharedKernel
|
|
|
|
|
|
--查询年龄最大的5名学生
|
|
|
SELECT * FROM Student order by Age Desc LIMIT 5;
|
|
|
|
|
|
--查询学生总数
|
|
|
SELECT COUNT(*) AS Count FROM Student;
|
|
|
```
|
|
|
## 使用 KQL(效果图)
|
|
|
因为环境比较难搭建,用效果图代替。
|
|
|
|
|
|

|
|
|
## 使用 Raw Value Storage
|
|
|
使用value内核,可以方便的管理共享文本数据。
|
|
|
```C#
|
|
|
#!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json
|
|
|
```
|
|
|
## C#
|
|
|
### 一般使用
|
|
|
```C#
|
|
|
var student = new {Id=1, Name="张三",Age=18};
|
|
|
student.Display();
|
|
|
```
|
|
|
### 使用Value内核共享的变量
|
|
|
```C#
|
|
|
#!set --name fromSharedFileData --value @value:SharedDataFromValueKernel
|
|
|
|
|
|
fromSharedFileData.Display();
|
|
|
```
|
|
|
### 共享变量
|
|
|
使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用)
|
|
|
```C#
|
|
|
#r "nuget:Microsoft.Data.SqlClient"
|
|
|
#r "nuget:Microsoft.Data.Sqlite"
|
|
|
|
|
|
using System.Data;
|
|
|
using System.Data.Common;
|
|
|
using System.Data.SqlTypes;
|
|
|
|
|
|
using Microsoft.Data.SqlClient;
|
|
|
using Microsoft.Data.Sqlite;
|
|
|
|
|
|
//使用 Ado.Net 从SQLite中获取数据,再共享出去
|
|
|
|
|
|
//查询数据
|
|
|
var SharedStudents = new List<Student>();
|
|
|
{
|
|
|
DataSet ds = new DataSet();
|
|
|
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())
|
|
|
{
|
|
|
//循环输出行数据
|
|
|
while (await reader.ReadAsync())
|
|
|
{
|
|
|
var user = new Student()
|
|
|
{
|
|
|
Id = reader.GetFieldValue<int>("Id"),
|
|
|
Name = reader.GetFieldValue<string>("Name"),
|
|
|
Age = reader.GetFieldValue<int>("Age"),
|
|
|
};
|
|
|
|
|
|
SharedStudents.Add(user);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
sqlConnection.Close();
|
|
|
sqlConnection.Dispose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//共享数据:默认SharedStudents已共享,其它语言引用即可
|
|
|
SharedStudents.Display();
|
|
|
```
|
|
|
## F#
|
|
|
### 简单示例
|
|
|
```C#
|
|
|
printfn "Hello World from F#"
|
|
|
```
|
|
|
### 使用C#共享数据
|
|
|
```C#
|
|
|
#!set --value @csharp:SharedStudents --name SharedStudents
|
|
|
|
|
|
SharedStudents
|
|
|
```
|
|
|
## Powershell
|
|
|
```C#
|
|
|
#!powershell
|
|
|
Write-Host "hellow powershell"
|
|
|
```
|
|
|
## 使用Python
|
|
|
+ 前提:系统要安装Python环境,推荐使用Anaconda安装,直接安装Python也可以
|
|
|
|
|
|
+ 作用:使多语言笔记,直接支持 Python语言;
|
|
|
+ 连接到 Python 内核
|
|
|
```C#
|
|
|
using Microsoft.DotNet.Interactive;
|
|
|
using Microsoft.DotNet.Interactive.Commands;
|
|
|
|
|
|
//引入Python内核:使用C# 执行引入语句
|
|
|
if(Kernel.Root.FindKernelByName("pythonkernel2") == null)
|
|
|
{
|
|
|
//Console.WriteLine("正在导入Python内核....");
|
|
|
var importPythonkernel = "#!connect jupyter --kernel-name pythonkernel2 --kernel-spec python3";
|
|
|
await Kernel.Root.SendAsync(new SubmitCode( importPythonkernel, "csharp"));
|
|
|
Console.WriteLine("Python内核导入完成");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Console.WriteLine("Python内核已经导入");
|
|
|
}
|
|
|
```
|
|
|
+ 使用 Python
|
|
|
```C#
|
|
|
# 明确指定内核:优先级高于 "单元格选择的内核"
|
|
|
#!pythonkernel2
|
|
|
|
|
|
#!set --value @csharp:SharedStudents --name SharedStudents
|
|
|
|
|
|
print("你好,我是 Ployglot Notebooks 使用 Python语言内核,打印的内容!")
|
|
|
```
|
|
|
## 在 Python 中使用C#共享变量
|
|
|
```C#
|
|
|
#!pythonkernel2
|
|
|
|
|
|
#!set --value @csharp:SharedStudents --name SharedStudents
|
|
|
print(SharedStudents)
|
|
|
```
|
|
|
## 使用 html
|
|
|
```C#
|
|
|
<!DOCTYPE html>
|
|
|
<html lang="zh-CN">
|
|
|
<head>
|
|
|
<meta charset="UTF-8">
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
<title>完整html文档</title>
|
|
|
</head>
|
|
|
<body>
|
|
|
<div style="color:green">
|
|
|
<h2 id="MyTitle">使用Html文档,当然也可以使用Html片断。注意:纯HTML不支持共享变量!</h2>
|
|
|
|
|
|
<table id="student" border="1" style="color:#fff">
|
|
|
<caption>C#共享数据:学生表</caption>
|
|
|
<thead>
|
|
|
<tr>
|
|
|
<th>编号</th>
|
|
|
<th>姓名</th>
|
|
|
<th>年龄</th>
|
|
|
</tr>
|
|
|
</thead>
|
|
|
<tbody>
|
|
|
</tbody>
|
|
|
</table>
|
|
|
</div>
|
|
|
</body>
|
|
|
</html>
|
|
|
```
|
|
|
## 使用 JavaScript
|
|
|
+ 简单使用
|
|
|
```C#
|
|
|
console.log("输出js日志");
|
|
|
```
|
|
|
+ 操作html
|
|
|
```C#
|
|
|
//改变上面html中h2文本颜色:执行后上面看效果
|
|
|
document.getElementById("MyTitle").style.color = "red";
|
|
|
```
|
|
|
+ 使用C#共享数据,填充数据表格
|
|
|
```C#
|
|
|
#!set --value @csharp:SharedStudents --name SharedStudentsInJs
|
|
|
|
|
|
// 获取表格的tbody部分
|
|
|
const tableBody = document.querySelector('#student tbody');
|
|
|
|
|
|
// 遍历数据数组
|
|
|
SharedStudentsInJs.forEach(item => {
|
|
|
// 创建一行
|
|
|
const row = document.createElement('tr');
|
|
|
|
|
|
// 创建单元格并填入数据
|
|
|
const nameCell = document.createElement('td');
|
|
|
nameCell.textContent = item.Id;
|
|
|
row.appendChild(nameCell);
|
|
|
|
|
|
const ageCell = document.createElement('td');
|
|
|
ageCell.textContent = item.Name;
|
|
|
row.appendChild(ageCell);
|
|
|
|
|
|
const jobCell = document.createElement('td');
|
|
|
jobCell.textContent = item.Age;
|
|
|
row.appendChild(jobCell);
|
|
|
|
|
|
// 将该行添加到表格的tbody中
|
|
|
tableBody.appendChild(row);
|
|
|
});
|
|
|
```
|
|
|
## HTTP Request
|
|
|
## 基本请求
|
|
|
```C#
|
|
|
### 请求 京东
|
|
|
get https://www.jd.com
|
|
|
|
|
|
### 请求QQ
|
|
|
get https://www.qq.com
|
|
|
```
|
|
|
|
|
|
+ 高级请求(使用变量等)
|
|
|
```C#
|
|
|
@host=https://www.qq.com
|
|
|
|
|
|
get {{host}}
|
|
|
```
|
|
|
## 使用 mermaind
|
|
|
```C#
|
|
|
stateDiagram-v2
|
|
|
[*] --> Active
|
|
|
|
|
|
state Active {
|
|
|
[*] --> NumLockOff
|
|
|
NumLockOff --> NumLockOn : EvNumLockPressed
|
|
|
NumLockOn --> NumLockOff : EvNumLockPressed
|
|
|
--
|
|
|
[*] --> CapsLockOff
|
|
|
CapsLockOff --> CapsLockOn : EvCapsLockPressed
|
|
|
CapsLockOn --> CapsLockOff : EvCapsLockPressed
|
|
|
--
|
|
|
[*] --> ScrollLockOff
|
|
|
ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
|
|
|
ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
|
|
|
}
|
|
|
|
|
|
```
|
|
|
```C#
|
|
|
stateDiagram-v2
|
|
|
state fork_state <<fork>>
|
|
|
[*] --> fork_state
|
|
|
fork_state --> State2
|
|
|
fork_state --> State3
|
|
|
|
|
|
state join_state <<join>>
|
|
|
State2 --> join_state
|
|
|
State3 --> join_state
|
|
|
join_state --> State4
|
|
|
State4 --> [*]
|
|
|
```
|