установить параметры через addwithvalue для хранимой процедуры, используя odbc - PullRequest
1 голос
/ 21 сентября 2010

Я использую приведенные ниже коды для вставки значений в базу данных, выполняя хранимую процедуру.

 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 голосов
/ 07 мая 2011

Ошибка возникает из-за того, что вы не передали параметр Return Value, который указан в 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")
0 голосов
/ 21 сентября 2010

На первый взгляд хранимая процедура имеет 1-й параметр типа 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...