R.M49 Ответов: 1

Проверка дублирования при вводе по представлению detailsview с#


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

Я попробовал приведенный ниже код и протестировал его с помощью кнопки, и он работал, но знаю, что хочу назначить его команде insert detailsview. Я попытался поместить его в DetailsView1_ItemInserting, но в случае оператора if он дает мне желтую страницу ошибки с дублированием PK, но в случае оператора else работает нормально. Кто-Нибудь Поможет??

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

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
            string query = "select Username from [Login] where Username = '" + ((TextBox)DetailsView1.FindControl("TextBox1")).Text + "'";
            SqlCommand cmd = new SqlCommand(query, con);
            con.Open();
            SqlDataReader dr = cmd.ExecuteReader();

            dr.Read();
            if (dr.HasRows == true)
            {

                //error message here

            }
            else
            {
                //success message here
            }

            con.Close();

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Помимо "атаки SQL-инъекций" (серьезно, Google it, вы рискуете уничтожить свою базу данных!), к которой вы открываетесь, это плохая идея-использовать SELECT, чтобы сначала посмотреть, есть ли что-то там, а затем вставить. Что произойдет, если два человека попытаются зарегистрировать одно и то же имя пользователя? Один из них преуспеет, а другой потерпит неудачу, даже если ваш избранник сказал, что он доступен. Порядок инструкций SQL от каждого пользователя будет следующим:

User1                 User2
SELECT (available!)
                      SELECT (available!)
INSERT (succeeds!)
                      INSERT (fails - duplicate)

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