Оператор C # T-SQL содержит ошибку «with (nolock)» - PullRequest
0 голосов
/ 29 декабря 2011

Short:

Оператор SQL в моем коде C # не работает. with(nolock) нарушает код.

Подробная:

Ниже приведены мои ошибки и код, где я получаю ошибку. Код должен подключиться к моей базе данных SQL Server (код подключения работает нормально), а затем выполнить запрос. Этот запрос получит IP-адреса всех событий, которые имеют URI "бла". Кажется, проблема в моей with(nolock) команде, которую я должен использовать. Я должен использовать это как групповой стандарт для всех запросов T-SQL.

Я некоторое время гуглил, но, похоже, ничего не подходит к моей проблеме, и найденные мной исправления еще не сработали. Любая помощь с моим кодом или ссылками будет принята с благодарностью.

Ошибка:

System.Data.SqlClient.SqlException был пойман Сообщение = Неверно синтаксис рядом с ключевым словом «с». Если это утверждение является общей таблицей выражение, предложение xmlnamespaces или контекст отслеживания изменений предложение, предыдущий оператор должен заканчиваться точкой с запятой.
Источник = .Net SqlClient Поставщик данных ErrorCode = -2146232060 Класс = 15 LineNumber = 1 Number = 319 Процедура = "" Сервер = Состояние = 1

Код:

try
{
   //create sql reader to display data
   SqlDataReader myReader = null;

   //create string to enter data into database
   string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";
   SqlCommand myCommand = new SqlCommand(insString, DbConnection);

   //populate and sanitize parameters
   myCommand.Parameters.Add("@dates", SqlDbType.VarChar, 100);
   myCommand.Parameters["@dates"].Value = currentdate;

   //execute the command
   myReader = myCommand.ExecuteReader();

   //read all results and print them to output
   while (myReader.Read())
   {
      //get IPs              
      String ipmix = myReader["c_ip"].ToString();
      mainIPs.Add(ipmix);
   }
}
catch (Exception e)
{
   Console.WriteLine("The query connection to the datebase has timed out.\n");
   Console.WriteLine(e.ToString());
   Console.ReadLine();
}

Решение:

Изменить код с:

//create string to enter data into database
string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";

до:

//create string to enter data into database
string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like '%blah'";

Ответы [ 3 ]

7 голосов
/ 29 декабря 2011

Это не WITH, это переменная @dates.Вы в основном создаете утверждение ....

select c_ip from '12/28/2011 15:35:22.997' with(nolock) where cs_uri like 'blah'

Что не имеет смысла.

Кроме того, ваше сообщение об исключении для пользователя не совсем корректно.Ошибкой могло быть любое количество вещей (например, «неправильный синтаксис»), но вы говорите им, что это проблема тайм-аута.

Исходя из вашего комментария, вы должны просто изменить текст запроса на ...

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri = 'blah'";

Поскольку вы генерируете значение currentdate в коде, а не из какого-либо пользовательского ввода, вы не подвержены риску внедрения SQL.Снятие подобного и замена его на равнозначное также улучшит производительность запроса.Также полностью удалите параметры.

1 голос
/ 29 декабря 2011

вы попросили его выбрать записи из таблицы с именем @Dates. (где это параметр даты) - это будет

select 'c_ip from 28-12-2011...'

Вы, вероятно, хотите что-то вроде

"выберите c_ip из logtable с (nolock), где cs_uri как 'blah' и log_date = @ date "

не забывая, что даты, если вы используете DATETIME поля, состоят из компонента даты и времени, так что вы, вероятно, также захотите построить соответствующий диапазон дат от 00:00:00 до 23:59:59 (или используйте currentdate+1, чтобы поймать перекрытие полуночи)

Это дает вам

select c_ip from logtable with(nolock) where (cs_uri like '%blah%') and (log_date between @startdate and @enddate)
1 голос
/ 29 декабря 2011

Избавьтесь от кода параметра и добавьте имя таблицы при создании оператора select

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like 'blah'";
...