关于odp.net开发碰到的小问题

首先,关于odp.net,毕竟是Oracle公司开发的链接Oracle数据库的工具,所以网上盛传其访问Oracle的速度是最快的。。。没具体考察过,个人用了反正速度不慢

关于开放环境的配置,由于给导师做项目,服务器用的是windows2000 ,还好补丁打到了sp4。。。可以用布置.net2.0了,据说sp3以上才能装.net 2.0,3.0据说也是可以的,具体没尝试。。。装上.net 2.0 framwork,由于是2000 server版,iis是自带的,配置一下就能运行asp.net了。

Oracle 服务器上的版本是10.0 ,之前看Oracle官网上的介绍,下了一个odp.net 11g 

给个地址。。。好像要登陆一个账号,然后再同意一个协议才能下的。。。所以又些网站给的点进去是个error页面

http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html

,结果自己电脑上可以连Oracle ,在服务器上布置的时候就报了一个oracle.dataAccess.exception:  ,然后很可悲的发现冒号后面什么都没有 。。。。网上也查不到具体愿意,捣鼓了半天也没成功。。。最后看了几篇文章。。。介绍到了要装 oracle client 11g好吧。。。之前装了10g ,然后很兴奋的下载了,又装上了,好吧,错误信息一点没变。。。说明不是Client的问题。。。。。。最后找了一个odp.net 10g再装了clinet 10g就可以了(总之用10g就都是10g,用9i就都是9i)。。。终于跑起来了。。。。不容易啊。。。。当然要在项目中引用 Oracle.DataAcccess.dll。。。我用的是10.2.0.100反正是行了。。。那个2.1.xxxx和4.1.xxx是高版本的 反正我用了发现不行。。

插一句话。。。开发中发现.net 2.0 调ajax的jason 没有JavaScriptSerializer jss = new JavaScriptSerializer();方法滴。。。所以得用LitJson工具蛮好用的,网上有很多说明的。另外啃爹的vs2005 js调试我不会。。。如果出现js以前可以用的。。。突然连第一行加了 alert('aaa');都没反应了,那么 9成是因为你打js里存在着错误,可以利用注释一部分的方法来调。

关于C# 调用存储过程 其实和sql server 没什么区别。。。。但是调用方法就比较奇葩了。。。

网上看到的方法有很多。。。

webconfig里:

<connectionStrings>
    <add name="ConnectOracle" providerName="Oracle.DataAccess.Client" connectionString="Data Source=xx.xx.xx.xxx/orcl;Persist security info=false;User id=xxx;password=xxx"/>
</connectionStrings>

.cs文件里

public static int useprocnonquery(string sql, params OracleParameter[] cparams)
        {
            int state = 0;
            using (OracleConnection oracleCon = new OracleConnection(OracleConStr))//调用webconfig里的配置
            {
                oracleCon.Open();
                using (OracleCommand cmd = oracleCon.CreateCommand())
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = sql;
                    cmd.CommandTimeout = 600;//设置超时时间。。。如果有必要的话,这个是项目的特殊性
                    if (cparams != null)
                    {
                        foreach (OracleParameter spar in cparams)
                        {
                            cmd.Parameters.Add(spar);
                        }
                    }
                    state = cmd.ExecuteNonQuery();
                }
            }
            return state;
        }

然后我就开始尝试了。。。之前的procedure 都没问题。。。突然要执行一个function,然就有问题了。。。。

其实 有一个很厉害的方法可以用 ,sysdate就是一个function 所以嘛 可以这样:slelect functionname(:xxx,:xxx) from dual;

但是我还是想用标准化的东西。。。然后我就尝试了传入参数的方法

string sql=":li_retu= call ybfn_pers_levy_calc(:ls_ywlb,:ls_grbh,:ls_xgbz,:ld_sbgz,:ld_tcjj,:ld_zhjj,:ld_dbjj,:ld_bjjj,:li_bjbl,:as_err)";

网上看来的。。。发现报了神奇的 不知名的错误。。。好吧。。。

然后又找资料了。。。

string sql=" ybfn_pers_levy_calc";

直接这么写 然后给他传入 参数 new OracleParameter("ls_ywlb", OracleDbType.Varchar2, 2, ls_ywlb, ParameterDirection.Input)。。。。

把所有参数都传完了,注意:长度一定要匹配啊!!!!!因为在数据库里 传入的参数是没有长度的。。。

奇葩的事情发生了。。。首先,odp.net里。。。我用的这个版本里 OracleDbType里居然没有number啊!我瞬间就凌乱了。。。。反正如果有小数 就用float或者double

整数用int32,反正是可以的。。。

第二个奇葩点:参数类型是 out varchar2 你必须在 new OracleParameter 里给他一个长度。。。否者就报numeric or value error: character string buffer too small

这个一般是因为它只有10位的长度,而你给了个length>10的变量进去>_<

第三个 最奇葩的地方:就是 我return 的明明是个number 

然后我就很当然的 放了这样一个 parameter:

new OracleParameter(":li_retu", OracleDbType.Int32, 4, li_retu, ParameterDirection.ReturnValue)

结果它报了 numeric or value error: character to number conversion error

提一下这个错误,它要的是number类型。。。而你给它一个字符型。。。一般碰到这错误是因为oracle里拼接字符串用的是""||""而不是""+""貌似我以前用"xxx"+1时就会有这样的错误~

然后整了1个多小时。。。。

然后 最后发现 

GetConn.useprocnonquery(sql,
            new OracleParameter("li_retu", OracleDbType.Int16,10, li_retu, ParameterDirection.ReturnValue),
            new OracleParameter("ls_ywlb", OracleDbType.Varchar2, 2, ls_ywlb, ParameterDirection.Input),
            new OracleParameter("ls_grbh", OracleDbType.Varchar2, 8, ls_grbh, ParameterDirection.Input),
            new OracleParameter("ls_xgbz", OracleDbType.Varchar2, 2, ls_xgbz, ParameterDirection.Input),
            new OracleParameter("ld_sbgz", OracleDbType.Double, 4, ld_sbgz, ParameterDirection.Input),
            
            new OracleParameter("ld_tcjj", OracleDbType.Double, ld_tcjj, ParameterDirection.Output),
            new OracleParameter("ld_zhjj", OracleDbType.Double, ld_zhjj, ParameterDirection.Output),
            new OracleParameter("ld_dbjj", OracleDbType.Double, ld_dbjj, ParameterDirection.Output),
            new OracleParameter("ld_bjjj", OracleDbType.Double, ld_bjjj, ParameterDirection.Output),
            new OracleParameter("li_bjbl", OracleDbType.Double, li_bjbl, ParameterDirection.Output),
            new OracleParameter("as_err", OracleDbType.Varchar2, 20, as_err, ParameterDirection.Output)


            );

先returnValue必须要放在第一位,其他的要按照你存储过程里的顺序。。。之前试了 把returnValue 放中间。。。编译是没问题,但是值取不到。

最后发现用函数封装的方法 对付 out型变量不靠谱。。。因为 params 和 ref 不能同时使用 = =暂时没想到好方法。。。想到会来更新的


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值