[.NET] Oracle Client Exception – ORA-01722

來源:互聯網
上載者:User

最近的項目使用Oracle DB。在.NET裡可以使用Oracle Client,來對Oracle DB下SQL指令。寫了下面的程式碼,用來取得User資料表裡的User資料。

 

using (OracleConnection connection = new OracleConnection(connectionString)){    connection.Open();    using (OracleCommand command = new OracleCommand())    {        command.Connection = connection;        command.Parameters.Add(":lastName", "Chou");        command.Parameters.Add(":firstName", "Clark");        command.CommandText = @"SELECT * FROM USER_DATA WHERE FIRST_NAME=:firstName AND LAST_NAME=:lastName";        using (OracleDataReader reader = command.ExecuteReader())        {            while (reader.Read())            {                // XXXXXXX            }            connection.Close();        }    }}

 

快速打完、按下執行。卻產生了讓人摸不清頭緒的錯誤例外「ORA-01722:無效的數字」。

 

 

搞了半天才發現使用OracleCommand.Parameters來加參數是有順序性的。在OracleCommand.CommandText裡參數出現的順序,必須要和OracleCommand.Parameters是一致的。也就是下列的程式碼才能正常執行:

 

using (OracleConnection connection = new OracleConnection(connectionString)){    connection.Open();    using (OracleCommand command = new OracleCommand())    {        command.Connection = connection;        command.Parameters.Add(":firstName", "Clark");        command.Parameters.Add(":lastName", "Chou");                command.CommandText = @"SELECT * FROM USER_DATA WHERE FIRST_NAME=:firstName AND LAST_NAME=:lastName";        using (OracleDataReader reader = command.ExecuteReader())        {            while (reader.Read())            {                // XXXXXXX            }            connection.Close();        }    }}

 

在網路上與朋友討論這個問題與解法。經由Demo的提點,才知道原來只要將OracleCommand.BindByName設定為True就可以解決這個問題。範常式序如下:

 

using (OracleConnection connection = new OracleConnection(connectionString)){    connection.Open();    using (OracleCommand command = new OracleCommand())    {        command.BindByName = true;        command.Connection = connection;        command.Parameters.Add(":lastName", "Chou");        command.Parameters.Add(":firstName", "Clark");        command.CommandText = @"SELECT * FROM USER_DATA WHERE FIRST_NAME=:firstName AND LAST_NAME=:lastName";        using (OracleDataReader reader = command.ExecuteReader())        {            while (reader.Read())            {                // XXXXXXX            }            connection.Close();        }    }}

 

趁還有印象快速紀錄一篇下來,為自己做個紀錄,也希望能協助到有需要的開發人員。 當然也要再次感謝Demo大大。:D

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.