并非所有数据都可以通过 Oracle.ManagedDataAccess 看到
Not all data is visible via Oracle.ManagedDataAccess
问题总结
我在通过 Oracle.ManagedDataAccess 使用 Oracle 数据库时遇到了奇怪的行为:应用程序的数据访问组件只能看到从该应用程序添加的 table 数据。
重现步骤
甲骨文table:
CREATE TABLE TEST_TABLE (
"TIMESTAMP" DATE DEFAULT SYSDATE NOT NULL
)
测试应用:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before run, count = {0}", GetCount());
InsertNew();
Console.WriteLine("After app insert, count = {0}", GetCount());
Console.WriteLine("Insert row via SQL developer and press enter");
Console.Read();
Console.WriteLine("After SQL developer insert, count = {0}", GetCount());
Console.Read();
}
private static void InsertNew()
{
using (var connection = OpenConnection())
{
var command = new OracleCommand("INSERT INTO TEST_TABLE(TIMESTAMP) VALUES(:Timestamp)", connection);
command.Parameters.Add(new OracleParameter("Timestamp", OracleDbType.Date)).Value = DateTime.Now;
command.ExecuteNonQuery();
}
}
private static int GetCount()
{
using (var connection = OpenConnection())
{
var command = new OracleCommand("SELECT COUNT(1) FROM TEST_TABLE", connection);
return (int)(decimal)command.ExecuteScalar();
}
}
private static OracleConnection OpenConnection()
{
var connectionString = ConfigurationManager.ConnectionStrings["db"].ConnectionString;
var connection = new OracleConnection(connectionString);
connection.Open();
return connection;
}
}
当应用程序提示通过 SQL 开发人员插入行时,我 运行
INSERT INTO TEST_TABLE(TIMESTAMP) VALUES(SYSDATE);
连接字符串如下所示:
Data Source=DATA_SOURCE_NAME;User Id=USER_ID;Password=PASS;
甲骨文版本:10g (10.2.0.5.0)
Oracle.ManagedDataAccess版本:4.121.2.0
结果
首先 运行 我得到结果:
Before run, count = 0
After app insert, count = 1
Insert row via SQL developer and press enter
After SQL developer insert, count = 1
第二个 运行 我得到结果:
Before run, count = 1
After app insert, count = 2
Insert row via SQL developer and press enter
After SQL developer insert, count = 2
因此该应用会看到它添加的数据,包括在之前 运行 中添加的数据,但看不到通过 SQL 开发人员
添加的数据
当通过 SQL 开发人员进行查询 运行 时,将返回所有数据
问题
所以问题是什么会导致这种行为?以及如何保证应用程序能够获取到所有的数据?
我找到了答案 - 执行插入后重现步骤缺少步骤 "Press [Commit] in SQL plus"。
问题总结
我在通过 Oracle.ManagedDataAccess 使用 Oracle 数据库时遇到了奇怪的行为:应用程序的数据访问组件只能看到从该应用程序添加的 table 数据。
重现步骤
甲骨文table:
CREATE TABLE TEST_TABLE (
"TIMESTAMP" DATE DEFAULT SYSDATE NOT NULL
)
测试应用:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before run, count = {0}", GetCount());
InsertNew();
Console.WriteLine("After app insert, count = {0}", GetCount());
Console.WriteLine("Insert row via SQL developer and press enter");
Console.Read();
Console.WriteLine("After SQL developer insert, count = {0}", GetCount());
Console.Read();
}
private static void InsertNew()
{
using (var connection = OpenConnection())
{
var command = new OracleCommand("INSERT INTO TEST_TABLE(TIMESTAMP) VALUES(:Timestamp)", connection);
command.Parameters.Add(new OracleParameter("Timestamp", OracleDbType.Date)).Value = DateTime.Now;
command.ExecuteNonQuery();
}
}
private static int GetCount()
{
using (var connection = OpenConnection())
{
var command = new OracleCommand("SELECT COUNT(1) FROM TEST_TABLE", connection);
return (int)(decimal)command.ExecuteScalar();
}
}
private static OracleConnection OpenConnection()
{
var connectionString = ConfigurationManager.ConnectionStrings["db"].ConnectionString;
var connection = new OracleConnection(connectionString);
connection.Open();
return connection;
}
}
当应用程序提示通过 SQL 开发人员插入行时,我 运行
INSERT INTO TEST_TABLE(TIMESTAMP) VALUES(SYSDATE);
连接字符串如下所示:
Data Source=DATA_SOURCE_NAME;User Id=USER_ID;Password=PASS;
甲骨文版本:10g (10.2.0.5.0) Oracle.ManagedDataAccess版本:4.121.2.0
结果
首先 运行 我得到结果:
Before run, count = 0
After app insert, count = 1
Insert row via SQL developer and press enter
After SQL developer insert, count = 1
第二个 运行 我得到结果:
Before run, count = 1
After app insert, count = 2
Insert row via SQL developer and press enter
After SQL developer insert, count = 2
因此该应用会看到它添加的数据,包括在之前 运行 中添加的数据,但看不到通过 SQL 开发人员
添加的数据当通过 SQL 开发人员进行查询 运行 时,将返回所有数据
问题
所以问题是什么会导致这种行为?以及如何保证应用程序能够获取到所有的数据?
我找到了答案 - 执行插入后重现步骤缺少步骤 "Press [Commit] in SQL plus"。