0

我正在尝试与使用 Sybase 作为后端的应用程序集成。该应用程序有一个用于返回下一个主键的存储过程:

declare @key int
execute @key = GetNextPrimary('quotehdr')
select @key

如果我从 SQL Interactive 执行上述操作,@key 会返回该值。现在我需要执行存储过程并从 VB 获取返回值。最初我认为必须有一种方法可以通过将 SQL 命令重新格式化为单行语句来执行存储过程,但是在阅读了其他帖子之后,很明显我需要使用 CommandType.StoredProcedure 方法但是我正在努力使用语法获取参数并获得响应:

    Try
        conn.Open()
        cmd.Connection = conn
        cmd.CommandText = "GetNextPrimary"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@key", "quotehdr")
        Dim lrd As Odbc.OdbcDataReader = cmd.ExecuteReader()
        While lrd.Read()
            QuoteHdrRef = Convert.ToString(lrd(0))
        End While
    Catch ex As Exception
        'MessageBox.Show("Failed to connect to data source")
    Finally
        conn.Close()
    End Try

谁能给我和指点

在此先感谢文斯

4

2 回答 2

0

原来 GetNextPrimary 是一个函数。所以使用了一个过程(getnextprimaryproc)来调用函数:

ALTER PROCEDURE "DBA"."getnextprimaryproc"(in tablename varchar(128),out ll_primary integer)
begin
ll_primary=call "dba".getnextprimary(tablename)
end

然后在VB中使用以下调用

cmd.Connection = conn
cmd = New Odbc.OdbcCommand("{ call getnextprimaryproc (?, ?)}", conn)
Dim param As Odbc.OdbcParameter = cmd.Parameters.Add("@tablename", Odbc.OdbcType.VarChar)
param.Value = "quotehdr"
param = cmd.Parameters.Add("@ll_primary", Odbc.OdbcType.Int)
param.Direction = ParameterDirection.Output
conn.Open()
cmd.ExecuteNonQuery()
QuoteHdrRef = cmd.Parameters(1).Value
于 2013-10-08T15:26:27.383 回答
0

如果存储过程中包含您问题中的文本,则无需传递任何参数。是变量的内部声明,它不是参数
。 它由 DataReader 作为单行单列的表返回。 只需删除添加参数的行就可以了。@Key

并且不要以这种方式吞下异常。如果您不打算对异常执行某些操作,则删除 Catch 或(出于调试目的)仅显示 ex.Message 属性

于 2013-10-01T13:40:57.333 回答