c# - 为什么 .CommandText 不像 sqldeveloper 中的查询那样识别 LIKE 语句?

标签 c# mysql sql oracle

我正在使用 CommandText 从数据库获取一些数据,基本上我有三个从服务传递的参数,其值为:

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


    }

最佳答案

实际上并不是一个答案,但是请,请使用参数(和使用):

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

关于c# - 为什么 .CommandText 不像 sqldeveloper 中的查询那样识别 LIKE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057321/

相关文章:

c# - 创建挂接到属性的 getter 和 setter 的 C# 属性

c# - 动态返回模型的值

c# - 从输出参数中提取类

c# - 应用程序洞察应用程序类型之间的差异

mysql - 根据具体条件连接3个表

mysql - sql如何删除具有合并值的重复记录?

jQuery 选择选项 'selected'

sql - 如何管理数据库中的 "groups"?

c# - ASP.Net C# - MySQLTransaction 多次插入

c# - gridview 中的排序日期问题