2016-06-20 20 views
1

Ich habe die Aufgabe, einige unserer C# -Code-Behind zu konvertieren, um mit Oracle anstelle von SQL Server zu arbeiten. Und meine Erfahrung mit Orakel ist ... ohhh ... 2 Tage.Richtige Verwendung von DataReader in Oracle?

So, hier ist was ich habe:

private void LoadPreferences() 
{ // inital load of users function and role based on last action performed in database 

    try 
    { 
     OracleConnection oConn = GetConnection(); 

     //string selectSQL = "select Function_ID,Role_ID from vw_mos_DPL_Last_Selection where Lan_ID = '" + strUserID + "'"; 
     //string selectSQL = "select Function_ID,Role_ID from vw_mos_DPL_Last_Selection where Lan_ID = @strUserID"; 
     //string selectSQL = "SELECT WORK_ID, ROLE_ID, ACTIVITY_ID, LAN_ID, CREATE_TS FROM THN_DPL_DETAIL WHERE Lan_ID = @strUserID ORDER BY CREATE_TS DESC"; 
     string selectSQL = "SELECT * FROM("; 
     selectSQL = selectSQL + "SELECT TB.BUS_ID, TL.LOB_ID, TD.ROLE_ID, TL.LOB_ID, TD.ACTIVITY_ID, TD.LAN_ID, TD.CREATE_TS "; 
     selectSQL = selectSQL + "FROM THN_DPL_DETAIL TD "; 
     selectSQL = selectSQL + "LEFT JOIN THN_ACTIVITY TA ON TD.Activity_ID = TA.Activity_ID "; 
     selectSQL = selectSQL + "LEFT JOIN THN_ROLE TR ON TR.ROLE_ID = TA.Role_ID "; 
     selectSQL = selectSQL + "LEFT JOIN THN_LOB TL On TL.LOB_ID = TA.LOB_ID "; 
     selectSQL = selectSQL + "LEFT JOIN THN_BUSINESS TB ON TB.BUS_ID = TR.BUS_ID "; 
     selectSQL = selectSQL + "WHERE Lan_ID = @strUserID "; 
     selectSQL = selectSQL + "ORDER BY CREATE_TS DESC"; 
     selectSQL = selectSQL + ") WHERE ROWNUM = 1;"; 


     OracleCommand cmd = new OracleCommand(@selectSQL, oConn); 
     cmd.Parameters.AddWithValue("@strUserID", strUserID); 

     OracleDataReader reader; 


     oConn.Open(); 
     reader = cmd.ExecuteReader(); 
     //read first line 
     reader.Read(); 
     if (reader.HasRows == true) 
     { 
      //First, grab the bytes from the reader: AA = Bus_ID, BB = LOB_ID and CC = Role_ID 
      byte AA = reader.GetByte(0); 
      byte BB = reader.GetByte(1); 
      byte CC = reader.GetByte(2); 

      //Now set the SelectedValue of Business and re-query the LOB dropdown for eligible values 
      CallBus_DrpDwnLst.SelectedValue = AA.ToString(); 
      LOBLoad(); 

      //Now set the SelectedValue of LOB since it's filled with eligible valuse 
      CallLOB_DrpDwnLst.SelectedValue = BB.ToString(); 
      CallRoleLoad(); 

      //Now set the SelectedValue of Role since it's filled with eligible valuse 
      CallRole_DrpDwnLst.SelectedValue = CC.ToString(); 

     } 
     else //no rows found, clear selection 
     { 
      CallBus_DrpDwnLst.SelectedIndex = 0; 
      CallLOB_DrpDwnLst.SelectedIndex = 0; 
      CallRole_DrpDwnLst.SelectedIndex = 0; 
     } 
     //close the reader 
     reader.Close(); 
     oConn.Close(); 
    } 
    catch (Exception ex) 
    { 
     // Handle the error 
     Response.Write(ex.Message); 
     //ErrorLogging.WriteToEventLog(ex); 
    } 
} 

Das Problem, das ich habe, ist, dass auf der Linie reader = cmd.ExecuteReader() Ich erhalte eine Fehlermeldung:

ORA-01036: illegal variable name/number

Kann mir jemand helfen mit Dies? Ich weiß, dass strUserID ordnungsgemäß aufgelöst wird, weil ich es beim Durchlaufen des Codes überprüft habe.

+0

, die aus sein wird '@ strUserID' Ich denke; Ist es glücklicher, wenn Sie das in ': strUserID' und den addWithValue in' strUserID' ändern? –

+0

Jetzt sagt es mir "SQL-Befehl nicht ordnungsgemäß beendet". –

+0

Sie wollen nicht das Semikolon am Ende des Befehls, aber das sollte Ihnen ORA-00911 geben. Es sei denn, Ihr Fahrer fängt es. –

Antwort

1

Der Fehler ist wegen der @ im @strUserID Platzhalter. Oracle verwendet einen Doppelpunkt, um Bind-Variablen zu bezeichnen, und der addWithValue()-Aufruf sollte den einfachen Bind-Namen verwenden.

Auch ein Semikolon ist ein Trennzeichen für Anweisungen, daher ist es kein Bestandteil einer einzelnen Anweisung. Dies verursacht manchmal einen ORA-00911, aber hier scheint Ihr Treiber Ihnen zu sagen, dass der SQL-Befehl nicht ordnungsgemäß beendet wurde, bevor Oracle diesen Fehler auslösen kann.

So sollte Ihr Code sein:

... 
     selectSQL = selectSQL + "WHERE Lan_ID = :strUserID "; 
     selectSQL = selectSQL + "ORDER BY CREATE_TS DESC"; 
     selectSQL = selectSQL + ") WHERE ROWNUM = 1"; 

     OracleCommand cmd = new OracleCommand(@selectSQL, oConn); 
     cmd.Parameters.AddWithValue("strUserID", strUserID); 
... 
+0

Perfekt! Danke vielmals! –

0

in der Abfrage statt wählen Sie tun, um die Rückkehr Wert Namen * geben, was Verfahren C# anzupassen erwartet, wie in

select Function_ID,Role_ID from ( your inner select) 
+0

Ich weiß, dass "Select *" funktioniert, weil es in meiner Oracle SQL Developer App funktioniert. Ich schrieb es zuerst dort, um sicherzustellen, dass mein SQL korrekt war. –