2013-05-06 5 views
1

Я искал часы сейчас. Я не могу найти ничего полезного для моей проблемы. Функция Read() всегда возвращает false. При запуске SQL-команды с SQLPLUS я получаю этот результат:DataReader.Read() всегда возвращает false

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(); 
} 

EDIT:

Этот код называется раньше. и она отлично работает:

IDC_PERSON p = new IDC_PERSON(); 
using (OracleConnection connection = new OracleConnection(connectionString)) 
    { 
     OracleCommand cmd = new OracleCommand("select PERS_VNAME, PERS_NNAME, PERS_EINTRDATUM from idc_person where PERS_ID = 4711"); 
     cmd.Connection = connection; 

     connection.Open(); 
     OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
     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(); 
    } 

Итак, вот весь код:

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); 
     } 
    } 
} 
+0

Удалить дублированный 'reader.Read();' внутри цикла. – leonbloy

+0

@leonbloy Правда, но не решает его проблемы. Вы пытались упростить запрос во что-то очень простое, просто чтобы проверить код? – SimpleVar

+0

О, спасибо, я этого не видел. Но это не проблема. – Armin

ответ

0

Это не может быть ответом на ваш случай, но я столкнулся с подобным вопросом при отладке кода и может помогите другим, кто сталкивается с этим вопросом.

Решение, которое я выяснил, на самом деле было специфичным только при отладке. При переходе по коду, если вы развернете «Просмотр результатов» (который перечисляет перечисляемый), когда вы дойдете до части вашего кода, который читает устройство чтения данных, читатель уже будет в конце результатов и вернется ложный. Это связано с тем, что считыватели данных только вперед, и как только вы перечислили следующий результат (который был сделан отладчиком в этом случае), вы не можете вернуться.

+0

Согласился, это также случилось со мной однажды, и это меня повредило ... –

0

же проблема, с которой сталкиваются меня это, как я установил

использовать тип из

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; 
     } 

    } 
Смежные вопросы