【问题标题】:Failed to convert parameter value from a String to a Int32 while passing integer variable传递整数变量时无法将参数值从字符串转换为 Int32
【发布时间】:2013-10-20 13:11:29
【问题描述】:

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

 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,以及@fromDate@toDate. 的两个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)  

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

"将参数值从 String 转换为 Int32 失败

我知道这行出错了

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

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

【问题讨论】:

  • 当然像"0,1,2,3"这样的字符串不能解析为数字。
  • 所以我要改变什么???
  • 对于 SQL2008+ 我会使用TVP

标签: sql-server vb.net ado.net


【解决方案1】:

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

@startDate datetime,    

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

这是错误

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

应该是:

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

【讨论】:

  • 先生,我在 cmd23.Parameters.Add("@locations", SqlDbType.Int).Value = String.Join(",", list) 中的错误..string like "0,1, 2,3" 不能被解析为数字。那么我必须做出什么改变?
【解决方案2】:

在这一行:

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

你正在生成一个类似1,2,3,4,5的字符串

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

String.Join("", list)

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

【讨论】:

  • 先生..我只想将参数转到存储过程,例如 1,2,3
  • 对不起,我不太明白(我的英语不是很好)。如果您希望 vlaue 为 1,2,3,然后将存储过程的值类型从 Integer 更改为 String,则您正在尝试设置字符串值而不是数值。
  • 你的意思是把整数参数改成nvarchar??
  • 我的 locid 是整数。所以位置参数应该采用整数变量吗?
  • @locations integer"@locations", SqlDbType.Int 更改它应该采用字符串变量,因为您没有尝试设置整数值
【解决方案3】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多