从 C# 应用程序执行时,Oracle SQL 语句 returns 没有行
Oracle SQL statement returns no rows when executed from C# application
以下 SQL 语句 returns 在 Oracle 中执行时的数据 SQL 开发人员:
SELECT TC_GUID FROM TBLBUF WHERE TC_DEST = 'aaaaaaa' AND TC_STATE <= 20
但是当它在下面的 C# 代码中执行时,reader returns 没有行。
using Oracle.ManagedDataAccess.Client;
using System;
using System.Data;
using System.Data.Common;
using System.Threading;
using System.Threading.Tasks;
namespace OracleQuery
{
public class Program
{
public static DbDataReader QueryReader()
{
OracleConnection connection = new OracleConnection(".........");
connection.Open();
using (OracleCommand command = connection.CreateCommand())
{
command.InitialLOBFetchSize = -1;
command.InitialLONGFetchSize = -1;
((IDbCommand)command).Transaction = null;
command.CommandText = "SELECT TC_GUID FROM TBLBUF WHERE TC_DEST = 'aaaaaaa' AND TC_STATE <= 20";
command.CommandType = CommandType.Text;
return command.ExecuteReader(CommandBehavior.Default | CommandBehavior.CloseConnection);
}
}
public static void Main(string[] args)
{
DbDataReader reader = QueryReader();
while (reader.Read())
{
string s = (string)reader["TC_GUID"];
Console.WriteLine(s);
}
}
}
}
当我只留下 WHERE 子句的一部分时,TC_DEST = 'aaaaaaa'
或 TC_STATE <= 20
,它 returns 行。
造成这种行为的原因是什么?
What could be a reason for such behaviour?
已 INSERT
ed 但未 COMMIT
ed 的行仅在创建它们的会话中可见。因此,如果您创建了一些新行但没有在 SQL 开发人员会话中发出 COMMIT
命令,您将无法从任何其他会话中看到未提交的数据(即使您连接为相同的用户,因为它将创建不同的会话)。
如果是这种情况,解决方案是 COMMIT
SQL 开发人员会话中的数据,然后其他会话就可以看到这些数据。
以下 SQL 语句 returns 在 Oracle 中执行时的数据 SQL 开发人员:
SELECT TC_GUID FROM TBLBUF WHERE TC_DEST = 'aaaaaaa' AND TC_STATE <= 20
但是当它在下面的 C# 代码中执行时,reader returns 没有行。
using Oracle.ManagedDataAccess.Client;
using System;
using System.Data;
using System.Data.Common;
using System.Threading;
using System.Threading.Tasks;
namespace OracleQuery
{
public class Program
{
public static DbDataReader QueryReader()
{
OracleConnection connection = new OracleConnection(".........");
connection.Open();
using (OracleCommand command = connection.CreateCommand())
{
command.InitialLOBFetchSize = -1;
command.InitialLONGFetchSize = -1;
((IDbCommand)command).Transaction = null;
command.CommandText = "SELECT TC_GUID FROM TBLBUF WHERE TC_DEST = 'aaaaaaa' AND TC_STATE <= 20";
command.CommandType = CommandType.Text;
return command.ExecuteReader(CommandBehavior.Default | CommandBehavior.CloseConnection);
}
}
public static void Main(string[] args)
{
DbDataReader reader = QueryReader();
while (reader.Read())
{
string s = (string)reader["TC_GUID"];
Console.WriteLine(s);
}
}
}
}
当我只留下 WHERE 子句的一部分时,TC_DEST = 'aaaaaaa'
或 TC_STATE <= 20
,它 returns 行。
造成这种行为的原因是什么?
What could be a reason for such behaviour?
已 INSERT
ed 但未 COMMIT
ed 的行仅在创建它们的会话中可见。因此,如果您创建了一些新行但没有在 SQL 开发人员会话中发出 COMMIT
命令,您将无法从任何其他会话中看到未提交的数据(即使您连接为相同的用户,因为它将创建不同的会话)。
如果是这种情况,解决方案是 COMMIT
SQL 开发人员会话中的数据,然后其他会话就可以看到这些数据。