Member 9983063 Ответов: 1

В позиции 0 нет строки


Привет, Ребята! я столкнулся с подобной проблемой и я не знаю как их решить я перепробовал много вещей но этот вопрос я пока не могу решить пожалуйста помогите
на самом деле проблема в том, что я хочу выбрать значение из базы данных, и если ds == null, то значение текстового поля я хочу вставить в базу данных, но когда я вставляю его, мне показывается ошибка
There is no row at position 0

вот этот код
string query = "Select * From Contacts where [Phone No] = " + textBox00.Text + "";
                    using (OleDbConnection conn = new OleDbConnection(connStr))
                    {
                        using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
                        {
                            conn.Open();
                            DataSet ds = new DataSet();
                            if (ds != null)
                            {
                                adapter.Fill(ds);
                                label128.Text = ds.Tables[0].Rows[0]["Name"].ToString();
                                setaluefortext00001 = ds.Tables[0].Rows[0]["Phone No"].ToString();
                                setaluefortext00002 = ds.Tables[0].Rows[0]["Address"].ToString();
                                conn.Close();   
                            }
                            else
                            {
                                adapter.Fill(ds);
                                connection.Open();
                                OleDbCommand command1 = new OleDbCommand();
                                command1.Connection = connection;
                                command1.CommandText = "insert into Contacts ([Name],[Phone No],[Address])values('" + textBox.Text + "'," + textBox00.Text + ",'" + textBox000.Text + "');";
                                command1.ExecuteNonQuery();
                                connection.Close();
                                label128.Text = textBox.Text;
                                setaluefortext00002 = textBox00.Text;
                                setaluefortext00003 = textBox000.Text;
                            }


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

string query = "Select * From Contacts where [Phone No] = " + textBox00.Text + "";
                    using (OleDbConnection conn = new OleDbConnection(connStr))
                    {
                        using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn))
                        {
                            conn.Open();
                            DataSet ds = new DataSet();
                            if (ds != null)
                            {
                                adapter.Fill(ds);
                                label128.Text = ds.Tables[0].Rows[0]["Name"].ToString();
                                setaluefortext00001 = ds.Tables[0].Rows[0]["Phone No"].ToString();
                                setaluefortext00002 = ds.Tables[0].Rows[0]["Address"].ToString();
                                conn.Close();   
                            }
                            if (ds == null)
                            {
                                adapter.Fill(ds);
                                connection.Open();
                                OleDbCommand command1 = new OleDbCommand();
                                command1.Connection = connection;
                                command1.CommandText = "insert into Contacts ([Name],[Phone No],[Address])values('" + textBox.Text + "'," + textBox00.Text + ",'" + textBox000.Text + "');";
                                command1.ExecuteNonQuery();
                                connection.Close();
                                label128.Text = textBox.Text;
                                setaluefortext00002 = textBox00.Text;
                                setaluefortext00003 = textBox000.Text;
                            }

1 Ответов

Рейтинг:
12

OriginalGriff

С чего мне начать?
Во-первых, не делайте этого так! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Во-вторых, этот тест является избыточным:

if (ds != null)
Потому что ты всегда делаешь это перед этим:
DataSet ds = new DataSet();
ds никогда не может быть нулевым.

В-третьих, не используйте магические числа! Если вы собираетесь использовать абсолютные значения для доступа к одной строке, то сначала вам нужно проверить, есть ли вообще строка:
label128.Text = ds.Tables[0].Rows[0]["Name"].ToString();
Вы не проверяете, поэтому, если нет строк, где номер телефона точно совпадает, вы получите исключение, которое вы показываете. Проверьте количество строк и не продолжайте, если оно равно нулю.

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


Member 9983063

но братан как решить этот вопрос

OriginalGriff

Как я уже сказал: проверьте количество строк!

Member 9983063

ну а решение я нашел вот такое!
строка запроса = "выбрать * из "контактов", где [номер телефона] = " + textBox00.Текст + "";
using (OleDbConnection conn = new OleDbConnection(connStr))
{
используя (объект oledbdataadapter переходник = новый объект oledbdataadapter(запрос, соед))
{
Коннектикут.Открыть();
DataSet ds = новый набор данных();
адаптер.Заполнить(ДС);
if (ds != null && ds.Таблицы[0].Строки.Count > 0)
{
этикетка128.Text = ds.Tables[0].Rows[0]["имя"].Метод toString();
setaluefortext00001 = ds.Tables[0].Rows[0]["Phone No"].Метод toString();
setaluefortext00002 = ds.Tables[0].Rows[0]["Адрес"].Метод toString();
}
еще
{
OleDbCommand command1 = новая OleDbCommand();
КОМАНДА1.Соединение = conn;
command1.CommandText = "вставить в контакты ([Имя],[номер телефона],[адрес])значения('" + текстовое поле.Текст + "'," + textBox00.Text + ",'" + textBox000.Текст + "');";
КОМАНДА1.Метод executenonquery();
этикетка128.Текст = "текстовое поле".Текст;
setaluefortext00002 = textBox00.Text;
setaluefortext00003 = textBox000.Text;
}
Коннектикут.Закрывать();

Richard Deeming

Этот код ВСЕ ЕЩЕ уязвимы для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Member 9983063

Ну кстати спасибо Вам за помощь

OriginalGriff

Всегда пожалуйста! Но ds все равно никогда не будет нулевым, так что этот тест избыточен...