C# DataReader.Read()始终返回false
我已经找了好几个小时了。我找不到任何对我的问题有帮助的东西。 Read函数总是返回false。如果使用sqlplus运行SQL命令,则会得到以下结果:C# DataReader.Read()始终返回false,c#,asp.net,asp.net-mvc-3,oracle,datareader,C#,Asp.net,Asp.net Mvc 3,Oracle,Datareader,我已经找了好几个小时了。我找不到任何对我的问题有帮助的东西。 Read函数总是返回false。如果使用sqlplus运行SQL命令,则会得到以下结果: GERA_ID GETY_BEZEICHNUNG --------------------------- 100001 Blackberry 100002 GSM 下面是代码的简化版本: List<Divice> divices = new List<Divice>(); usi
GERA_ID GETY_BEZEICHNUNG
---------------------------
100001 Blackberry
100002 GSM
下面是代码的简化版本:
List<Divice> divices = new List<Divice>();
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("select gera_id, gety_bezeichnung from idc_geraet, idc_geraettyp where idc_geraettyp.gety_id = idc_geraet.gety_id and pers_id = 4711");
cmd.Connection = connection;
connection.Open();
OracleDataReader reader = cmd.ExecuteReader();
while(reader.Read()) //returns always false
{
Divice g = new Divice();
g.gera_id = reader.GetDecimal(0);
g.gety_bezeichnung = reader.GetString(1);
divices.Add(g);
}
reader.Close();
}
下面是全部代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Oracle.DataAccess.Client;
using TelKoOpt.Models;
using System.Data;
namespace TelKoOpt.Controllers
{
public class HomeController : Controller
{
string connectionString = "user id=scott;password=tiger;" +
"data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)" +
"(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))";
public ActionResult Index(int user_id)
{
MyDbContext dbcontext = new MyDbContext();
IDC_PERSON p = new IDC_PERSON();
List<IDC_GERAET> geraete = new List<IDC_GERAET>();
List<TELGSMEGN> telgsmegn = new List<TELGSMEGN>();
dbcontext.pers = p;
dbcontext.geraete = geraete;
dbcontext.telgsmegn = telgsmegn;
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("select PERS_VNAME, PERS_NNAME, PERS_EINTRDATUM from idc_person where PERS_ID = " + user_id);
//OracleCommand cmdTelg = new OracleCommand("select service, sum(betrag), sum(dauer), sum(anzahl), zonen from test_telgsmegn where gera_id = " + user_id + " and datumaktion between '" + "01.02.2012" + "' and '" + "20.03.2012" + "' group by service, zonen; ");
cmd.Connection = connection;
//cmdTelg.Connection = new OracleConnection(connectionString);
try
{
connection.Open();
OracleDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
p.PERS_ID = user_id;
p.PERS_VNAME = reader.GetString(0);
p.PERS_NNAME = reader.GetString(1);
p.PERS_EINTRDATUM = reader.GetDateTime(2);
}
reader.Close();
}
catch (OracleException)
{
//return View(dbcontext);
}
}
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("select gera_id, gety_bezeichnung from idc_geraet, idc_geraettyp where idc_geraettyp.gety_id = idc_geraet.gety_id and pers_id = " + user_id);
cmd.Connection = connection;
try
{
connection.Open();
OracleDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
IDC_GERAET g = new IDC_GERAET();
g.gera_id = reader.GetDecimal(0);
g.gety_bezeichnung = reader.GetString(1);
geraete.Add(g);
}
reader.Close();
}
catch (OracleException)
{
//return View(dbcontext);
}
}
return View(dbcontext);
}
}
}
这可能不是您案例的答案,但我在调试代码时遇到了类似的问题,这可能会帮助其他遇到此问题的人
我想出的解决方案实际上只适用于调试时。在单步执行代码时,如果展开枚举可枚举项的“结果”视图,当到达代码中读取数据读取器的部分时,读取器将已经位于结果的末尾,并且将返回false。这是因为数据读取器是只向前的,一旦您枚举到调试器在本例中完成的下一个结果,您就不能返回了。我面临的相同问题这是我如何修复的 用完类型
public void ExecuteStoredProcReturnDataReader(string sQueryName, out IDataReader dr, List<DBParam> oParams =null)
{
try
{
dbHelper DBProvider = new dbHelper();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
oCmd = DBProvider.CreateCommand(sQueryName, conn);
if (oParams !=null)
DBProvider.CreateParameters(oParams, ref oCmd);
dr = oCmd.ExecuteReader();
}
catch (Exception e)
{
rethrow = DataAccessExceptionHandler.HandleException(ref e);
if (rethrow)
{
throw e;
}
dr = null;
}
}
移除复制的读卡器。读取;在循环内部。变得更简单。测试从idc\u Geret中选择*。尝试更改数据库而不是获取信息。也许问题不在于读者,而在于联系。执行插入。此外,这是否被称为与DB通信的第一件事?你忘了关闭连接,这也会把事情搞砸。如果你删除CommandBehavior.CloseConnection会怎么样?问题是我在更新idc_Geret表中的数据后忘记了提交
public void ExecuteStoredProcReturnDataReader(string sQueryName, out IDataReader dr, List<DBParam> oParams =null)
{
try
{
dbHelper DBProvider = new dbHelper();
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
oCmd = DBProvider.CreateCommand(sQueryName, conn);
if (oParams !=null)
DBProvider.CreateParameters(oParams, ref oCmd);
dr = oCmd.ExecuteReader();
}
catch (Exception e)
{
rethrow = DataAccessExceptionHandler.HandleException(ref e);
if (rethrow)
{
throw e;
}
dr = null;
}
}