当前位置: 移动技术网 > IT编程>开发语言>.net > C# Oracle.ManagedDataAccess 批量更新表数据

C# Oracle.ManagedDataAccess 批量更新表数据

2018年11月29日  | 移动技术网IT编程  | 我要评论

橘梨纱第六部下载,无限挑战110122,无良二少在洪荒

    这是我第一次发表博客。以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题,

但在网上没能找到理想的解决方法。故注册了博客园,想与新手分享(因为本人也不是什么高手)。

    vb.net和c#操作oracle数据库已经用了n多年了。由于是做工程自动化项目的,业主只对软件的功能和

界面是否友好来判定成果的好坏。所以一直都是采用直接oraclecommand.executenonquery(sqlstring,conn)

的方式很直白的insert、update和delete数据库表的。由于工程项目并没有很高的实时性,所以......

    最近手头没太多事情,就在博客园逛逛。看到了odp.net,发现了自己有点落伍了,于是照猫画虎的练练。

在insert时顺风顺水的,但update时出现了“ora-01722: 无效数字”。各种找问题,网上查资料无果。

测试表只有两个字段,varchar2和number。问题代码如下:

using oracle.manageddataaccess.client;

 

private void updatetable()
        {
            int valuestart = (int)nudstartvalue.value;
            int valuecount = (int)nudvaluecount.value;
            int returnvalue = 0;
            int[] columnvalue = new int[valuecount];
            string[] columnstr = new string[valuecount];
            string sql = string.empty;

            oracleparameter[] parameters = new oracleparameter[]
            {
                new oracleparameter(":sname", oracledbtype.varchar2),
                new oracleparameter(":svalue",oracledbtype.int32)
                
            };
            parameters[0].direction = parameterdirection.input;
            parameters[1].direction = parameterdirection.input;

            for ( int i = 0 ; i < valuecount ; i++ )
            {
                columnstr[i] = "no:" + ( i + valuestart ).tostring();
                columnvalue[i] = i + valuestart + 100;
            }
            
            parameters[0].value = columnstr;
            parameters[1].value = columnvalue;
            sql = "update dist_test set svalue=:svalue where sname=:sname";
            returnvalue = db.runupdatesql(sql, parameters, valuecount); 
messagebox.show(returnvalue.tostring());
}

 

        public int runupdatesql(string sqlstr,oracleparameter[] parameters,int paracount)
        {
            int returnvalue = 0;            
            try
            {
                open();
                oraclecommand cmd = new oraclecommand()
                {
                    connection = conn,
                    arraybindcount=paracount,
                    commandtext=sqlstr,
                    commandtimeout=240
                };                
                cmd.parameters.addrange(parameters);                
                returnvalue=cmd.executenonquery();                
                cmd.dispose();
            }
            catch(exception ex)
            {
                console.writeline(ex.tostring());                
            }
            return returnvalue;
        }

解决方法:将parameters的元素按sqlstr的顺序更改一下ok了。

 

private void updatetable()
        {
            int valuestart = (int)nudstartvalue.value;
            int valuecount = (int)nudvaluecount.value;
            int returnvalue = 0;
            int[] columnvalue = new int[valuecount];
            string[] columnstr = new string[valuecount];
            string sql = string.empty;

            oracleparameter[] parameters = new oracleparameter[]
            {                
                new oracleparameter(":svalue",oracledbtype.int32),
                new oracleparameter(":sname", oracledbtype.varchar2)

            };
            parameters[0].direction = parameterdirection.input;
            parameters[1].direction = parameterdirection.input;

            for ( int i = 0 ; i < valuecount ; i++ )
            {
                columnstr[i] = "no:" + ( i + valuestart ).tostring();
                columnvalue[i] = i + valuestart + 100;
            }
            parameters[0].value = columnvalue;
            parameters[1].value = columnstr;
            sql = "update dist_test set svalue=:svalue where sname=:sname";
            returnvalue = db.runupdatesql(sql, parameters, valuecount); 
messagebox.show(returnvalue.tostring());
}

    注意上面的代码,第一个出现的是:svalue,第二个出现的是:sname。oracleparameter[]按这个顺序添加就ok了。

其实现在问题是解决了,但还没能理解,:sname和:svalue是对应的parameter.value的,为何一定要按照update语句中

变量的顺序呢。希望高手提示一下,多谢!

    希望能帮到遇到同样问题的童鞋们。

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网