MSSql 使用 C#中的方法 踩坑记

因为在一个项目中,数据库中调用的存储过程,想在某一项数据发生变化,需要发触发一些操作(比如,把相应的需要操作添加到对列中,又或者需要远程提交数据等等)。又不想去改变现有的程序。

就用到了SQL CLR C# 用户定义函数

一、需要建一个 SQL  Server 数据库项目

 

 

 二、添加一个 SQL CLR C# 用户自定义函数

 

 

 三、编写对应的C#函数

[Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString HttpRequest(SqlString url, SqlString json, SqlString method)
    {
        string result = "";
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url.Value);
        req.Method = method.Value;

        if (req.Method.ToLower() == "get")
        {
            req.ContentType = "text/html";
        }
        else
        {
            #region 添加Post 参数
            if (!string.IsNullOrEmpty(json.Value))
            {
                req.ContentType = "application/x-www-form-urlencoded";
                byte[] data = Encoding.UTF8.GetBytes(json.Value);
                req.ContentLength = data.Length;
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                    reqStream.Close();
                }
            }
            else
            {
                req.ContentLength = 0; // 为空必须要设置 ContentLength = 0
            }
            #endregion
        }

        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        Stream stream = resp.GetResponseStream();
        //获取响应内容  
        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
        {
            result = reader.ReadToEnd();
        }
        return new SqlString(result);
    }
View Code

四、用最简单的方式测试,直接发布到对就原数据库

  发布后,对应的数据库中在 可编程性\程序集中 找到相就的项目 Database_Test

  并在函数中 可编程性\函数 中找到对应的函数 HttpRequest

  

CREATE FUNCTION [dbo].[HttpRequest](@url [nvarchar](max), @json [nvarchar](max), @method [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [Database_Test].[UserDefinedFunctions].[HttpRequest]

--Database_Test ==> 对应到生成 dll 程序集
--UserDefinedFunctions ==> 类名
--HttpRequest ==> 方法名

  这样看上去,好像可以 直接在存储过程中调用这个函数了 select  dbo.HttpRequest(url, postvalue, method)

结果事与愿违

 

 

 报错了...

再来设置一下

ALTER DATABASE <dataname> SET TRUSTWORTHY ON

--1.
exec sp_configure 'show advanced options', '1';
Go
reconfigure;
go
exec sp_configure 'clr enabled', '1'
go
reconfigure;    --如果执行失败,就用这个RECONFIGURE WITH OVERRIDE;
exec sp_configure 'show advanced options', '1';
go
 
--2.查SID在sys.databases 和sys.server_principals是否一致
--SELECT * FROM sys.server_principals;
--SELECT * FROM sys.sysdatabases ;
--3.查看程序集是否存在
--SELECT * FROM sys.assemblies;
--SELECT * FROM sys.assembly_files;
--4.修改为ON
ALTER DATABASE <dataname> SET TRUSTWORTHY ON;
--5.注意所有者
exec sp_changedbowner 'sa'

  执行后,还需要把

 

 对应的程序集的属性中的 权限集调整为无限制

这下的应该OK了

在本地行径OK没有发问题

发布出去,又出踩坑了

原来服务器上的数据库是2008,原来2008r2以下,数据库的项目必须要在 .net fromework4.0以下才行,又调整 3.5,重新发布,这下OK了

——

posted @ 2020-04-20 19:20  氵寿  阅读(184)  评论(0)    收藏  举报