2013-10-20 13 views
-1

我有一個存儲過程是這樣的:無法參數值從字符串轉換成的Int32同時使整數變量

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參數(一個整數)的列表框,併爲@fromDate@toDate. 2個的DateTimePicker控件我把我的列表框的值是這樣的:

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。有什麼問題我code..any的幫助是巨大的讚賞..

+2

當然是一種類似「 「 0,1,2,3「'不能被解析爲數字。 – ElektroStudios

+0

所以我必須改變? – user2878851

+0

對於SQL2008 +我會使用[TVP](http://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/) –

回答

1

如果你定義存儲過程的參數是DATETIME(好東西!):

@startDate datetime,  

則還必須在它們定義爲這樣的你的VB.NET代碼!

這是錯誤

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

它應該是:

cmd23.Parameters.Add("@startDate", SqlDbType.DateTime).Value = ........ 
+0

先生我的錯誤cmd23.Parameters.Add(「@ locations」,SqlDbType.Int).Value = String.Join(「,」,list)only ..string like「0,1,2,3」can not be parsed as a number.so我必須做出什麼改變? – user2878851

1

在這一行:

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

你是生產像1,2,3,4,5

字符串

然後,你需要刪除delimitter加入列表時:

String.Join("", list) 

這將產生數像12345

+0

先生..我想參數存儲過程只有1,2,3只有 – user2878851

+0

對不起,我沒有低估得多(我的英文不是很好)。如果你想讓vlaue爲'1,2,3',那麼將存儲過程的值類型從'Integer'改爲'String',你試圖設置一個字符串值而不是數值。 – ElektroStudios

+0

你的意思是改變整數參數爲nvarchar? – user2878851

0

SQL Server的一個系列目前不支持該功能,你描述(雖然我希望它),如果你有能力在SQL服務器上創建對象,你可以創建一個表格形式的表值參數AKA參數。

基本上你在服務器上創建一個「表類型」。它是一張空表,用於描述可以傳遞給參數的數據表的形狀。在你的情況下,你會創建一個列與一列。

讓我們來看看這個例子。 SQL服務器上創建的表類型的對象:

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,並執行一個字符串。替換@tvpNewCategories並將其替換爲(1,2,3,4)

相關問題