C# Oracle ODP.NET是否存在处理查询中百分比符号的错误?

C# Oracle ODP.NET是否存在处理查询中百分比符号的错误?,c#,oracle,odp.net,C#,Oracle,Odp.net,我使用C#with OracleODP.NET查询一个表,如果字段值有符号“%”,它似乎有一种奇怪的行为。例如: 在Oracle(11g或12c)中,我运行以下命令创建一个测试表,插入带有符号% CREATE TABLE "TESTCHAR" ("NAME" VARCHAR2(255 BYTE) NOT NULL ENABLE, "RESULT" VARCHAR2(4000 BYTE)); COMMIT; INSERT INTO TESTCHAR (NAME, RESULT) VALUES (

我使用C#with OracleODP.NET查询一个表,如果字段值有符号“%”,它似乎有一种奇怪的行为。例如:

在Oracle(11g或12c)中,我运行以下命令创建一个测试表,插入带有符号%

CREATE TABLE "TESTCHAR" ("NAME" VARCHAR2(255 BYTE) NOT NULL ENABLE, "RESULT" VARCHAR2(4000 BYTE));
COMMIT;

INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 1 % Area','10');
INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 2 % Area','10');
INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 3 % Area','10');
INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 4 % Area','10');
INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 5 % Area','10');
INSERT INTO TESTCHAR (NAME, RESULT) VALUES ('Test 6 % Area','10');
COMMIT;
现在,在Visual Studio中的一个简单windows窗体应用程序中(使用2012和2015),我只创建了以下应用程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OracleConnection conn = new OracleConnection("User Id=myUser;Password=myPass;Data Source=myData");
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.CommandText = "select * from testchar";
            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
            dr.Read();
            DataTable dt = new DataTable();
            dt.Load(dr);
            dataGridView1.DataSource = dt;
        }
    }
}
它将在datagrid中只弹出5行。但是,如果直接转到SQLDeveloper并使用相同的查询,它将返回所有行。我已经尝试过托管odp.net和非托管odp.net。在oracle提供程序中,这似乎是一个错误的解释

如果使用System.Data.OleDb,则不会出现此问题,但在处理Clob类型时,我无法使用它

有人知道这个问题的解决办法吗

坦斯克

从代码中删除dr.Read()解决了问题


感谢@tbone的帮助。

删除该行:dr.Read();发生了什么?您好@tbone,做了一个快速测试,似乎删除dr.Read()可以解决问题。我将在下周测试整个代码,并让您知道结果!!!嘿@tbone,你的评论解决了这个问题。如果没有Read博士的帮助,一切正常!非常感谢您的帮助。没问题,Read()方法将使读取器前进到下一条记录,这就是为什么您只得到6行中的5行。