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

@locations パラメーター (整数) を設定する ListBox と、そのための 2 つの 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)  

私はvb.netを使用しています。私のコードの何が問題なのですか..どんな助けでも大歓迎です..

4

3 に答える 3

0

SQL Server は現在、あなたが説明した機能をサポートしていません (サポートしてほしいのですが、これと同じ問題があります)。SQL サーバーでオブジェクトを作成できる場合は、テーブル値パラメーター AKA パラメーターと呼ばれるものを作成できます。テーブルの形に。

基本的に、サーバー上に「テーブル タイプ」を作成します。これは、パラメーターに渡すことができるデータ テーブルの形状を説明する空のテーブルです。あなたの場合、1列のテーブルを作成します。

この例を見てみましょう。SQL サーバーでテーブル型オブジェクトを作成します。

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

これで、ストアド プロシージャまたはコード内の動的 SQL で、その型に基づいてテーブル値パラメーターを宣言できます。これにより、タイプ dbo.CategoryTableType の 1 つの入力パラメーターを持つストアド プロシージャが作成されます。これで、列 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 に答える