Member 13491350 Ответов: 1

Хо Ван я могу это решить problem...in проверка подлинности SQL server и проверка подлинности окна показывают одну и ту же ошибку...на самом деле ошибка отображается как "ошибка входа пользователя"sa""


частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{

пробовать
{
SqlConnection con = новый SqlConnection();
против.ConnectionString = @"источник данных=DINU-PC\MYSQL;начальный каталог=testdb;Интегрированная безопасность=True";


против.Открыть();

SqlCommand cmd = новая команда SqlCommand();
УМК.Подключение = кон;
SqlDataAdapter ПДД = новый SqlDataAdapter("вставить в testtable (идентификатор пациента,идентификатор ОП,имя,мобильный телефон,отдел,пол) значения('" + элемент combobox1.Текст + "','" + comboBox2.Текст + "','" + текстовое поле textbox1.Текст + "','" + поле textbox2.Текст + "','" + textbox3 и.Текст + "','" + comboBox3.Текст + "')", кон);
АСД.Команды selectcommand.Метод executenonquery();
против.Закрывать();
Ящик для сообщений.Show("сохранено успешно...!!!");
}
поймать (исключение бывший)
{
Ящик для сообщений.Шоу(напр.Метод toString());
}
}

Что я уже пробовал:

пожалуйста, помогите.... показывает код ошибки:102 sate:1 class:15

Mehdi Gholam

Вы пытаетесь подключиться к MS SQL Server или MySql?

Member 13491350

сервер MS SQL

1 Ответов

Рейтинг:
1

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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

That code will not complain about the "sa" user - but you shouldn't be using the "sa" account anyway, it's very dangerous. The problem is that the default "sa" account has full admin access to your DB engine, and can do anything to any of your databases as a result - even if you slightly miss code something! The first thing you should do with the sa account is change the username and password to prevent it working (which is what I suspect has happened here, producing the error message you see) and set up more restricted accounts with just enough permissions to access specific databases and do exactly the job they need. If they don't need the ability to delete rows, they don't get it, much less the ability to create or delete tables!

Если вы все еще получаете сообщение"login failed for user" sa " с интегрированной безопасностью, то оно исходит из другого кода в вашем приложении, а не из того фрагмента, который вы показываете.
Что подводит нас к следующему пункту: никогда не используйте жесткие строки кода соединения! Всегда используйте конфигурационный файл или что-то в этом роде: Хранилище экземпляров - простой способ обмена конфигурационными данными между приложениями[^]

Но... ошибка, о которой вы действительно упоминаете в конце:
Цитата:
пожалуйста, помогите.... показывает код ошибки:102 sate:1 class:15
Не относится к логину: это синтаксическая ошибка в вашей команде, вызванная вашим выбором имен столбцов.
"Идентификатор пациента" - это не очень хорошее имя-SQL видит пробел в конце имени и жалуется, что вам нужна запятая между "пациентом" и "идентификатором". Вы можете обойти это, приложив имя:
INSERT INTO  testtable ([patient id], [op id], name...

Но в первую очередь лучше использовать имена без пробелов.