2016-06-20 10 views
1

私はC#コードビハインドの一部をSQL Serverの代わりにOracleと連携させるように変換することになっています。そしてオラクルとの私の経験は...オハイオ... 2日間です。OracleでのDataReaderの適切な使用?

だから、ここで私が持っているものです。

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

私がいる問題は、ラインreader = cmd.ExecuteReader()に私はエラーを取得していますということです。

ORA-01036: illegal variable name/number

誰もが私を助けることができますこの?私はstrUserIDがコードをステップ実行している間にチェックしたので、strUserIDが正しく解決することを知っています。

+0

。それを ':strUserID'に変更し、addWithValueを' strUserID'に変更すれば幸いですか? –

+0

今は「SQLコマンドが正しく終了していません」と言っています。 –

+0

セミコロンをコマンドの最後に置かずに、ORA-00911を与える必要があります。あなたの運転手がそれをキャッチしていない限り。 –

答えて

1

にエラーが@strUserIDプレースホルダであるため@であるとして、期待されているもの、あなたのC#の手順と一致するように返す値の名前を与えます。 Oracleはバインド変数を示すためにコロンを使用し、addWithValue()コールはプレーン・バインド名を使用する必要があります。

また、セミコロンはステートメントセパレータであるため、単一のステートメントの一部を構成しません。これはORA-00911を引き起こすことがありますが、ここでドライバが「エラーが発生する前にSQLコマンドが正しく終了していません」と表示されているようです。

だからあなたのコードは次のようになります。私は思うの@ strUserID` `からなり

... 
     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

完璧!ありがとう、トン! –

0

クエリではなく、選択を行っている*

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

「Select *」は、Oracle SQL Developerアプリで動作するため、動作します。私はそこに最初に書いて、自分のSQLが正確であることを確認しました。 –