asp.net – SQL Server用户定义的表类型和.NET
我需要将一个整数数组从.NET传递给一个存储过程,所以我搜索了这个主题并最终跑过了
Arrays and Lists in SQL Server 2008,由Erland Sommarskog编写并且据称被认为是进行此过程的标准方式.
我已经尝试了两种不同的方式将用户定义的表类型传递给存储过程,但我每个都得到例外.这两种方式都与Erland Sommarskog在上面的链接中使用的方式类似. 方式#1 – 使用DataTable作为SqlParameter DataTable dt = new DataTable(); dt.Columns.Add("n",typeof(int)); // Just adding 3 test rows to the DataTable DataRow dr = dt.NewRow(); dr["n"] = 1; dt.Rows.Add(dr); dr = dt.NewRow(); dr["n"] = 2; dt.Rows.Add(dr); dr = dt.NewRow(); dr["n"] = 3; dt.Rows.Add(dr); // Creation of the SqlParameter SqlParameter p = new SqlParameter(); p.ParameterName = "@ids"; p.Direction = ParameterDirection.Input; p.SqlDbType = SqlDbType.Structured; p.TypeName = "lstInt_TblType"; p.Value = dt; // Blows up here DataSet ds = DAWrapper.GetDataSet( Common.GetDB(),"usp_Test",new SqlParameter[] { p }); 我得到的例外是: 方式2 – 使用List作为SqlParameter List<SqlDataRecord> lstSDR = new List<SqlDataRecord>(); SqlMetaData[] tvp_definition = { new SqlMetaData("n",SqlDbType.Int) }; // Just adding 3 test rows SqlDataRecord rec = new SqlDataRecord(tvp_definition); rec.SetInt32(0,50); lstSDR.Add(rec); rec = new SqlDataRecord(tvp_definition); rec.SetInt32(0,51); lstSDR.Add(rec); rec = new SqlDataRecord(tvp_definition); rec.SetInt32(0,52); lstSDR.Add(rec); // Creation of the SqlParameter SqlParameter p = new SqlParameter(); p.ParameterName = "@ids"; p.Direction = ParameterDirection.Input; p.SqlDbType = SqlDbType.Structured; p.TypeName = "lstInt_TblType"; p.Value = lstSDR; // Blows up here DataSet ds = DAWrapper.GetDataSet( Common.GetDB(),new SqlParameter[] { p }); 我得到的例外情况表明: 其他信息 我还验证了存储过程usp_Test可以在SQL Server Manager Studio中运行,因此我非常确定异常不会从该方向发出.这是我用来验证存储过程是否有效的t-sql: DECLARE @ids lstInt_TblType INSERT @ids(n) VALUES(1),(2),(3) EXEC usp_Test ids 任何有关如何使用此建议的建议将不胜感激.谢谢! *编辑:* ALTER PROCEDURE [dbo].[usp_Test] ( @ids lstInt_TblType READONLY ) AS BEGIN SET NOCOUNT ON; select * from dbo.dat_MetaData where MetaDataTypeID in (select n from @ids) END GO 解决方法
找到了另一种方法去做.这种方式使用System.Data.SqlClient库创建与数据库的连接,指定存储过程名称,然后将参数作为DataTable传递,作为SQL Server用户定义的表类型.
using (SqlConnection conn = new SqlConnection(connStr)) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "dbo.usp_Test"; cmd.Parameters.AddWithValue("@ids",dt); conn.Open(); using (SqlDataReader sqlReader = cmd.ExecuteReader()) { DataTable retTbl = new DataTable(); retTbl.Load(sqlReader); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在ControllerInstanceFilterProvider的Filt
- asp.net-mvc-3 – ASP.NET MVC 3将无法识别.cshtml视图文件
- 如何调试asp.net mvc 4源代码?
- asp.net core webapi 服务端配置跨域的实例
- .net core 3.0_webapi项目使用Swagger提供接口帮助页面
- Asp.Net Core API网关Ocelot
- asp.net – 有一种简单的方法可以从.NET用户控件中删除“ct
- asp.net-mvc – .NET 4.5 MVC RouteCollection.LowercaseUr
- asp.net-mvc – ASP.NET MVC HTML帮助程序可以渲染没有ID属
- 可以将图像添加到ASP.NET按钮吗?
- asp.net – 调用SqlMembershipProvider GetUser的
- 给 asp.net core 写个中间件来记录接口耗时
- 第17章 ASP.NET MVC实战: 构建NuGet.org网站
- asp.net – 自动插入HTML属性的双引号
- asp.net – monodevelop可以像没有VS2010一样进行
- asp.net-mvc – 从mvc 4(4.5)升级到mvc 5(4.5.1)
- asp.net – 在Response.End之前使用Response.Flu
- asp.net-mvc – SportStore:WebUI.WindsorContr
- 实体框架 – 具有实体框架的MVC MiniProfiler 5模
- 如何编译x64 asp.net网站?