使用odbc通过addwithvalue将参数设置为存储过程

时间:2010-09-21 10:34:05

标签: vb.net odbc

我使用下面的代码通过执行存储过程将值插入数据库。

 Dim connstring As String = "dsn=test"
 Dim oConn As Odbc.OdbcConnection = New Odbc.OdbcConnection(connstring)
 Dim com As New Odbc.OdbcCommand("{? = call sp_test1(?,?,?,?)}", oConn)
 com.CommandType = CommandType.StoredProcedure
 com.Parameters.AddWithValue("@Code", 2)
 com.Parameters.AddWithValue("@Name", "2")
 com.Parameters.AddWithValue("@Familly", "2")
 com.Parameters.AddWithValue("@Pname", "2")
 oConn.Open()
 com.ExecuteNonQuery()
 oConn.Close()

但是我收到了这个错误

ERROR [HY105] [Microsoft][ODBC SQL Server Driver]Invalid parameter type

这是我的存储过程

USE [test]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

Create Procedure [dbo].[sp_test1]
 @Code bigint,
 @Name nvarchar(50),
 @Familly nvarchar(50),
 @Pname nvarchar(50),
    As
    Begin
 Insert Into test1
  ([Code],[Name],[Familly],[Pname])
 Values
  (@Code,@Name,@Familly,@Pname)

 Declare @ReferenceID int
 Select @ReferenceID = @@IDENTITY

 Return @ReferenceID

 End

有解决方案吗?

2 个答案:

答案 0 :(得分:0)

乍一看,存储过程具有类型bigint的第一个参数,而它以输入的形式给出了字符串值。

com.Parameters.AddWithValue("@Code", "2")

将上述内容更改为

com.Parameters.AddWithValue("@Code", 2)

这有用吗?

编辑:你可以改变这一行

Dim com As New Odbc.OdbcCommand("{? = call sp_test1(?,?,?,?)}", oConn)

Dim com As New Odbc.OdbcCommand("sp_test1", oConn)

答案 1 :(得分:0)

发生错误是因为您没有传递返回值参数,该参数在CommandText中指定,但在参数集合中缺失(命令文本中的第一个问号是返回值参数)。

因为参数必须按顺序传递,所以ODBC认为@Code是RETURN_VALUE,而@Name实际上是@Code,因此发生类型不匹配错误。

您必须添加以下代码

com.Parameters.Add("", OdbcType.Int).Direction = ParameterDirection.ReturnValue
com.Parameters.AddWithValue("@Code", 2)
com.Parameters.AddWithValue("@Name", "2")
com.Parameters.AddWithValue("@Familly", "2")
com.Parameters.AddWithValue("@Pname", "2")