托管代码编写mssql存储过程
参考:http://wenku.it168.com/d_000642903.shtml
打开vs,创建数据库项目,添加新项,选择sql clr c#, 选择存储过程。
样例:
[Microsoft.SqlServer.Server.SqlProcedure]
public static int mypro2(int id, string mc, out string err)
{
using (SqlConnection cn = new SqlConnection("context connection=true"))
{
cn.Open();
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = $"insert into t1(id,mc) values({id}, '{mc}')";
cmd.ExecuteNonQuery();
}
err = mc + id;
return 100;
// 在此处放置代码
}
可以返回记录集,示例见:https://blog.csdn.net/tjvictor/article/details/4731052
有两种方法:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void mypro3()
{
//返回 记录集
using (SqlConnection cn = new SqlConnection("context connection=true"))
{
cn.Open();
SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = $"select * from t1";
SqlContext.Pipe.Send(cmd.ExecuteReader());
}
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static void mypro4()
{
//返回DataSet内容
SqlDataRecord dataRecord = new SqlDataRecord(new SqlMetaData[] {
new SqlMetaData("Col1", SqlDbType.NVarChar,100),
new SqlMetaData("Col2", SqlDbType.Int)
});
//开始填充
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int count = 0; count < 5; count++)
{
//SqlDataRecord.SetString类似DataRow的功能,像Table中填充值
dataRecord.SetString(0, count.ToString());
dataRecord.SetInt32(1, count);
//通过SendResultsRow把数据填充到Table,相关于Table.Rows.Add(DataRow);
SqlContext.Pipe.SendResultsRow(dataRecord);
}
//填充结束,返回结果集
SqlContext.Pipe.SendResultsEnd();
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SPOne()
{
SqlPipe p;
SqlCommand sCmd = new SqlCommand();
sCmd.CommandText = "Select * from Person";
p = SqlContext.Pipe;
p.ExecuteAndSend(sCmd);
}
重新生成程序,并发布,即可写入数据库。
1. 发布时可能的问题:sqlserver版本不匹配(右键项目属性,选择目标数据库版本)
2. 发布时失败:..net framework版本不匹配,ms2008只支持.net2和.net3.5等版本(右键项目属性,选择.net frameork版为2)
发布成功后,在数据库中可查看到此存储过程。
在数据库中启用clr:
exec sp_configure 'clr enabled',1
reconfigure with override
上述存储过程的调用示例:
USE [test]
GO
DECLARE @return_value int,
@err nvarchar(max)
EXEC @return_value = [dbo].[mypro2]
@id = 844,
@mc = N'95k在', --前面不加N测试也正确
@err = @err OUTPUT
SELECT @err as N'@err' --前面不加N测试也正确
SELECT 'Return Value' = @return_value
GO
发布和部署:
在vs2017中直接点“发布”,连接到mssql后,在mssql中生成相应存储过程,完成部署过程。
或:
在vs2017中点“发布”时,选择生成脚本,最后生成sql文件,在mssql的管理器中打开脚本文件,打开“查询”菜单,选择“sqlcmd”模式,运行以上文件即可生成相应存储过程。在脚本中,c#装配件被转换成了16进制字符串形式保存。
在生成的sql脚本中,有数据库文件路径,这个经测试,不重要,路径随便更改一下也可运行成功。如下:
:setvar DatabaseName "test"
:setvar DefaultFilePrefix "test"
:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\"
另外部署说明:
vs连接mssql时直接发布,可以生成相关存储集和存储过程,后续更新时可以生成sql脚本执行,但第一次无法使用脚本执行生成存储过程,提示装配件不存在,经查看在“C:\Users\ljq\AppData\Local\Microsoft\VisualStudio\SSDT\托管存储过程测试”目前下生成了mdf和ldf两个文件。
部署可以使用dll文件,参考:https://www.cnblogs.com/Brambling/p/8016060.html
CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll';
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld;
EXEC HelloWorld;
托管代码编写mssql存储过程的更多相关文章
- 实验9-1 编写一个存储过程proc_test_func
在TestDB数据库中,编写一个存储过程proc_test_func,要求如下: 1)输入参数 一个整型的输入参数 @value 2)要求在一个select语句返回: @value的绝对值, 此绝对值 ...
- 编写CLR存储过程中使用SqlDataRecord
温习一下这些天学习的CLR编程,存储过程,函数. 编写CLR的存储过程,运行起来的效率,果然比普通的SQL语句,存储过程或是函数均高. 以后专案需求,或是执行效率较高的SQL,得写成CLR程序,再部署 ...
- SQLServer2008:助您轻松编写T-SQL存储过程(原创)【转】
本文主要介绍 SQLServerExpress2008不用第三方工具调试T-SQL语句,经过本文的介绍,用SQLSERVER2008 Manage studio 编写.调试T-SQL存储过程都将是 ...
- Oracle结果集 (MSSQL存储过程写报表)
接触SQL Server比较多,写报表是用存储过程实现. 对Oracle实现像MSSQL那样,还是有很多疑问
- MSSQL存储过程接收另一个存储过程返回列表
CREATE TABLE #tmp(m_Meter_ID varchar(20),low_Voltage int,num_Attack int,num_DER int,company_id int,a ...
- mysql使用navicat编写调用存储过程
在Navicat里面,找到函数,右键,新建函数,选择过程,如果有参数就填写函数,如果没有就直接点击完成 在BEGIN......END中间编写要执行的sql语句,例如下面存储过程取名为pro_data ...
- MSSQL手札三 MSSQL存储过程
--存储过程完成一段sql代码的封装 create proc trim --参数列表,多个间用逗号分隔 ) as --自定义代码段 ) set @str1=LTRIM(RTRIM(@str)) pri ...
- MSSQL存储过程(好久的笔记,翻出来怀念下)
语法结构: create proc 名称 参数列表 as 代码段 调用: exec 存储过程名称 参数列表 要点: .可以使用output修饰参数 .可以使用默认值,注意需要将最后的参数设置成默认值 ...
- MSSQL - 存储过程Return返回值
1.存储过程中不使用外部参数. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================== ...
随机推荐
- 【日常记录】【unity3d】 OnTriggerEnter 和 OnCollisionEnter (2D) 的区别
问题:两个物体A,B 两者都有碰撞体 collider(Box Collider,Sphere Collider,Capsule Collider等)当两物体相撞时,会进入 OnTriggerEnte ...
- python已写内容中可能的报错及解决办法
理论上我发的每个短文,直接复制放到py里面,python xx.py是可以执行的,不过因为版本,编码什么的问题会有报错,详见这里 报错: SyntaxError: Non-ASCII characte ...
- inclusion_tag 界面的嵌套 和渲染
后端的html渲染到前端: 如果后端直接定义的是html标签,传到前端的时候因为浏览器的安全机制就会直接渲染成字符串如果想要渲染成需要的标签,就需要在后端用make_save()进行包裹,或者直接在前 ...
- UIButton的resizableImageWithCapInsets使用解析
UIButton的resizableImageWithCapInsets使用解析 效果: 使用的源文件: 源码: // // ViewController.m // SpecialButton // ...
- Python入门-模块2(sys模块、shutil 模块)
sys模块: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 s ...
- Linux stat命令详解
stat:查看文件或者文件系统的状态 -->可以查看时间等属性 stat常见命令参数 Usage: stat [OPTION]... FILE... Display file or file ...
- idea+maven+spring+cxf创建webservice应用(二)生成客户端程序
idea+maven+spring+cxf创建webservice应用(二)生成客户端程序,以上一篇为基础"idea+maven+spring+cxf创建webservice应用" ...
- September 05th 2017 Week 36th Tuesday
I always in the deepest despair, meet the most beautiful sunrise. 我总是在最深的绝望里遇见最美丽的惊喜. Some pessimist ...
- scrapy爬虫框架之Xpath选择器
问题: 本篇博文主要记录scrapy框架爬取伯乐在线文章的相关知识,在实践中学习对框架的理解.今天主要记录了xpath的相关用法以及语法规范. ----->>>点击进入爬取页面 一. ...
- 用Python爬虫爬取炉石原画卡牌图片
前段时间看了点Python的语法以及制作爬虫常用的类库,于是动手制作了一个爬虫尝试爬取一些炉石原画图片.本文仅记录对特定目标网站的分析过程和爬虫代码的编写过程.代码功能很局限,无通用性,仅作为一个一般 ...