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