2010-09-21 103 views
1

我使用下面的代码通过执行存储过程向数据库插入值。使用odbc将参数设置为通过addwithvalue存储过程

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 

有没有解决办法?

回答

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)

+0

没有。我测试它,但我还有同样的错误。 – Mahsa 2010-09-21 10:44:38

+0

加上价值我认为如果我使用“2”或2,那么这个问题就没有关系。这个值对于数字很重要。 – Mahsa 2010-09-21 10:45:07

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