首页 > 数据库 >SQLSERVER 居然也能调 C# 代码 ?

SQLSERVER 居然也能调 C# 代码 ?

时间:2023-01-03 11:02:00浏览次数:55  
标签:000000df C# UserLogin 代码 SQLSERVER sqllang AQMN 00007ff8 clr

一:背景

1. 讲故事

前些天看到一个奇怪的 Function 函数,调用的是 C# 链接库中的一个 UserLogin 方法,参考代码如下:


CREATE FUNCTION dbo.clr_UserLogin
(
    @name	AS  NVARCHAR(100),
    @password AS NVARCHAR(100)
)
RETURNS INT 
AS
EXTERNAL NAME asmXXX.[xxx.CLRFunctions].UserLogin;
GO

这就让我产生了很大的兴趣,众所周知 SQLSERVER 是 C++ 写的,那这里的 C++ 怎么和 C# 打通呢? 而且 C# 是一门托管语言,需要 JIT 将其 native 化,这个 JIT 又在哪里呢? 带着这些疑问一起研究下吧。

二:互通原理研究

1. 一个简单的例子

首先写一段简单的 C# 代码,然后把它编译成 dll。


namespace AQMN.Bussiness
{
    public class UserFunctions
    {
        public static string UserLogin(string username, string password)
        {
            var random = new Random();

            var isSuccess = random.Next() % 2 == 0;

            return isSuccess ? "登录成功" : "登录失败";
        }
    }
}

接下来需要做的就是数据库参数配置,开启 CLR 支持,并且指定某个数据库支持 unsafe 模式。


EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
GO

ALTER DATABASE MyTestDB SET TRUSTWORTHY ON;
GO

为了能够调到 C# 的 UserLogin 方法,需要 SQLSERVER 先导入这个程序集,然后再以 Function 映射其中方法即可,参考代码如下:


CREATE ASSEMBLY clr_AQMN_Bussiness
FROM 'D:\net6\SQLCrawl\AQMN.Bussiness\bin\Debug\AQMN.Bussiness.dll'
WITH PERMISSION_SET = UNSAFE;
GO

CREATE FUNCTION dbo.clr_UserLogin
(
    @username AS NVARCHAR(100),
	@password AS NVARCHAR(100)
)
RETURNS NVARCHAR(100)
AS
EXTERNAL NAME clr_AQMN_Bussiness.[AQMN.Bussiness.UserFunctions].UserLogin;
GO

创建完了之后,可以观察 assembly 开头的几个系统视图。


SELECT * FROM sys.assemblies
SELECT * FROM sys.assembly_files;
SELECT * FROM sys.assembly_modules;

看起来没啥问题,接下来调用一下刚才创建的 clr_UserLogin 函数。


SELECT dbo.clr_UserLogin(N'jack',N'123456') AS 'State'
GO 10

从图中看登录结果是随机的,说明 C# 的 Random 函数起到了作用,非常有意思。

2. WinDbg 观察

从案例的运行结果看,推测在 SQLSERVER 中应该承载了一个 CLR 运行环境,那是不是这样呢?可以用 WinDbg 附加到 sqlservr.exe 进程,用 lm 观察下模块加载情况。


0:092> lm
start             end                 module name

...
00007ff8`d3960000 00007ff8`d3aaf000   clrjit     (deferred)    
00007ff8`de040000 00007ff8`deb02000   clr        (deferred)     
...

0:092> !eeversion
4.8.4300.0 free
Server mode with 12 gc heaps
SOS Version: 4.8.4300.0 retail build

从输出看果然加载了 clrclrjit 动态链接库,当前还是 gc server 模式,

标签:000000df,C#,UserLogin,代码,SQLSERVER,sqllang,AQMN,00007ff8,clr
From: https://www.cnblogs.com/huangxincheng/p/17021457.html

相关文章

  • MixGo CE与Type C马达
    MixGoCE主控板可以外接马达吗?MixGoCE配套的外接马达怎么用呢?TypeC马达应该怎么用程序控制呢?TypeC接口马达使用说明:马达使用两个管脚同时控制,总共有3种工作模......
  • 从源代码构建TensorFlow流程记录
    京东科技隐私计算产品部曹雨晨为什么从源代码构建通常情况下,直接安装构建好的.whl即可。不过,当需要一些特殊配置(或者闲来无事想体会TensorFlow构建过程到底有多麻烦)的时......
  • vue-qrcode-reader实现简单的实时扫一扫功能
    1.下载与安装插件vue-qecode-reader官网:https://gruhn.github.io/vue-qrcode-reader/demos/Simple.htmlnpminstall--savevue-qecode-reader或者cnpminstall-......
  • CF446D 题解
    题意传送门给定一张\(n\)个点\(m\)条边的无向图,每个节点有权值\(v_i=\)\(0/1\)。角色从节点\(1\)开始随机游走,走到\(n\)停止。求其经过路径上权值和等于\(k-1......
  • PyTorch1【Tensors张量基础】
     """Createdon2023/1/310:06.@Author:haifei"""from__future__importprint_function#必须放在第一行importtorchimporttime#构造一个5x3矩阵,不初始......
  • ant design中锚点Anchor在二级页面中设置滚动偏移量
    版本:react:18.2.0antd:5.1.1 AnchorPage,tsximportReact,{useEffect,useState}from'react';import{Anchor,Row,Col}from'antd';constAnch......
  • abc283 F - Permutation Distance
    题意:给定\(1\simn\)的排列\(P\),对每个\(i\in[1,n]\),计算\(\min\limits_{j\neqi}\{|P_i-P_j|+|i-j|\}\)\(n\le2e5\)思路:我超,俩绝对值怎么办?硬拆就完事了!\[......
  • .NET性能优化-使用RecyclableMemoryStream替代MemoryStream
     提到MemoryStream大家可能都不陌生,在编写代码中或多或少有使用过;比如Json序列化反序列化、导出PDF/Excel/Word、进行图片或者文字处理等场景。但是如果使用它高频、......
  • 通过行为参数传递代码
    一、概述1.1、行为参数化的含义:让方法接受多种行为作为参数,并在内部使用,来完成不同行为。1.2、案例:我们要得到重量大于150克的苹果和所有的绿苹果。二、代码实现2.1行......
  • memcached学习总结
      一、Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱......