2015-02-23 49 views
1

我遇到了使用VB.net修改存储过程变量的问题。我已经发现,使得它看起来像一个简单的解决方案.AddWithValue的话题很多帖子,但我一直在结束了与以下异常:使用VB.net更改存储参数

的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() 

我对存储过程相当陌生,并且假设这是我只是不了解关系的东西。

+0

第一个问题是我没有看到您的SqlCommand被设置为存储过程的CommandType。其次,我不是SPROC接受@dcs参数,你确实声明它,但是它不同于调用时接受参数的SPROC – 2015-02-23 20:46:06

+0

您还在代码中添加了一个参数,但是没有参数你的程序。 – 2015-02-23 20:49:01

+1

你可能也想看看这篇文章。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – 2015-02-23 20:49:33

回答

0

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

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

现在,当你添加这些参数应该在这些条件下工作:

  1. 您需要设置命令类型

dbcheckone.CommandType = CommandType.StoredProcedure

  1. 即使您在通话过程中不使用其他参数,您的proc edure签名和程序本身不匹配。您不能省略非可选参数。所以,你需要列出每一个参数

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

,最后一行 - 你在你的代码将其设置为Convert.ToInt64但你的参数为int,因此它应该匹配int32

+0

像一个魅力工作!我尝试了所有列出的vb.net脚本(除了没有意识到它需要是int32)。问题是我缺乏关于参数的知识,必须在AS之前声明,而不是与其他声明! – 2015-02-23 21:47:08

+0

@RupertDigly很高兴为你工作 – 2015-02-23 21:50:26