Member 9983063 Ответов: 1

Дополнительная информация: в позиции 0 нет строки.


Привет, ребята, я работал над формой c# win, но я оставляю этот проект на некоторое время сегодня, когда я открываю свой проект и добавляю форму в свое приложение, и когда я запускаю
так что я получаю эту ошибку
Additional information: There is no row at position 0.

но в моей БД у меня есть 60000 данных этой таблицы я не знаю в чем проблема пожалуйста ребята помогите мне
Спасибо

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

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (textBox2.Text == "")
            {
                return;
            }
            else
            {
                con_string.ConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source =|DataDirectory|\Restaurant.accdb;Persist Security Info=False";
                con_string.Open();
                DataSet dsa = new DataSet();
                DataTable dt = new DataTable();
                dsa.Tables.Add(dt);
                OleDbDataAdapter da = new OleDbDataAdapter();
                da = new OleDbDataAdapter("SELECT [Place Name],[State],[Country],[Latitude],[Longtitude] FROM [Address] where [Postal Code] = " + textBox2.Text + "", con_string);
                da.Fill(dt);
                if (dt.Rows[0][0] =="")
                {
                    MessageBox.Show("User Cannot be Found", "Change Password", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                    textBox1.Text = "";
                    textBox2.Text = "";
                    textBox3.Text = "";
                }
                textBox3.Text = dt.Rows[0][0].ToString();
                textBox5.Text = dt.Rows[0][0].ToString();
                textBox4.Text = dt.Rows[0][0].ToString();
                con_string.Close();
            }
        }

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

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

И во-вторых, если нет строк, соответствующих почтовому индексу, никакие строки не будут возвращены. Если строки не возвращаются, то любая попытка получить к ним доступ приведет к исключению "нет строки в...". Проверьте ряды.Вместо этого подсчитайте свойство и даже не пытайтесь заполнить текстовые поля, если в них нет строк.

Теперь о вещах, которые вы не заметили...
1) текстовые поля 3, 4 и 5 будут получать одни и те же данные.
2) если пользователь вводит неверные данные, не очищайте его ввод! Выберите его и установите фокус на этом элементе управления да - тогда он знает, что не так, и может это исправить. Но удаление того, что он напечатал, чтобы он не мог видеть, что он сделал неправильно, просто грубо.
3) не жестко кодируйте строки подключения - это настоящая боль, когда вы переходите к производству. Всегда используйте конфигурационный файл или что-то подобное.

Кстати: сделайте себе одолжение и перестаньте использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo" - и ваш код станет легче читать, более самодокументируемым, более легким в обслуживании - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...