lira meh Ответов: 3

Вставьте данные в 3 таблицы и верните 2 внешних ключа


привет У меня есть метод, который заполняет поле со списком (возвращая данные из моей БД)
public void Fillcombo()
        {
          cbocompany.Items.Clear();
           OleDbConnection con = new OleDbConnection(strConn);
            con.Open();
            OleDbCommand cmd = con.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "select Com_Name from [company]";
            cmd.ExecuteNonQuery();
            DataTable dt = new DataTable();
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            da.Fill(dt);
            foreach(DataRow dr in dt.Rows)
            {
                cbocompany.Items.Add(dr["Com_Name"].ToString());
                
            }
            con.Close();


Но когда я хочу вставить данные, я выбираю текст в выпадающем списке, но не могу его сохранить ! У меня есть ошибка несоответствие типа данных в выражении критериев
и я хочу вернуть @@identity для пользователя

private void btajouter_Click(object sender, EventArgs e)
try
                  {
                                     con.Open();
                  string query="INSERT INTO [USER] (Use_Sgi, Use_FirstName, Use_LastName, Use_Email, Use_MobilePhone, Use_BusinessPhone, Com_ID, Loc_ID ) values('"+txtsgi.Text+"','"+ txtnom.Text +"','"+txtprenom+"','"+txtemail+"','"+txttelphonefix+"','"+txttelephonemobile+"','"+cbocompany.Text+"','"+cbolocaliter.Text+"',’” "select cast (@@identity() as int)")";
                  OleDbDataAdapter ad = new OleDbDataAdapter(query, con);
                  ad.SelectCommand.ExecuteNonQuery();

                  con.Close();

                  MessageBox.Show("Data Inserted Successfully");

                  }
                  catch (Exception ex)
                  {
                   MessageBox.Show(ex.Message);
                  }

Как я могу исправить эту проблему ! Заранее спасибо

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

у меня есть метод возврата @@identity
private int insertUpdatecnnstr(string accesstring)
        {
            string query2 = "Select @@Identity";
           OleDbConnection con = new OleDbConnection(strConn);
            con.Open();
            OleDbCommand cmd = new OleDbCommand(accesstring,con);
            cmd.ExecuteNonQuery();
            cmd.CommandText = query2;

            int ID = (int)cmd.ExecuteScalar();
            return (ID);
        }

CHill60

Ваш метод insertUpdatecnnstr просто ошибочен на стольких уровнях - он даже не выполняет вставку или обновление. На вершине все запросы в опасности SQL инъекций нападения

MadMyche

Какой тип БД вы используете?

lira meh

привет
я пользуюсь доступом 2016

MadMyche

Это то, что я использовал, когда кодировал свой ответ для вас

3 Ответов

Рейтинг:
22

Patrice T

string query="INSERT INTO [USER] (Use_Sgi, Use_FirstName, Use_LastName, Use_Email, Use_MobilePhone, Use_BusinessPhone, Com_ID, Loc_ID ) values('"+txtsgi.Text+"','"+ txtnom.Text +"','"+txtprenom+"','"+txtemail+"','"+txttelphonefix+"','"+txttelephonemobile+"','"+cbocompany.Text+"','"+cbolocaliter.Text+"',’" "select cast (@@identity() as int)")";

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


CHill60

Связи получше моих!

Patrice T

Спасибо;
Некоторые были найдены здесь в ответах от других, просто собирая их :) .
Не стесняйтесь выбирать те, которые вы хотите.

Рейтинг:
2

CHill60

Узнайте больше о SQL - инъекции и измените свой запрос, чтобы использовать параметры - Шпаргалка по предотвращению инъекций - OWASP[^]

Это, вероятно, решит вашу проблему с несоответствием типов данных

Какую бы базу данных вы ни использовали, это не то, как вы возвращаете Identity - даже если вы действительно настроили CommandText до выполнение запроса.

Если вы используете SQL Server, то используйте Предложение вывода (Transact-SQL) - SQL Server | Microsoft Docs[^] Если вы используете другую базу данных, то изучите, как вернуть последнее удостоверение, вставленное в соответствующую документацию


Рейтинг:
0

MadMyche

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

2. Вы не выполнения пакета SQL (Insert и Select) с ExecuteNonQuery() функция. Это всегда будет возвращать Int64, представляющий затронутых строк последней команды; так что в значительной степени это всегда будет 1.
То, что вы хотите сделать, это использовать ExecuteScalar() функция, которая вернет 1 элемент данных, который вы хотите. Кроме того, вы возвращаете его, а не захватываете это значение.

3. ваша функция ReturnIdentity, вероятно, вернет 0; так как она выполняется как отдельная команда и единственный элемент в пакете.

Я сделал некоторую быструю очистку первых 2 элементов; используя параметры в запросе, изменив функцию Execute и захватив идентификатор в новой переменной. Я удалил приведение из TSQL, и вы можете сделать это в вызывающем приложении.

string query = "INSERT INTO [USER] (Use_Sgi, Use_FirstName, Use_LastName, Use_Email, Use_MobilePhone, Use_BusinessPhone, Com_ID, Loc_ID ) values(?, ?, ?, ?, ?, ?, ?, ?); SELECT @@Identity()";

OleDbCommand cmd = new OleDbCommand(query, com);
cmd.Parameters.AddWithValue("@sgi", txtsgi.Text);
cmd.Parameters.AddWithValue("@nom", txtnom.Text);
cmd.Parameters.AddWithValue("@prenom", txtprenom);
cmd.Parameters.AddWithValue("@email", txtemail);
cmd.Parameters.AddWithValue("@telphonefix", txttelphonefix);
cmd.Parameters.AddWithValue("@telphonemobile", txttelephonemobile);
cmd.Parameters.AddWithValue("@company", cbocompany.Text);
cmd.Parameters.AddWithValue("@localiter", cbolocaliter.Text);

con.Open();
var NewIdentity = cmd.ExecuteScalar();
con.Close();


Как только вы исправите основы общения C# с базой данных, люди будут гораздо более склонны помогать вам с любыми конкретными проблемами, которые у вас возникают с ней