使用 VB.net 更改存储参数
Using VB.net to alter Stored Parameters
我在使用 VB.net 修改存储过程变量时遇到问题。我发现许多关于该主题的帖子使它看起来像是一个简单的 .AddWithValue
解决方案,但我总是以以下异常结束:
The IListSource does not contain any data sources.
存储过程是一个动态数据透视表 table,非常适合 @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()
我对存储过程还很陌生,我假设这是我对这种关系不了解的地方。
首先,我在您的存储过程中没有看到任何参数。他们应该在 AS
之前。
示例创建 SP:
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
现在,当您添加这些参数时,它应该在这些条件下工作:
- 您需要设置命令类型
dbcheckone.CommandType = CommandType.StoredProcedure
- 即使您在调用期间不使用其他参数,您的过程签名和过程本身也不匹配。您不能省略非可选参数。所以你需要列出每个参数
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 修改存储过程变量时遇到问题。我发现许多关于该主题的帖子使它看起来像是一个简单的 .AddWithValue
解决方案,但我总是以以下异常结束:
The IListSource does not contain any data sources.
存储过程是一个动态数据透视表 table,非常适合 @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()
我对存储过程还很陌生,我假设这是我对这种关系不了解的地方。
首先,我在您的存储过程中没有看到任何参数。他们应该在 AS
之前。
示例创建 SP:
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
现在,当您添加这些参数时,它应该在这些条件下工作:
- 您需要设置命令类型
dbcheckone.CommandType = CommandType.StoredProcedure
- 即使您在调用期间不使用其他参数,您的过程签名和过程本身也不匹配。您不能省略非可选参数。所以你需要列出每个参数
dbcheckone.parameters.addwithvalue("@cols"...
dbcheckone.parameters.addwithvalue("@colsNull"...
dbcheckone.parameters.addwithvalue("@query"...
dbcheckone.parameters.addwithvalue("@dcs", Convert.ToInt32(DropDownList1.Text))
关于此处的最后一行 - 您在代码中将其设置为 Convert.ToInt64
,但您的参数是 int
,因此它应该匹配 int32
。