C# Oracle.ManagedDataAccess 批量更新表數據


    這是我第一次發表博客。以前經常到博客園查找相關技術和代碼,今天在寫一段小程序時出現了問題,

但在網上沒能找到理想的解決方法。故注冊了博客園,想與新手分享(因為本人也不是什么高手)。

    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語句中

變量的順序呢。希望高手提示一下,多謝!

    希望能幫到遇到同樣問題的童鞋們。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM