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); }
四、用最简单的方式测试,直接发布到对就原数据库
发布后,对应的数据库中在 可编程性\程序集中 找到相就的项目 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了
——

浙公网安备 33010602011771号