Member 14630006 Ответов: 1

Как подключиться к базе данных access ссылка введенная текстовым полем и отобразить имя поля введенное другим текстовым полем на этикетке


Я пытаюсь подключиться к базе данных access, введенной textbox1, возможно ли это или есть другой способ , даже такие поля, как я набираю fullname в textbox2

вот мой код, я знаю, что у него много ошибок, но вы можете помочь? даже если у тебя есть другой способ

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

string connectString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=textbox1.Text";

         OleDbConnection cn = new OleDbConnection(connectString);

         cn.Open();
         string selectString = "SELECT textbox2.Text FROM textbox3.Text WHERE textbox2.Text='" + label25.Text + "'";
         OleDbCommand cmd = new OleDbCommand(selectString, cn);
         OleDbDataReader reader = cmd.ExecuteReader();
         if (reader.Read())
         {
             label25.Text = reader.GetString(reader.GetOrdinal("textbox2.Text"));
         }


         cn.Close();

CHill60

"Источник данных=textbox1.Text"; очевидно, не работает. Вам нужно создать строку подключения с помощью текстового поля textbox1.Текст. Е. Г.

string connectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + textbox1.Text;

Также используйте параметризованные запросы - не объединяйте содержимое текстового поля для создания sql-запросов.

Member 14630006

спасибо за повтор , посмотрите на все ошибки, но то, что я пытаюсь сделать, - это войти в любую базу данных, которую пользователь вводит или получает из файла, и он соединяет метки с полями
так что это отображение на этикетках

CHill60

См. решение 1

1 Ответов

Рейтинг:
12

OriginalGriff

Там так много проблем...
1)

string connectString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=textbox1.Text";
Включает литерал "textbox1.Text" в строку подключения, а не содержимое свойства.
2)
string selectString = "SELECT ... WHERE textbox2.Text='" + label25.Text + "'";
Делает то же самое для textbox2.Text.
3) так же и это:
reader.GetString(reader.GetOrdinal("textbox2.Text"));

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

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

Но в то время как вы можете исправить условие WHERE с помощью параметризованных запросов, вы не можете использовать их с именами столбцов или таблиц: так что даже если вы исправите его, независимо от того, что пользователь вводит в
textbox2.Text и textbox3.Text должны быть проанализированы вами и ограничены, чтобы предотвратить проблемы:
SELECT textbox2.Text FROM textbox3.Text 


Откровенно говоря? Я понятия не имею, почему вы пытаетесь написать этот код, но это почти наверняка очень плохая идея, которая в какой-то момент уничтожит вашу БД ... Я подумаю еще раз, очень тщательно.