C# Oracle OracleDataReader.Read()

Posted

技术标签:

【中文标题】C# Oracle OracleDataReader.Read()【英文标题】: 【发布时间】:2015-10-22 12:40:15 【问题描述】:

我的 Oracle 和 C# 遇到了一个小问题。当我运行这个查询时,它返回 0 行,所以 rd.Read() = false。但这很奇怪,因为数据库中有记录。在 SQL Developer 中运行完全相同的查询会返回 2 行。

我正在运行 Oracle XE 11.2

谁能解释一下为什么 dr.Read() 返回 false?

编辑:连接到数据库工作 100%。

    public List<ChatMessage> ReceiveMessage(string account_ID, string account_ID2)
    
        //Initialize list of strings for all the messages
        List<ChatMessage> list = new List<ChatMessage>();

        //Make connection
        OracleConnection con = new OracleConnection(connstring);
        con.Open();

        //Make query
        string query = "SELECT Sender_ID, Receiver_ID, Message, Msg_Date FROM TBL_CHAT WHERE Sender_ID = '1' AND Receiver_ID = '2' OR Sender_ID = '2' AND Receiver_ID = '1' ORDER BY Msg_Date DESC";

        //Add parameters
        OracleCommand cmd = new OracleCommand();
        //cmd.Parameters.Add("account_ID", account_ID);
        //cmd.Parameters.Add("account_ID2", account_ID2);

        cmd.Connection = con;
        cmd.CommandText = query;

        //Execute query and initialize reader
        OracleDataReader dr = cmd.ExecuteReader();

        //Start reading the messages and add them to a list
        while(dr.Read())
        
            string sender_ID = dr.GetString(0);
            string receiver_ID = dr.GetString(1);
            string message = dr.GetString(2);
            DateTime date = dr.GetDateTime(3);

            ChatMessage msg = new ChatMessage(message, sender_ID, receiver_ID, date);
            list.Add(msg);
        

        //Close database
        con.Close();

        return list;
    

【问题讨论】:

你有没有调试过你的代码并看到你的dr真的 2行? 未提交的事务? dr 返回 0 行。这就是问题所在。 @Guido 你确定你的.._ID 列是字符类型的吗?看起来他们应该是基于他们的名字的数字。 尝试从 SQL 中删除 WHERE 并查看表是否包含任何记录。如果是,请检查WHERE 【参考方案1】:

发现错误,

数据库的 CREATE 脚本中没有提交语句。 放入后就可以了。

【讨论】:

这很令人困惑,那么它是如何使用 sqldeveloper 工作的,您只能在给定会话中看到未提交的数据,否则对于所有其他会话,除非提交,否则它不存在 这是事务与数据库无关的行为,所以新学习:)

以上是关于C# Oracle OracleDataReader.Read()的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 Oracle 存储过程?

C#调用替换后Oracle包无效

将 Oracle 序列 Nextval 返回到 C# 变量中

从 C# 调用 oracle 函数

在c#中调用oracle存储过程

从c#调用oracle函数给出错误