Рейтинг:
2
OriginalGriff
Без ваших фактических данных мы не можем проверить, но я бы предположил, что значение в вашем текстовом поле точно не соответствует ни одному из ваших терминов: "=" в SQL требует точного соответствия, а лишнее или отсутствующее пространство приведет к провалу сравнения.
Вы могли бы попробовать например:
... WHERE MyColumn LIKE '%' + @MyUserInput + '%' ...
как что будет соответствовать "AAAAABCDDDD" и "до нашей эры" на входе "до нашей эры" без каких-либо проблем.
Вам также нужно поместить спецификатор "variable" в каждый параметр при его добавлении:
SqlCommand comm = new SqlCommand("Select Name, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear from dbo.FZMain where ID = @ID or ChassisNO = @ChassisNO or Name = @Name or CarModel = @CarModel or NumPlate = @NumPlate or CarBrand = @CarBrand or Cases = @Cases or CarBrand = @CarBrand or PlaceOfWork = @PlaceOfWork or PlaceOfBirth = @PlaceOfBirth or Address = @Address or Status = @Status or ModelYear = @ModelYear or cert_number = @cert_number or Payment = @Payment or CustomsCertNum = @CustomsCertNum ", conn);
comm.Parameters.AddWithValue("@ID", TextBox1.Text);
comm.Parameters.AddWithValue("@Name", TextBox1.Text);
comm.Parameters.AddWithValue("@ChassisNO", TextBox1.Text);
comm.Parameters.AddWithValue("@CarModel", TextBox1.Text);
Я бы также изменил ваш запрос: если вы используете одно и то же поле ввода для каждого сравнения, то зачем передавать его как несколько параметров? Либо передайте отдельные текстовые поля, либо просто передайте текстовое поле один раз:
SqlCommand comm = new SqlCommand("Select Name, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear from dbo.FZMain where ID = @ID or ChassisNO = @ChassisNO or Name = @Name or CarModel = @CarModel or NumPlate = @NumPlate or CarBrand = @CarBrand or Cases = @Cases or CarBrand = @CarBrand or PlaceOfWork = @PlaceOfWork or PlaceOfBirth = @PlaceOfBirth or Address = @Address or Status = @Status or ModelYear = @ModelYear or cert_number = @cert_number or Payment = @Payment or CustomsCertNum = @CustomsCertNum ", conn);
comm.Parameters.AddWithValue("@ID", tbID.Text);
comm.Parameters.AddWithValue("@Name", tbName.Text);
...
Или
SqlCommand comm = new SqlCommand("Select Name, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear from dbo.FZMain where ID = @SEARCH or ChassisNO = @SEARCH or Name = @SEARCH or CarModel = @SEARCH or NumPlate = @SEARCH or CarBrand = @SEARCH or Cases = @SEARCH or CarBrand = @SEARCH or PlaceOfWork = @SEARCH or PlaceOfBirth = @SEARCH or Address = @SEARCH or Status = @SEARCH or ModelYear = @SEARCH or cert_number = @SEARCH or Payment = @SEARCH or CustomsCertNum = @SEARCH", conn);
comm.Parameters.AddWithValue("@SEARCH", TextBox1.Text);
Member 13058758
та же проблема и я изменил команду sql
до настоящего времени
SqlCommand comm = new SqlCommand("Select Name, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear from FZMain WHERE Name = '" + TextBox1.Text + "' or ID = '" + TextBox1.Text + "' or ChassisNO = '" + TextBox1.Text + "' or CarModel = '" + TextBox1.Text + "' or NumPlate = '" + TextBox1.Text + "' or CarBrand = '" + TextBox1.Text + "' or Cases = '" + TextBox1.Text + "' or CarBrand = '" + TextBox1.Text + "' or PlaceOfWork = '" + TextBox1.Text + "' or PlaceOfBirth = '" + TextBox1.Text + "' or Address = '" + TextBox1.Text + "' or Status = '" + TextBox1.Text + "' or ModelYear = '" + TextBox1.Text + "' or cert_number = '" + TextBox1.Text + "' or Payment = '" + TextBox1.Text + "' or CustomsCertNum = '" + TextBox1.Text + "' ", conn);
OriginalGriff
НЕ ДЕЛАЙ ЭТОГО!
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.
Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Покажите нам точно, что находится в "соответствующей строке", точное значение в вашем текстовом поле, видимое отладчиком, и новый (параметризованный) запрос, который вы пытаетесь выполнить.
Мы не можем работать без информации, и у нас нет доступа к вашей базе данных или к тому, что ваш пользователь вводит!
Member 13058758
я знаю, что проблема я делаю это, чтобы убедиться, что нет никакой проблемы в моей первой sqlcommand и проблема с функцией has-row
OriginalGriff
Нет, это не так - собственность Хасроуза была там в течение двадцати лет неизменной, и если бы она не работала, это было бы замечено к настоящему времени! :смеяться:
Итак, Бритва Оккама говорит: Это ваша БД, или ваш пользовательский ввод. Честное слово!
Member 13058758
:Д :д Так что
Я пытаюсь уменьшить команду с помощью этой команды sql
SqlCommand comm = new SqlCommand("выберите имя, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear из dbo.FZMain где ID = @ID или ChassisNO = @ChassisNO или Name = @Name", conn);
и он работает правильно
у вас есть какие-либо предложения, чтобы поставить все запросы без проблем
OriginalGriff
Добавьте следующий, дайте ему точно такой же ввод и посмотрите, что произойдет.
Если это сработает, добавьте еще один и продолжайте пытаться, пока он не остановится.
Для простоты используйте фиксированную строку вместо пользовательского ввода для тестирования, чтобы вы знали, что это не "ошибка ввода ключа"
Member 13058758
Я знаю, где моя ошибка этот тип данных из двух столбцов был int я конвертирую его в varchar и проблема решена (Payment = @Payment или CustomsCertNum = @CustomsCertNum)
OriginalGriff
Вот видишь - это был не Хэсроуз! :смеяться:
Отлично сработано.
Рейтинг:
2
phil.o
Почему вы создаете так много параметров, если вы передаете только один одиночный ценность? Как есть, ваш запрос может быть сведен к следующему
SqlCommand comm = new SqlCommand("SELECT Name, ChassisNO, CarModel, NumPlate, CarBrand, CustomsCertNum, ModelYear FROM dbo.FZMain WHERE ID = @value OR ChassisNO = @value OR Name = @value OR CarModel = @value OR NumPlate = @value OR CarBrand = @value OR Cases = @value OR PlaceOfWork = @value OR PlaceOfBirth = @value OR Address = @value OR Status = @value OR ModelYear = @value OR cert_number = @value OR Payment = @value OR CustomsCertNum = @value", conn);
comm.Parameters.AddWithValue("@value", TextBox1.Text);
Если некоторые столбцы не имеют типа varchar/nvarchar, было бы разумно создать отдельные параметры и использовать правильный метод синтаксического анализа. На данный момент все ваши параметры будут созданы и переданы как nvarchar.
Наконец, вы единственный, у кого есть все элементы, чтобы полностью исследовать происходящее; у нас нет вашей схемы базы данных (в частности, нам нужно было бы знать тип данных столбцов). И нам не хватает четкого описания проблемы. Какое значение(с) делать давать результаты, и какой(ая) не? Вы также можете поместить точку останова в свой код и начать сеанс отладки; это позволит вам исследовать ваши переменные и найти основную причину вашей проблемы.
Member 13058758
та же проблема
возвращает false в строку, но int и возвращать данные
Я изменил свою команду sqlcommand на эту и ту же проблему
SqlCommand comm = new SqlCommand("Select Name, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear from FZMain WHERE Name = '" + TextBox1.Text + "' or ID = '" + TextBox1.Text + "' or ChassisNO = '" + TextBox1.Text + "' or CarModel = '" + TextBox1.Text + "' or NumPlate = '" + TextBox1.Text + "' or CarBrand = '" + TextBox1.Text + "' or Cases = '" + TextBox1.Text + "' or CarBrand = '" + TextBox1.Text + "' or PlaceOfWork = '" + TextBox1.Text + "' or PlaceOfBirth = '" + TextBox1.Text + "' or Address = '" + TextBox1.Text + "' or Status = '" + TextBox1.Text + "' or ModelYear = '" + TextBox1.Text + "' or cert_number = '" + TextBox1.Text + "' or Payment = '" + TextBox1.Text + "' or CustomsCertNum = '" + TextBox1.Text + "' ", conn);
phil.o
Никогда не создавайте SQL-скрипты путем объединения строк. Во-первых, вы правильно использовали параметры, почему же вы вернулись к неправильному методу?
Кроме того, я не говорю, что запрос, который я записал, решит проблему, а скорее, что нет смысла создавать несколько параметров для одного значения. OriginalGriff прав, когда говорит, что вы должны использовать LIKE
оператор, а не =
при сравнении строк (решение 2).
Member 13058758
Я пробую это та же самая проблема
когда я поставил SQL-запроса в SQL сервер его извлечения данных
phil.o
Как я уже сказал, Вы единственный, кто может исследовать это должным образом, потому что только у вас есть все соответствующие элементы. Пожалуйста, используйте свой отладчик. Вам нужна помощь в том, как правильно провести сеанс отладки?
Member 13058758
Я пытаюсь уменьшить команду с помощью этой команды sql
SqlCommand comm = new SqlCommand("выберите имя, ChassisNO, CarModel, NumPlate,CarBrand,CustomsCertNum,ModelYear из dbo.FZMain где ID = @ID или ChassisNO = @ChassisNO или Name = @Name", conn);
и он работает правильно
у вас есть какие-нибудь предложения, чтобы поставить весь запрос
phil.o
Продолжайте добавлять поля одно за другим и тестировать, пока не найдете, какое из них приводит к тому, что запрос возвращает нулевой результат. Это даст вам/нам ценную информацию о том, что происходит. Я также вижу, что вы все еще не заменили строгое тестирование на равенство LIKE
оператор, как и было рекомендовано.
Member 13058758
Я знаю, где моя ошибка этот тип данных из двух столбцов был int я конвертирую его в varchar и проблема решена (Payment = @Payment или CustomsCertNum = @CustomsCertNum)