-1

我有一个这样的存储过程:

 ALTER PROCEDURE [dbo].[T_TransactionSummary]  
                            @startDate datetime,  
                            @endDate datetime,       
                            @locations integer    
    AS
    BEGIN 

.................
................
WHERE (Transaction_tbl.dtime BETWEEN @fromDate AND @toDate)
AND (Location_tbl.Locid IN (@locations))

我有一个 ListBox 填充 @locations 参数(一个整数),以及两个 DateTimePicker 控件,@fromDate@toDate. 将我的列表框值设为:

cnt = LSTlocations.SelectedItems.Count
 Dim list As New List(Of Integer)
        Dim locid As Integer
        If cnt > 0 Then
            For i = 0 To cnt - 1
                Dim locationanme As String = LSTlocations.SelectedItems(i).ToString
                locid = RecordID("Locid", "Location_tbl", "LocName", locationanme)
                list.Add(locid)
            Next
End If
 Dim da As New SqlDataAdapter
        Dim ds As New DataSet
        Dim cmd23 As New SqlCommand("T_TransactionSummary", con.connect)
        cmd23.CommandType = CommandType.StoredProcedure
        cmd23.Parameters.Add("@startDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = startdate
        cmd23.Parameters.Add("@endDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = enddate
        cmd23.Parameters.Add("@locations", SqlDbType.Int).Value = String.Join(",", list)
 da.SelectCommand = cmd23
        da.Fill(ds)  

如果代码到达这里,我会收到这样的错误:

“无法将参数值从字符串转换为 Int32

我知道这行出错了

cmd23.Parameters.Add("@locations", SqlDbType.Int).Value = String.Join(",", list)  

我想将参数转到像 1、2、3 这样的存储过程,只有我使用的是 vb.net。我的代码有什么问题..任何帮助都非常感谢..

4

3 回答 3

1

如果你定义你的存储过程参数是DATETIME(好事!):

@startDate datetime,    

那么您还必须在您的 VB.NET 代码中定义它们!

这是错误的:

cmd23.Parameters.Add("@startDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = startdate

它应该是:

cmd23.Parameters.Add("@startDate", SqlDbType.DateTime).Value =  ........
于 2013-10-20T13:36:52.467 回答
1

在这一行:

cmd23.Parameters.Add("@locations", SqlDbType.Int).Value = String.Join(",", list)

你正在生产一个像这样的字符串1,2,3,4,5

那么在加入列表时需要删除分隔符:

String.Join("", list)

这将产生一系列数字,例如12345

于 2013-10-20T13:36:58.400 回答
0

SQL Server 目前不支持您描述的功能(尽管我希望它支持,但我也有同样的问题。)如果您有能力在 SQL Server 上创建对象,则可以创建所谓的表值参数 AKA 参数以桌子的形式。

基本上,您在服务器上创建一个“表类型”。它是一个空表,描述了可以传递给参数的数据表的形状。在您的情况下,您将创建一个包含一列的表。

让我们来看看这个例子。在 SQL Server 上创建表类型对象:

CREATE TYPE dbo.CategoryTableType AS TABLE
( CategoryID int, CategoryName nvarchar(50) )

现在,在您的存储过程或代码中的动态 SQL 中,您可以基于该类型声明表值参数。这将创建一个带有一个类型为 dbo.CategoryTableType 的输入参数的存储过程。现在您可以传入包含 CategoryID 和 CategoryName 列的行。请注意,它必须是只读的。

CREATE PROCEDURE usp_UpdateCategories 
(@tvpNewCategories dbo.CategoryTableType READONLY)

现在您可以将值传递给参数化的 SQL 语句。请注意,您的 SQL 参数必须是 SqlDBType.Structured 类型。:

Dim sqlParameter As New SqlClient.SqlParameter
sqlParameter.ParameterName = "@tvpNewCategories"
sqlParameter.SqlDbType = SqlDbType.Int
sqlParameter.Value = addedCategories
sqlParameter.TypeName = "dbo.CategoryTableType"

您将输入数据创建为 VB 或 C# DataTable:

'Create a DataTable with the modified rows.
Dim addedCategories As DataTable = _
CategoriesDataTable.GetChanges(DataRowState.Added)

更多信息: http: //msdn.microsoft.com/en-us/library/bb675163 (v=vs.110).aspx

旁注:最简单但最不优雅的方法是在代码中使用动态 SQL 并执行 string.replace 并将 @tvpNewCategories 替换为 (1, 2, 3, 4)

于 2013-11-04T22:06:49.797 回答