【问题标题】:How to call stored procedure that returns 1 row?如何调用返回 1 行的存储过程?
【发布时间】:2021-08-29 04:01:23
【问题描述】:

如何在 C# 中调用一个过程只返回 1 行?

当我运行我编写的这段代码时,我得到了这个错误:

ORA-06502 :PL/SQL: 数值或数值错误

代码:

con.Open();

OracleCommand comm = new OracleCommand();
comm.Connection = con;
comm.CommandText = "GetFirstName";
comm.CommandType = CommandType.StoredProcedure;

comm.Parameters.Add("ssnid", global.passuser);
comm.Parameters.Add("fname", OracleDbType.Varchar2).Direction = ParameterDirection.Output;

comm.ExecuteNonQuery();

textBox2.Text = comm.Parameters["fname"].ToString();

程序:

create or replace procedure  GetFirstName
(ssnid in VARCHAR2 ,  fname out VARCHAR2)
as
begin
select firstname
into fname
from passenger
where ssn = ssnid ;
end;

【问题讨论】:

  • 您遇到了 oracle 错误。通常这是由于 oracle 驱动程序不适用于您正在使用的 oracle 版本。您在连接字符串中使用什么驱动程序?您使用的数据库是什么版本的 Oracle?查看 oracle 数据库日志文件了解更多信息。
  • 顺便说一句,你应该用using块来处理你所有的SQL对象,不要缓存连接,当你需要时从连接字符串中创建它

标签: c# database stored-procedures oracle11g


【解决方案1】:

尝试使用这种语法

cmd.Parameters.Add("ssnid",OracleDbType.Varchar2).Value = global.passuser;
 // or global.passuser.ToString();

顺便解决一下这个问题

textBox2.Text = comm.Parameters["fname"].Value.ToString();

【讨论】:

    【解决方案2】:

    程序

    CREATE OR REPLACE PROCEDURE GETFIRSTNAME(ssnid VARCHAR2 ,  fname OUT VARCHAR2)
    
    AS  
    BEGIN
    
       SELECT 
       firstname INTO  fname
       FROM (SELECT 1 as ssn,'IM TOM CHANNEL' as firstname FROM dual)
       WHERE ssn = ssnid;
    
    END GETFIRSTNAME;
    ```SQL
    
    C# code is :
    
    ```C#
    public void GETFIRSTNAME(string ssnid)
            {
    
                try
                {
                    string vfname = "";
                    ConnDB();
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = con;
                    cmd.CommandText = "GETFIRSTNAME";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("ssnid", OracleType.VarChar).Value = ssnid;
                    cmd.Parameters.Add("fname", OracleType.VarChar,200).Direction = ParameterDirection.Output;
                    cmd.ExecuteNonQuery();
                    vfname = cmd.Parameters["fname"].Value.ToString();
                   
                }
                finally
                {
                    con.Dispose();
                    con.Close();
                }
    
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2014-06-18
      • 1970-01-01
      相关资源
      最近更新 更多