我使用的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語句中它是行不通的。
這是我想在我的Oracle數據庫查詢,所以你可以看到,它實際上確實存在該行。
摘要版本: 所以基本上,如果這是混亂,沒有什麼意義,但我真正問的是。爲什麼這個聲明不起作用?
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;
}
}
Eugh,那太可怕了; SQL注入天堂。如果你經常寫這樣的數據訪問代碼:***現在停止*** - 回去修復它(使用參數代替串聯):你的代碼需要立即關注,並且**非常容易受惡意濫用的影響。 – 2014-09-26 10:28:33
我們似乎有一個完全不同的概念。你能否確保兩者完全相同?提示:一個使用'DISTINCT',另一個不使用;一個有表別名,另一個沒有(這可能很重要,取決於你的模式)。 另外 - 由於你的代碼似乎是關於如何在C#和SqlDeveloper之間執行SQL命令的差異,你能否嘗試隔離最少量的代碼來顯示你的問題?錯誤處理,JavaScript序列化等真的在這裏相關嗎? – decPL 2014-09-26 10:28:46
我忘了擺脫明顯的遺憾,它不影響結果。 – Red 2014-09-26 10:30:36