0

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

在 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 从文件中读取字符串。

该问题可能是由流式阅读器中的一些无法识别的字符序列引起的。谢谢你们的回答,伙计们。

4

3 回答 3

1

这可能是您的连接字符串。调试 cmd 对象或向我们展示设置连接字符串的代码。我们还需要讨论处理非托管资源类...使用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!
    }
}

更多关于 using 声明here

于 2013-06-10T19:33:22.037 回答
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()到第一列。

于 2013-06-10T19:36:41.337 回答
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");

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

使用 configurationManager.Appsetting 参考

using System.Configuration;

添加配置文件并外部化您的选择查询,使用中的键值标签

<appSettings>
<addKey="your select statement" value 
"select unitid,lasttimeon,lasttimeoff,currentlyon,currentcallontime, currentcallofftime
from opr.mktunit"/>

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

于 2013-06-10T20:20:17.243 回答