Передайте строковый параметр в текст команды с кавычками - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь передать параметр в запрос, но с кавычками в качестве строкового значения. Но я могу заставить его работать. Что я тут не так делаю.

SqlConnection conn = new SqlConnection(SERP_FT_connection);
        SqlCommand cmd = new SqlCommand("SELECT sp.* "
                                         + " FROM [serp_post] sp "
                                         + " LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id "
                                         + " WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = @paymentTerm ", conn);

        cmd.CommandType = CommandType.Text;
        conn.Open();

        SqlParameter param = new SqlParameter();
        param.ParameterName = "@paymentTerm";
        param.Value = paymentTerm; // when debugged here it shows as "CH1"
        cmd.Parameters.Add(param);

Запрос выглядит при отладке,

SELECT sp.*  FROM [serp_post] sp  LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id  WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = @paymentTerm

Наконец, запрос должен выглядеть так, как это значение передано в кавычках

SELECT sp.*  FROM [serp_post] sp  LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id  WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = 'CH1'

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Попробуйте перехватить параметризованный запрос в профилировщике.Правильный запрос будет выглядеть примерно так:

exec sp_executesql N' SET FMTONLY OFF; SET NO_BROWSETABLE ON;SELECT sp.*  FROM [serp_post] sp  LEFT JOIN [serp_m3_data] m3 ON m3.serp_post_id = sp.serp_post_id  WHERE sp.[serp_status_id]='CLEAR_DONE' AND sp.m3UpdateStatus <> '2' AND sp.process_type='POST' AND m3.EGTRCD = '40' AND m3.EPPYME = @paymentTerm',N'@paymentTerm varchar(10)',@paymentTerm='CH1'

Как сказал Джон Скит, параметры SQL не вставляются в запрос.

0 голосов
/ 10 июля 2019

Помимо комментариев, которые фактически представляют ПАРАМЕТРЫ, автоматически обрабатываются во время публикации, а не ЛИТЕРАЛЬНО в запросе, чтобы предотвратить sql-инъекцию.

Что касается другого ответа о двойных кавычках, я получилв привычку писать свой sql в C # как пример ниже, чтобы предотвратить случайное использование двойных кавычек.

  SqlCommand cmd = new SqlCommand( "", conn);
  cmd.CommandText = 
@"SELECT 
      sp.*
   FROM 
      [serp_post] sp 
         LEFT JOIN [serp_m3_data] m3 
            ON m3.serp_post_id = sp.serp_post_id
   WHERE 
          sp.[serp_status_id]='CLEAR_DONE' 
      AND sp.m3UpdateStatus <> '2' 
      AND sp.process_type='POST' 
      AND m3.EGTRCD = '40' 
      AND m3.EPPYME = @paymentTerm ";

Обратите внимание на полностью читаемый запрос, не прокручивая и не забывая двойные кавычки + на следующей строкеи т. д. Опять же, просто стиль при сборке команд sql.Знак @ означает весь текст, пока он не закроет другие двойные кавычки.Поскольку SQL игнорирует вводимые ключи в операторах, они по-прежнему работают без проблем и улучшают читабельность.

...