【问题标题】:Using VB.net to alter Stored Parameters使用 VB.net 更改存储参数
【发布时间】:2015-02-23 20:33:28
【问题描述】:

我在使用 VB.net 修改存储过程变量时遇到问题。我发现了很多关于这个主题的帖子,使它看起来像是一个简单的.AddWithValue 解决方案,但我一直以以下异常结束:

IListSource 不包含任何数据源。

存储过程是一个动态数据透视表,可以很好地使用@dcs 的静态值

CREATE PROCEDURE [dbo].[dcspull]
as
DECLARE @cols AS NVARCHAR(MAX),
        @colsNull AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),
        @dcs AS INT



select @cols = STUFF((SELECT ',' + QUOTENAME(FirstName) 
               FROM[Training Data]
               WHERE DataCenterID = @dcs 
               GROUP by FirstName
               ORDER by FirstName
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

select @colsNull = STUFF((SELECT  ', coalesce(' + QUOTENAME(FirstName)+''''') 
                AS '+QUOTENAME(+FirstName)
                FROM [Training Data]
                WHERE DataCenterID = @dcs
                GROUP by FirstName
                ORDER by FirstName
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')


set @query = 'SELECT Topic, ' + @colsNull + ' 
                 FROM
                 (SELECT FirstName, Topic, Level
                 FROM [Training Data]) x
                 PIVOT
                    (MAX(Level)
                    FOR FirstName IN (' + @cols + ')) p'

execute(@query)

我试图通过 VB.Net 更改的唯一值是 @dcs。当@dcs 被静态设置时,Gridview 会按预期填充,但是一旦我尝试将值传递给参数,它就会中断。

Dim SQLCon As String = ConfigurationManager.ConnectionStrings("tCString").ToString
Dim DBConnSQL As New SqlConnection(SQLCon)
Dim da As New SqlDataAdapter
Dim ds As New DataSet
DBConnSQL.Open()
Dim dbcheckone As New SqlCommand("dcspull", DBConnSQL)
dbcheckone.parameters.addwithvalue("@dcs", Convert.ToInt64(DropDownList1.Text))
da.SelectCommand = dbcheckone
da.Fill(ds)
GridView1.DataSource = ds
GridView1.DataBind()

我对存储过程还很陌生,我认为这是我对这种关系的不理解。

【问题讨论】:

  • 第一个问题是我没有看到您的 SqlCommand 被设置为存储过程的 CommandType。其次,我不接受 @dcs 参数的 SPROC,您确实声明了它,但这与调用时接受参数的 SPROC 不同
  • 您还在代码中添加了一个参数,但您的过程中没有参数。
  • 您可能还想看看这篇文章。 blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…
  • 感谢提示,我没有意识到“声明”不是程序。正如我所说,存储过程的新手。

标签: asp.net vb.net stored-procedures


【解决方案1】:

首先,我在您的存储过程中看不到任何参数。他们应该在AS 之前。 示例创建 SP:

CREATE PROCEDURE HumanResources.uspGetEmployeesTest2 
    @LastName nvarchar(50), 
    @FirstName nvarchar(50) 
 AS 

现在,当您添加这些参数时,它应该在以下条件下工作:

  1. 需要设置命令类型

dbcheckone.CommandType = CommandType.StoredProcedure

  1. 即使您在调用期间不使用其他参数,您的过程签名和过程本身也不匹配。您不能省略非可选参数。所以你需要列出每个参数

dbcheckone.parameters.addwithvalue("@cols"... dbcheckone.parameters.addwithvalue("@colsNull"... dbcheckone.parameters.addwithvalue("@query"... dbcheckone.parameters.addwithvalue("@dcs", Convert.ToInt32(DropDownList1.Text))

关于这里的最后一行 - 您在代码中将其设置为 Convert.ToInt64,但您的参数是 int,因此它应该匹配 int32

【讨论】:

  • 这就像一个魅力!我使用您列出的所有内容尝试了 vb.net 脚本(除了没有意识到它需要是 int32 之外)。问题是我缺乏关于必须在 AS 之前声明的参数而不是其他声明的知识!
猜你喜欢
  • 1970-01-01
  • 2012-02-18
  • 2011-09-17
  • 2021-07-20
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多