将oracle存储过程写成服务所遇到的问题和所要注意的细节

1.ORA-00911错误

当在写完测试程序时,执行下面代码出现了 'ORA-00911:无效字符' 错误提示

  1. //将临时表中已经运行的参数挂起   
  2.             string SProcString = "UPDATE T_DS_STAGEPROC SET ISSUCCEED=1 WHERE STU_ICCARD='" + StuICCard + "' AND sinfo_code='" + SinfoCode + "' AND starttime=TO_DATE('" + StartTime.ToString()+"','YYYY-MM-DD HH24:MI:SS');";  
  3.             ExecuteData(SProcString);  

 

刚开始我测试的时候取出 SProcString 变量的值放到新建的SQL里面进行测试,数据完全没有问题,当时就纳闷了。经过检查后面才发现是后面多加了个";",去掉以后程序就能够运行了。

 

2.ORA-06550错误

在c#代码中调用oracle的存储过程时出现的,问题到现在没有解决,希望知道的朋友能够告知一下:

c#代码:

            using (OracleConnection OraCon = new OracleConnection(ConString))
            {
                OraCon.Open();
                using (OracleCommand OraCom = new OracleCommand("Proc_Relese", OraCon))
                {
                    OraCom.CommandType = CommandType.StoredProcedure;
                    OraCom.Parameters.Add("S_STUS_STUIDNO", OracleType.VarChar, 40).Value = StuICCard;
                    OraCom.Parameters.Add("ZXS_NOW_STUT_TOTATIME", OracleType.Int32).Value = NowStuTime;
                    OraCom.Parameters.Add("S_BALANCE", OracleType.Number);

                    OraCom.Parameters["S_STUS_STUIDNO"].Direction = ParameterDirection.Input;                                      
                    OraCom.Parameters["ZXS_NOW_STUT_TOTATIME"].Direction = ParameterDirection.Input;
                    OraCom.Parameters["S_BALANCE"].Direction = ParameterDirection.Output;                   
                    OraCom.ExecuteNonQuery();                   

                    Double S_Balance = int.Parse(OraCom.Parameters["S_Balance"].Value.ToString());
                }
            }

 oracle 存储过程的代码为:

create or replace procedure Proc_Relese(s_stuiccard in varchar2, --学员IC卡号
                                        s_minute    in integer, --上车分钟
                                        s_balance   out NUMBER --扣除的金额
                                        ) is
  --价格模式
  s_price_mode  integer;
  s_STU_BALANCE NUMBER(18, 2);
  s_STU_PRICE   NUMBER(10, 2);
  s_ST_PRICE    NUMBER(10, 2);
  s_count       INTEGER;
  s_ds_id       INTEGER;
  s_st_id       INTEGER;
begin
 ...(省略N行)
 end;

执行c#代码的时候出现"ORA-06550: 第 1 行, 第 7 列:",确定数据和个数都没有什么问题就是不知道为什么会出现,请哪位知道的给我留言。

 

3.循环结束

当写到for循环,满足条件跳出此次循环的时候使用reture,跳出了整个程序,介绍下commint、break和reture的区别

break语句:
break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句。由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的。

 

如果一个循环的终止条件非常复杂,那么使用break语句来实现某些条件比用一个循环表达式来表达所有的条件容易得多。

for(var i=1;i<=10;i++)

{
  
if(i==6)break;
   document.write(i);
 }
//输出结果:12345

continue语句:
continue语句和break语句相似。所不同的是,它不是退出一个循环,而是开始循环的一次新迭代。
continue语句只能用在while语句、
do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误!

for(var i=1;i<=10;i++)

{
  if(i==6)continue;
  document.write(i);
}
//输出结果:1234578910

 

return语句:
return语句就是用于指定函数返回的值。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!
当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止!

 

 4.数据库出现ORA-12541错误

在开发时,我测试的没有问题,但是提交给测试时打开出现 ORA-12541错误,并强制关闭程序。在检测代码没问题之后,发现是cs程序中web.config的配置出问题,测试没有配置开发数据库,一直使用的是测试数据库,将web.config中的数据库地址改为测试库地址,运行OK。

注意:在开发的时候要学会如何使用try  catch ,有时候在开发环境中运行正常,但是一到测试环境就无法确定是哪里出现问题导致错误。

 

5.ORA-00923 FROM关键字无法找到

刚开始以为该错误是由

string SageInfoString = "SELECT SINFO_ID FROM T_DS_STAGEINFO WHERE ST_ID = " + st_id + " AND SINFO_CODE =" + SinfoCode;

中string类型参数SinfoCode没有加 ' ' 造成的,通过数据操作里面加 try catch 才发现是由于 代码:

string StageStr = "SELECT SUM(STUS_TOTALMINUTE)  AS " 总时间" FROM T_DS_STAGEREC WHERE TO_CHAR(STUS_STARTTIME,'YYYY-MM-DD')=SUBSTR('" + StartTime + "',1,10) AND STU_IDCARD='" + stu_idcard+"'";
                        DataTable StageRecDS = DtInfo(StageStr);
                        S_TodayStuTime = int.Parse(StageRecDS.Rows[0]["总时间"].ToString());

其中不能使用“AS 总时间”,删除,将代码改为:

S_TodayStuTime = int.Parse(StageRecDS.Rows[0]["SUM(STUS_TOTALMINUTE)"].ToString());

后运行OK。

 

6.在存储过程变量和数据列名不能一致

在编写存储过程时不能将变量名和数据表的列名一样,这样会导致数据错乱。

SELECT COUNT(*)
    INTO EXAMCOUNT
    FROM t_ds_graduateproc
   WHERE STU_ICCARD = ICCARD
     AND STARTTIME = TO_DATE(T_BeginTime, 'YYYY-MM-DD HH24:MI:SS')
     AND ExamID= ExamID
     AND ISSUCCEED=0;

上面的语句会导致每次取值是后面的变量EXAMID会被系统认为是数据列EXAMID,造成程序错误。

7.在进行线程操作是要在窗口的FormClosing添加

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            System.Environment.Exit(System.Environment.ExitCode);
            Application.ExitThread();
            Application.Exit();
        }

Application.Exit(); 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口
Application.ExitThread ();方法退出当前线程上的消息循环,并关闭该线程上的所有窗口。

有的时候Application.Exit 并不能关闭所有的线程, 就自己退出主窗口了。
所以最好在退出前先运行一下Application.ExitThread

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值