我使用带有oracle ODP.NET的C#查询表,如果字段值的符号为"%"它似乎有一种奇怪的行为。如下例所示:
在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;
}
}
}
它将在数据网格中仅弹出5行。但是如果直接使用SQL Developer并使用相同的查询,它将返回所有行。我已经尝试过托管和非托管的odp.net。在oracle提供者中似乎是一个糟糕的解释。
如果您使用System.Data.OleDb,则不会出现此问题,但在处理Clob类型时我无法使用它。
有人知道这个问题的解决方案吗?
Thansk all!
答案 0 :(得分:1)
从代码中删除dr.Read()解决了问题!
感谢@tbone的帮助。