iHugoSilva Ответов: 2

Попытка получить и преобразовать возвращаемое значение в целое число.


Я пытаюсь сопоставить идентификатор пользователя (pk) в таблице "пользователи" с идентификатором пользователя (fk) в таблице "владельцы", но это, похоже, не работает.

Я получил регистрационную форму, которая будет вставлять все данные в обе эти таблицы.

Но это дает мне и ошибку на Доно (onwer), говоря, что мне нужно его преобразовать.

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

Я получил следующий код:

protected void confirmarButton_Click(object sender, EventArgs e)
        {
           // int n = 0;

            if (primeiroNome.Text != "" & nomeDoMeio.Text != "" && sobrenome.Text != "" && dataDeNascimento.Text != "" && enderecoPostal1.Text != "" && cidade.Text != "" && email.Text != "" && username.Text != "" && password.Text != "" && confirmarPassword.Text != "")
            {
                if (password.Text == confirmarPassword.Text)
                {
                    String CS = ConfigurationManager.ConnectionStrings["ClinicaAnimal"].ConnectionString;
                    using (SqlConnection con = new SqlConnection(CS))
                    {

                       // n = userIdNumber();


                        SqlCommand cmd2 = new SqlCommand("Insert into Users ([Username], [Password],[Tipo de User])Values('" + username.Text + "','" + Encrypt(password.Text.Trim()) + "','" + "Dono" + "')", con);
                       // cmd2.Parameters.AddWithValue("@Password", Encrypt(password.Text.Trim()));
                        SqlCommand cmd = new SqlCommand("Insert into Dono ([Primeiro Nome], [Nome do Meio], [Sobrenome], [Data de Nascimento], [Endereço Postal1], [Endereço Postal2], [Cidade], [Email], [UserID])Values('" + primeiroNome.Text + "','" + nomeDoMeio.Text + "','" + sobrenome.Text + "','" + dataDeNascimento.Text + "','" + enderecoPostal1.Text + " ','" + enderecoPostal2.Text + " ','" + cidade.Text + " ','" + email.Text + "','"+ "SELECT SCOPE_IDENTITY()" +"')", con);
                       

                        con.Open();

                        cmd2.ExecuteNonQuery();
                        cmd.ExecuteScalar();
                        

                        Response.Redirect("~/Home.aspx");
                    }
                }
                else
                {

Richard Deeming

В дополнение к критической уязвимости SQL-инъекции в вашем коде, вы должны НИКОГДА храните пароли с помощью обратимого шифрования. Вы должны использовать безопасный односторонний алгоритм хэширования с уникальной солью для каждой записи.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Но это дает мне и ошибку на Доно (onwer), говоря, что мне нужно его преобразовать.

Попробуйте сообщить точное сообщение об ошибке ans position.

SqlCommand("Insert into Users ([Username], [Password],[Tipo de User])Values('" + username.Text + "','" + Encrypt(password.Text.Trim()) + "','" + "Dono" + "')", con);

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Рейтинг:
1

Mitchell J.

Эй там,

Лучше всего догадаться, прочитав ваш вопрос, что у вас возникли проблемы с тип литья[^] :)

C# (и SQL, если уж на то пошло) часто будет сходить с ума, если вы попытаетесь использовать неправильный тип данных (например, string вместо int/double/float) в операторе.

Например:

int eight = 0;   // works
eight = "0";     // won't work
eight = 5 + 3;   // works
eight = 5 + "3"; // won't work
В вашем вопросе недостаточно информации, чтобы сказать, какой кастинг вы должны сделать, но вам, вероятно, придется сделать что-то в этом роде:
// converts the "string" data type to the "int" data type
int casted_value = (int)textbox.Text;
Имейте в виду, что приведение переменной из одного типа в другой вызовет нежелательные ошибки во время выполнения, если вводимые данные каким - либо образом искажены- например:
string five = "five";

// will throw an error, C# can't recognize spoken words :(
int converted_five = (int)five;
Чтобы снизить этот риск, убедитесь, что вы программно проверяете и очищаете все данные перед попыткой приведения типов.

Наконец, как упоминалось выше, ppolymorphe - прямое объединение SQL-запросов с использованием строк имеет огромные риски для безопасности и может/приведет к утечке / повреждению / неправильному использованию всей вашей базы данных, как только вы развернете свое приложение :)