从 C# 调用具有自定义类型参数的存储过程?
Posted
技术标签:
【中文标题】从 C# 调用具有自定义类型参数的存储过程?【英文标题】:Call stored procedure with custom type parameter from c#? 【发布时间】:2013-09-02 13:29:47 【问题描述】:我有一个自定义类型如下的程序:
CREATE PROCEDURE MyProc
@Arg1 CustomArgType readonly
AS
BEGIN
.
.
.
END
自定义类型在哪里:
CREATE TYPE dbo.CustomArgType as TABLE
(
SomeInt int not null
)
如何在c#中调用上述存储过程?
可以使用什么样的适配器?像 EF 这样的 ORM 可以使用这样的存储过程吗?
【问题讨论】:
“表值参数” - raw ado.net 当然可以(尽管它的工作效果取决于场景) 【参考方案1】:为了测试这一点,我扩展了您的存储过程,使其返回参数表的第一行:
CREATE PROCEDURE MyProc
@Arg1 CustomArgType readonly
AS
BEGIN
select top 1 SomeInt from @Arg1
END
现在我可以在 C# 中使用以下代码来执行存储过程:
using (var conn = new SqlConnection("Data Source=localhost;Initial Catalog=temp;User ID=sa"))
conn.Open();
DataTable dt = new DataTable();
dt.Columns.Add("SomeInt", typeof(Int32));
dt.Rows.Add(new Object[] 3 );
var command = conn.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MyProc";
command.Parameters.Add(new SqlParameter("@Arg1", dt));
object returnValue = command.ExecuteScalar();
returnValue
是我预期的 3(我插入到参数表的第一行)。
不幸的是,我对 EF 了解不多,所以我不能说你是否可以这样做。
【讨论】:
【参考方案2】:您可以将表参数定义为“结构化”,并将其值设置为 C# 中的列表/表变量。示例代码如下:
try
using (var conn = new SqlConnection(myConnectionString))
using (var command = new SqlCommand("MyProc", conn)
CommandType = CommandType.StoredProcedure
)
command.Parameters.Add(new SqlParameter("@Arg1", SqlDbType.Structured));
command.Parameters["@Arg1"].Value = myArgVariable;
command.Parameters["@Arg1"].TypeName = "dbo.CustomArgType";
conn.Open();
command.ExecuteNonQuery();
catch (Exception ex)
throw;
参考:https://blogs.msdn.microsoft.com/felixmar/2010/10/27/how-to-create-and-execute-a-stored-procedure-using-a-table-as-a-parameter/
【讨论】:
以上是关于从 C# 调用具有自定义类型参数的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
从 0jdbc6 JDBCthin 驱动程序调用具有自定义对象返回类型的 Oracle PL/SQL 过程