如何检查查询是否得到结果

时间:2013-06-10 19:31:22

标签: c# database oracle

我正在尝试使用简单的“选择”查询从数据库中获取一些数据,但我没有收到任何数据。当我在Toad编辑器中为oracle运行相同的查询时,我得到的数据就好了。

在C#中

OdbcDataReader reader = cmd.ExecuteReader(); //cmd contains the query
DataTable dtHRSinfo = new DataTable();

while (reader.Read()) // no lines to read
{
    dtHRSinfo.Rows.Add(reader); // never comes to this statement!
}

编辑: 我也有这个替代方法,适用于我的其他查询,但不适用于此。此方法也不会为数据表提供任何值。

dtHRSinfo.Load(cmd.ExecuteReader());

查询

select unitid,lasttimeon,lasttimeoff,currentlyon,currentcallontime, currentcallofftime

from opr.mktunit 

我没有任何错误或例外。 db reader永远不会获取值,它们永远不会分配给数据表。我不知道我做错了什么。

数据库连接

public bool OpenDBConnections(string user, string pass)
    {
        try
        {
            this.Log("Connection to Database");
            cnOprPrd = new OdbcConnection();
            cnOprPrd.ConnectionString = @"Driver={Microsoft ODBC for Oracle};Server=OPRPRD;Uid=" + user + ";Pwd=" + pass;
            cnOprPrd.Open();
            //INPUT FOLDER
            sqlFolder = AC2_SQL_FOLDER;

            return true;
        }
        catch (Exception e)
        {
            Log(e.Message);
            return false;
        }
    }

更新:

我通过将命令显式键入字符串变量而不是使用Streamreader从文件中读取字符串来解决问题。

问题可能源于来自流读取器的一些无法识别的字符序列。谢谢你的回答,伙计。

3 个答案:

答案 0 :(得分:1)

这可能是你的连接字符串。调试cmd对象或向我们显示设置连接字符串的代码。我们还需要讨论Disposing非托管资源类...使用using语法确保正确清理您的连接:

using (OdbcDataReader reader = cmd.ExecuteReader())  //cmd contains the query
{
    DataTable dtHRSinfo = new DataTable();

    while (reader.Read()) // no lines to read
    {
        dtHRSinfo.Rows.Add(reader); // never comes to this statement!
    }
}

<强> More about the using statement here

答案 1 :(得分:1)

这个区块:

while (reader.Read()) // no lines to read
{
    dtHRSinfo.Rows.Add(reader); // never comes to this statement!
}
看起来很奇怪。我从来没有见过一种扩展方法,可以直接从数据读取器一次一行地向一行数据表添加行。

我希望看到使用Load方法:

OdbcDataReader reader = cmd.ExecuteReader(); //cmd contains the query
DataTable dtHRSinfo = new DataTable();

dtHRSinfo.Load(reader); 

我的猜测是,它使用了Add的重载,它隐含地将reader.ToString()的值添加到第一列。

答案 2 :(得分:1)

来自我的建议,如果你可以连接到你的数据库这应该很简单试试这个

DataSet ds = new DataSet();
OracleConnection connection;
OracleDataAdapter OracleAdapter;
connection = new OracleConnection(ConfigurationManager.AppSettings["ConnectionString"]);
        connection.Open();
        OracleAdapter = new OracleDataAdapter(ConfigurationManager.AppSettings["your select statement"], ConfigurationManager.AppSettings["ConnectionString"]);
        OracleAdapter.Fill(ds, "your table name");

使用fill方法将数据库表中的所有数据填充到您的数据集中。

使用configurationManager.Appsetting refrence to

using System.Configuration;

添加配置文件并外部化您的选择查询使用

中的键值标签
<appSettings>
<addKey="your select statement" value 
"select unitid,lasttimeon,lasttimeoff,currentlyon,currentcallontime, currentcallofftime
from opr.mktunit"/>

看看这是否适合你让我知道。干杯