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

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

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 = ;
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[].Direction = ParameterDirection.Input;
parameters[].Direction = ParameterDirection.Input; for ( int i = ; i < valueCount ; i++ )
{
columnStr[i] = "No:" + ( i + valueStart ).ToString();
columnValue[i] = i + valueStart + ;
} parameters[].Value = columnStr;
parameters[].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 = ;
try
{
Open();
OracleCommand cmd = new OracleCommand()
{
Connection = Conn,
ArrayBindCount=paraCount,
CommandText=sqlStr,
CommandTimeout=
};
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 = ;
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[].Direction = ParameterDirection.Input;
parameters[].Direction = ParameterDirection.Input; for ( int i = ; i < valueCount ; i++ )
{
columnStr[i] = "No:" + ( i + valueStart ).ToString();
columnValue[i] = i + valueStart + ;
}
parameters[].Value = columnValue;
parameters[].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语句中

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

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

 

C# Oracle.ManagedDataAccess 批量更新表数据的更多相关文章

  1. MYSQL 使用存储过程批量更新表数据

    功能:实现将表result_good_city_dzl中的字段lat更新为表 result_good_city_lh中的lat,条件是两个表中的id一样 即: update result_good_c ...

  2. MySQL中使用replace into语句批量更新表数据

    作为示例,我们在这里使用名为testdb的数据库,并且在其中创建两张一模一样的表: drop table if exists test_table_1; create table test_table ...

  3. Oracle生成批量清空表数据脚本

    select 'DELETE FROM ' || a.table_name || '; --' || a.comments from user_tab_comments a where a.table ...

  4. oracle 批量更新表字段

      (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...

  5. 使用SQL语句的子查询批量复制表数据

    批量复制表数据这里有两种方法,下面分别来介绍这两种方法: 一.手动创建新表,然后复制数据 如果是要复制整个表的话,可以使用SQL SERVER自动生成CREATE脚本: 然后在脚本中改改表名就可以了, ...

  6. 在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)

    原文:在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所 ...

  7. oracle 批量删除表数据的4种方式

      1.情景展示 情景一: 删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据 情景二: 删除VIRTUAL_CARD_TEST表中的脏数据 2.解决方案 情景一的解决方案 ...

  8. oracle中字符串与表数据拼接的用法--“||”

    测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...

  9. Oracle通过Navicat导入表数据与机构,数据无法直接查询,需要加双引号的问题

    使用navicat 导入表到ORACLE时,总是会遇到虽然表格完整导入到数据库,但是往往查不出来数据,网上提供的解决办法是把查询的列 加上 双引号,或者表名加上双引号,但这解决办法却减慢了编写sql ...

随机推荐

  1. Codeforces Beta Round #2 C. Commentator problem 模拟退火

    C. Commentator problem 题目连接: http://www.codeforces.com/contest/2/problem/C Description The Olympic G ...

  2. Educational Codeforces Round 9 C. The Smallest String Concatenation 排序

    C. The Smallest String Concatenation 题目连接: http://www.codeforces.com/contest/632/problem/C Descripti ...

  3. leetcode 576. Out of Boundary Paths

    leetcode 576 题意大概就是在一个m*n的网格中,在坐标为[i,j]的网格上放一个物体,在规定时间N(t<=N)中,有多少种方法把物体移动出去.物体只能上下左右移动,一次移动一格,移动 ...

  4. mysql交叉表查询解决方案整理

    交叉表是一种常用的分类汇总查询.使用交叉表查询,可以显示表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部.行和列的交叉处可以对数据进行多种汇总计算,如:求和.平均值 ...

  5. 深入解析SQL Server并行执行原理及实践

    http://dbaplus.cn/news-21-431-1.html

  6. [转载]android工程中引入另一个工程中的资源

    原文地址:android工程中引入另一个工程中的资源作者:87fayuan 在项目中可能遇到这样的问题:项目过大,于是细分为N个子模块来做,每个模块都是不同的工程.涉及到activity传数据时,可以 ...

  7. java使用HttpClient 发送get、pot请求

    package eidolon.messageback.PostUtil; import java.io.BufferedReader; import java.io.IOException; imp ...

  8. cas服务器源码阅读笔记,对标博客

    对标源码阅读博客:http://www.cnblogs.com/jiuzhongguo/category/375405.html 在CAS中很多地方使用了策略模式,那么根据什么方式来确定使用哪种策略呢 ...

  9. Android内存优化1 了解java内存分配 1

    开篇废话 今天我们一起来学习JVM的内存分配,主要目的是为我们Android内存优化打下基础. 一直在想以什么样的方式来呈现这个知识点才能让我们易于理解,最终决定使用方法为:图解+源代码分析. 欢迎访 ...

  10. std::string 用法

    string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化 string类的字符操作:const ...