【问题标题】:Execute Sybase SQL Stored Procedure With Return In VB在 VB 中执行带返回的 Sybase SQL 存储过程
【发布时间】:2013-10-01 13:20:10
【问题描述】:

我正在尝试与使用 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

谁能给我和指点

提前致谢 文斯

【问题讨论】:

  • 在 ExecuteReader 行调用 SP 时是否出错?

标签: sql vb.net stored-procedures sybase


【解决方案1】:

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

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

【讨论】:

  • 史蒂夫,感谢您的 cmets。顶部的 SQL 命令:
  • 史蒂夫,感谢您的 cmets。顶部的 SQL 命令只是我在 SQL 查询窗口中运行以执行 GetNextPrimary 存储过程的示例。其中 quotehdr 是存储过程的参数。这是我现在的代码: cmd = New Odbc.OdbcCommand("{ CALL GetNextPrimary (?) }", conn) cmd.CommandType = CommandType.StoredProcedure Dim param As Odbc.OdbcParameter = cmd.Parameters.Add("@tablename", Odbc .OdbcType.VarChar) param.Value = "quotehdr" Dim QuoteHdrRef As Integer = cmd.ExecuteScalar() 我现在的问题是 Scalar 只给了我 0 和非查询 -1
  • 能否添加GetNextPrimary 存储过程的代码?我对您如何使用该参数有一些疑问。
  • ProspectSoft 安装的预配置 SP 太长,无法放入此处,因此顶部和底部如下: ALTER FUNCTION "DBA"."GetNextPrimary"(in ls_Tablename varchar(128)) 返回整数 NOT DETERMINISTIC begin其他一些代码... -- 向控制台发送消息 ll_uniquekey 类型信息; if ll_uniquekey = 0 then leave incrementloop end if end loop incrementloop;返回(ll_Primary)结束
【解决方案2】:

原来 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

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多