我正在尝试使用简单的“选择”查询从数据库中获取一些数据,但我没有收到任何数据。当我在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从文件中读取字符串来解决问题。
问题可能源于来自流读取器的一些无法识别的字符序列。谢谢你的回答,伙计。
答案 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!
}
}
答案 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"/>
看看这是否适合你让我知道。干杯