带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充

Posted

技术标签:

【中文标题】带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充【英文标题】:Stored procedure with table type parameter returns data but SqlDataAdapter will not fill 【发布时间】:2012-08-17 05:51:54 【问题描述】:

我将数据表传递给存储过程(使用表类型)以一次更新多条记录。 SQL profiler 显示存储过程的执行和记录的更新;但是,我还将数据集返回到 SqlDataAdapter。当我在 SSMS 中执行此操作时,我得到了结果。当我在代码中运行它时,没有收到行。

有什么想法吗?我不知道为什么 SqlDataAdapter 没有被填充。奇怪的是,我可以得到表数,但没有任何表的行数。

CREATE PROCEDURE [dbo].[SGT_UpdateSGT]
 @SGT_GuidelinesTbl As [dbo].[SGT_GuidelinesTbl] Readonly
AS
BEGIN
 SET NOCOUNT ON;
 update g set Disposition=sgt.Disposition, DispositionDate=GETDATE() from SGTGuidelineRequests g inner join @SGT_GuidelinesTbl sgt on g.pkid=sgt.pkid

 select u.ForeName, u.Email, g.* 
 from @SGT_GuidelinesTbl sgt
 inner join SGTGuidelineRequests g on g.pkid=sgt.pkid
 inner join Users u on u.NBID=g.SubmittedBy
END
GO

c# 代码。会话正在填充中

DataSet dataSet = new DataSet();
DataTable queue = (DataTable)Session["SGTKeepDeleteQueue"];
using (SqlConnection sqlConnection = new SqlConnection(SQLConn.CWFMO()))

  sqlConnection.Open();
  SqlCommand sqlCommand = new SqlCommand("SGT_UpdateSGT", sqlConnection);
  sqlCommand.CommandType = CommandType.StoredProcedure;

  SqlParameter guidelinesTblParam = new SqlParameter();
  guidelinesTblParam.ParameterName = "@SGT_GuidelinesTbl";
  guidelinesTblParam.SqlDbType = SqlDbType.Structured;
  guidelinesTblParam.Value = queue;
  sqlCommand.Parameters.Add(guidelinesTblParam);

  SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
  sqlDataAdapter.Fill(dataSet);

这就是 SQL Profiler 接收到的。当我执行这个时,我得到至少 1 行数据。

declare @p1 dbo.SGT_GuidelinesTbl
insert into @p1 values(1,N'Approved',N'8/23/2012 12:00:00 AM')

exec SGT_UpdateSGT @SGT_GuidelinesTbl=@p1

【问题讨论】:

可能有助于显示您的 C# 代码(最好是演示问题的最少量代码),因为您已经解释过存储过程有效。 我明天可以,但我知道代码有效。我已经在 SSMS 和一个 c# 函数中测试了存储过程。我认为这与加入表格类型有关。就像查询在 SSMS 中有效,但在数据适配器中失败。 您知道代码有效,但在这里我们试图盲目地找出您为什么要尝试解决听起来很像不起作用的问题。我们无法修复我们看不到的东西。 我添加了调用sproc的c#部分,谢谢! 您应该使用 SQL Profiler 检查正在发送的命令。 【参考方案1】:

我更改了 SqlDataAdapter 的名称,它可以工作。我不知道为什么,我没有在文件的其他任何地方命名它。清洗溶液也没有解决这个问题。至少它有效。

感谢您的建议和反对票。

【讨论】:

以上是关于带有表类型参数的存储过程返回数据但 SqlDataAdapter 不会填充的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 从存储过程中获取 Oracle 表类型

带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用

如何在带有 LINQ to SQL 的存储过程中使用临时表

具有用户定义表类型的 SQL Server 存储过程

在MySQL中如何创建一个带输出参数为一个表类型的存储过程

带有参数的 PL/SQL 过程/函数从选择查询返回表