2010-09-21 100 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")