2014-09-26 62 views
0

我使用的CommandText得到一些數據從數據庫回來,基本上我有從服務傳遞三個參數具有值:爲什麼.CommandText不像在sqldeveloper中的Query中那樣識別LIKE語句?

ORIG_LOC = STPX 

PLAN_WRK_ORIG_DEp = 18:15 

uwttid = 631D62MW26 

這是所有好,很好,我有這個命令文本語句。

cmd.CommandText = "SELECT * FROM RESERVED_SEATS WHERE TRAIN_ID = (SELECT DISTINCT TRAIN_ID FROM DAILY_SCHEDULES WHERE ORIG_LOC ='" + ORIG_LOC + "' AND UWTTID ='" + uwttid + "' AND PLAN_WRK_ORIG_DEP LIKE '%" + PLAN_WRK_ORIG_DEP + "%')"; 

這似乎只是返回null,讓我沒有結果,但是如果我擺脫了最後一部分,只是使用:

cmd.CommandText = "SELECT * FROM RESERVED_SEATS WHERE TRAIN_ID = (SELECT DISTINCT TRAIN_ID FROM DAILY_SCHEDULES WHERE ORIG_LOC ='" + ORIG_LOC + "' AND UWTTID ='" + uwttid + "')"; 

它返回所有必要的數據。這是令人沮喪的,因爲這個命令在sqldeveloper中工作並返回所有必要的表,但是當我在頂部的語句中使用它並且變量的值與我在下面設置的值相同時,它不會返回任何結果。它與LIKE聲明有問題,我不知道爲什麼。

下面的語句是我可以在sqldeveloper中用來查詢我的數據庫,它返回我需要的表的確切結果,但是在.CommandText中使用C#中的LIKE時,它只是不會以相同的方式搜索它在sqldeveloper中查詢它。

SELECT * FROM RESERVED_SEATS rs WHERE rs.TRAIN_ID = (SELECT DISTINCT ds.TRAIN_ID FROM DAILY_SCHEDULES ds WHERE ds.UWTTID = '631D62MW26' AND ds.ORIG_LOC = 'STPX' AND ds.PLAN_WRK_ORIG_DEP LIKE '%18:15%'); 

在這裏你可以看到,我通過在CommandText中的變量具有相同的價值觀,和2/3的工作,但是當我嘗試使用PLAN_WRK_ORIG_DEP LIKE語句中它是行不通的。

enter image description here

這是我想在我的Oracle數據庫查詢,所以你可以看到,它實際上確實存在該行。 enter image description here

摘要版本: 所以基本上,如果這是混亂,沒有什麼意義,但我真正問的是。爲什麼這個聲明不起作用?

cmd.CommandText = "SELECT * FROM RESERVED_SEATS WHERE TRAIN_ID = (SELECT DISTINCT TRAIN_ID FROM DAILY_SCHEDULES WHERE ORIG_LOC ='" + ORIG_LOC + "' AND UWTTID ='" + uwttid + "' AND PLAN_WRK_ORIG_DEP LIKE '%" + PLAN_WRK_ORIG_DEP + "%')"; 

當這個相同的工作在SQLDEVELOPER作爲查詢?

SELECT * FROM RESERVED_SEATS rs WHERE rs.TRAIN_ID = (SELECT ds.TRAIN_ID FROM DAILY_SCHEDULES ds WHERE ds.UWTTID = '631D62MW26' AND ds.ORIG_LOC = 'STPX' AND ds.PLAN_WRK_ORIG_DEP LIKE '%18:15%'); 

不知道是否有關,但這是它的使用方法:此方法時,我擺脫了PLAN_WRK_ORIG_DEP部分,但使用時不能正常工作。

public ServiceResponse GetReservations(string uwttid, string ORIG_LOC, string PLAN_WRK_ORIG_DEP) 
    { 
     ServiceResponse sR = new ServiceResponse(); 

     JavaScriptSerializer jscript = new JavaScriptSerializer(); 

     try 
     { 
      string dataSource = "Data Source=GMOB; User Id=Firenze; Password=Dumbledore"; 
      OracleConnection conn = new OracleConnection(dataSource); 
      List<Reservations> reservationsList = new List<Reservations>(); 
      conn.Open(); 


       OracleCommand cmd = new OracleCommand(); 
       cmd.Connection = conn; 
       cmd.CommandText = "SELECT * FROM RESERVED_SEATS WHERE TRAIN_ID = (SELECT DISTINCT TRAIN_ID FROM DAILY_SCHEDULES WHERE ORIG_LOC ='" + ORIG_LOC + "' AND UWTTID ='" + uwttid + "' AND PLAN_WRK_ORIG_DEP LIKE '%" + PLAN_WRK_ORIG_DEP + "%')"; 


       cmd.CommandType = CommandType.Text; 
       OracleDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 
        Reservations reservations = new Reservations(); 
        var spacing = " - "; 
        var bracket1 = " ("; 
        var bracket2 = ")"; 
        reservations.Coach = dr["COACH_LETTER"].ToString(); 
        reservations.Seat = dr["SEAT_NUM"].ToString() + dr["SEAT_TYPE"].ToString() + bracket1 + dr["POSITION"].ToString() + bracket2; 
        reservations.Class = dr["CLASS"].ToString(); 
        reservations.Leg = dr["LOC_START"].ToString() + spacing + dr["LOC_END"].ToString(); 
        reservations.Notes = dr["NOTES"].ToString(); 
        reservationsList.Add(reservations); 
       } 
       dr.Close(); 
       conn.Dispose(); 

      sR.DataResponse = jscript.Serialize(reservationsList); 
      return sR; 

     } 
     catch (Exception ex) 
     { 
      Utilities.LogError("getreservations" + ex.ToString()); 
      sR.Message = "Failed"; 
      return sR; 
     } 


    } 
+2

Eugh,那太可怕了; SQL注入天堂。如果你經常寫這樣的數據訪問代碼:***現在停止*** - 回去修復它(使用參數代替串聯):你的代碼需要立即關注,並且**非常容易受惡意濫用的影響。 – 2014-09-26 10:28:33

+0

我們似乎有一個完全不同的概念。你能否確保兩者完全相同?提示:一個使用'DISTINCT',另一個不使用;一個有表別名,另一個沒有(這可能很重要,取決於你的模式)。 另外 - 由於你的代碼似乎是關於如何在C#和SqlDeveloper之間執行SQL命令的差異,你能否嘗試隔離最少量的代碼來顯示你的問題?錯誤處理,JavaScript序列化等真的在這裏相關嗎? – decPL 2014-09-26 10:28:46

+0

我忘了擺脫明顯的遺憾,它不影響結果。 – Red 2014-09-26 10:30:36

回答

0

不是一個真正的答案本身,而是請,請使用的參數(和using):

List<Reservations> reservationsList = new List<Reservations>(); 
using(OracleConnection conn = new OracleConnection(dataSource)) 
using(OracleCommand cmd = new OracleCommand()) 
{ 
    conn.Open(); 
    cmd.Connection = conn; 
    cmd.CommandType = CommandType.Text; 
    cmd.BindByName = true; 
    cmd.CommandText = "SELECT * FROM RESERVED_SEATS WHERE TRAIN_ID = (SELECT DISTINCT TRAIN_ID FROM DAILY_SCHEDULES WHERE ORIG_LOC = :ORIG_LOC AND UWTTID = :UWTTID AND PLAN_WRK_ORIG_DEP LIKE '%' + :PLAN_WRK_ORIG_DEP + '%')"; 
    cmd.Parameters.AddWithValue("ORIG_LOC", ORIG_LOC); 
    cmd.Parameters.AddWithValue("UWTTID", uwttid); 
    cmd.Parameters.AddWithValue("PLAN_WRK_ORIG_DEP", PLAN_WRK_ORIG_DEP); 

    using(OracleDataReader dr = cmd.ExecuteReader()) 
    {   
     while (dr.Read()) {...} 
    } 
} 
sR.DataResponse = jscript.Serialize(reservationsList); 
+0

時,參數只傳遞'18:15'我嘗試了參數化,但無法使它工作。我現在看到我的commandtext都是錯誤的。我將在未來做到這一點,謝謝 – Red 2014-09-26 10:37:52

+0

也,我曾嘗試使用AddWithValue,它說我錯過了一個程序集引用,但沒有任何其他引用,我GOOGLE了它,並說Oracle不支持AddWithValue和我應該使用Add(new OracleParameter)來代替? – Red 2014-09-26 10:50:05

+0

@Shaun有多種添加參數的方式;重點是:將它們添加爲參數。如何:是一個實現細節。 – 2014-09-26 12:10:32

0

我試圖創建一個簡單的查詢,以確保公正的C#部分正確的做法:
你也可以測試一下,看看你是否可以沒有任何問題地運行它:
這裏我試圖選擇使用像下面這樣的命令:
第一種方法,不建議:

using (OracleConnection con = new OracleConnection(YourConnectionString)) 
    { 
     using (OracleCommand cmd = new OracleCommand()) 
     { 
      string query = string.Format("select * from table1 where id3 LIKE '{0}'", "%18:15%"); 
      cmd.CommandText = query; 
      cmd.Connection = con; 
      OracleDataAdapter da = new OracleDataAdapter(cmd); 
      var tb = new DataTable(); 
      da.Fill(tb); 

     } 
    } 

這選擇就好了。 現在,如果你需要使用的參數使用了這種方式:

using (OracleConnection con = new OracleConnection(YourConnectionString)) 
    { 
     using (OracleCommand cmd = new OracleCommand()) 
     { 
      string query = "select * from table1 where id3 LIKE :var"; 
      cmd.CommandText = query; 
      cmd.Parameters.Add("var", "%18:15%"); 
      cmd.Connection = con; 

      OracleDataAdapter da = new OracleDataAdapter(cmd); 
      var tb = new DataTable(); 
      da.Fill(tb); 

     } 
    } 

運行也很不錯。

這是樣本數據的查詢,我提出來測試:

CREATE TABLE test.TABLE1 (
    ID NUMBER(10, 0), 
    ID2 NVARCHAR2(50), 
    ID3 NVARCHAR2(50) 
) 
TABLESPACE USERS 
STORAGE (INITIAL 64 K 
     NEXT 1 M 
     MAXEXTENTS UNLIMITED) 
LOGGING; 

編輯: 如果你的問題是你的字符串轉換爲日期時間變量,你可以簡單地使用DateTime.Parse()這樣的:

DateTime dt = DateTime.Parse("18:15"); 

這會給你保持有日期時間變量:

9/26/2014 18:15:00 

如果您使用的是非標準日期時間字符串,您可能還會看看DateTime.ParseExact()字符串

+0

感謝您的努力,但這不是問題。我已經意識到,因爲我想要傳遞一個字符串,當它想要一個日期時間我有一個名爲'PLAN_WRK_ORIG_DEP'的字符串,它的值爲'18:15'。我需要將其轉換爲具有以下格式的日期時間:26/09/14 18:15:00 時間必須是字符串的值加上a:00,並且日期必須是今天的日期。我怎麼會這樣呢?顯然是與DateTime.now有關,但我怎樣才能將第二部分的時間分配給我的字符串的值? – Red 2014-09-26 12:18:56

+0

然後使用DateTime.Parse()。看到答案 – Breeze 2014-09-26 12:54:03

相關問題