C#通过单击三个按钮运行3个MYSQL插入查询-文本框和列表视图中的数据

时间:2018-07-28 17:53:48

标签: c# mysql listview last-insert-id

我在想你是否可以帮助我。首先,我想说这是我在C#中创建的第一个应用程序,因此请接受我的代码并不完美。

我想要实现的目标: 我的应用程序将是汽车维修管理应用程序。我有一个面板,上面只有几个texbox和一个列表。我想用一个按钮单击,以便文本框中的数据将存储在名为“ naprawa”的表中,而列表中的数据将存储在称为“ opisynapraw”的表中。这些表与“ naprawa”中的FK相关,因此我希望列表中的项目在存储时将在其他表中具有刚创建的字段的FK。 (如果这样的话)

请参阅下面的表格设置: 纳普拉瓦

|--------------+----------------+------+-----+---------+----------------+
| Field        | Type           | Null | Key | Default | Extra          |
|--------------+----------------+------+-----+---------+----------------+
| Nr_Naprawy   | int(11)        | NO   | PRI | NULL    | auto_increment |
| data_naprawy | date           | YES  |     | NULL    |                |
| nr_rej       | varchar(45)    | YES  | MUL | NULL    |                |
| Przebieg     | int(15)        | YES  |     | NULL    |                |
|--------------+----------------+------+-----+---------+----------------+

该表中的数据:

|------------+--------------+---------+-----------|
| Nr_Naprawy | data_naprawy | nr_rej  | Przebieg  |
|------------+--------------+---------+-----------|
|      1     |  2018-06-20  | na06ysa |   150000  |
|------------+--------------+---------+-----------|

表opisynapraw:

+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| idopisynapraw | int(11)       | NO   | PRI | NULL    | auto_increment |
| Opis_Naprawy  | varchar(45)   | YES  |     | NULL    |                |
| Cena          | decimal(10,2) | YES  |     | NULL    |                |
| Nr_Naprawy    | int(11)       | YES  | MUL | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+

我希望在该表中看到的示例数据:

|---------------+--------------+-------+-------------|
| idopisynapraw | Opis_Naprawy | Cena  | Nr_Naprawy  |
|---------------+--------------+-------+-------------|
|       1       |  notes abcd  |  30   |      1      |
|---------------+--------------+-------+-------------|
|       2       |  notes cdef  |   5   |      1      |
|---------------+--------------+-------+-------------|

我想要我的代码做什么。我按添加按钮时,它将把文本框中的记录添加到“ naprawa”中。然后获取添加的ID,并将其用作opisynapraw的FK,并将其与listveiw中的数据一起添加到opisynapraw表中。

这是我的代码。

private void btnDodajNaprawe_Click(object sender, EventArgs e)
        {
            try
            {
                MySqlConnection myConn3 = new MySqlConnection(MyConnection);

                myConn3.Open();



                string querydoajnap = "INSERT INTO naprawa (data_naprawy,nr_rej,Przebieg) VALUES('" + dtaData.Value.Date.ToString("yyyy/MM/dd") + "', '" + txtNrRej.Text + "', '" + txtPrzebieg.Text + "');";
                MySqlCommand cmd = new MySqlCommand(querydoajnap, myConn3);

                MySqlConnection lastidconn = new MySqlConnection(MyConnection);
                lastidconn.Open();


                if (cmd.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Dodane");


                    txtNrRej.Text = string.Empty;
                    txtPrzebieg.Text = string.Empty;

                }
                else
                {
                    MessageBox.Show("Blad");
                }




                String LastIDnapr = "select LAST_INSERT_ID();";
                MySqlCommand cmd1 = new MySqlCommand(LastIDnapr, lastidconn);
                MySqlDataReader IDRead = cmd1.ExecuteReader();
                int idnumber = 0;
                while (IDRead.Read())
                {
                    idnumber = IDRead.GetInt32(0);
                }

                MySqlCommand cmd2 = myConn3.CreateCommand();

                foreach (ListViewItem item in listView1.Items)
                {
                    // opisynapraw(Opis_Naprawy,Cena,Nr_Naprawy) VALUES (@val1 , @val2, '" + idnumber + "');";


                    cmd2.Parameters.AddWithValue("@val1",item.Text);
                    cmd2.Parameters.AddWithValue("@val2",item.SubItems[1].Text);
                    cmd2.CommandText = "INSERT INTO opisynapraw(Opis_Naprawy,Cena,Nr_Naprawy) VALUES (@val1 , @val2, '" + idnumber + "');";
                    cmd2.ExecuteNonQuery();
                }
                lastidconn.Close();
                myConn3.Close();


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

当我执行以上代码时,它可以将数据添加到“ Naprawa”表中,但是我认为它将不会使用上次使用的ID与“ opisynapraw”表相关,这会带来以下错误。

由于某些原因,我需要一些表示点来发布图像...我将在出现的错误消息下方输入

  

无法添加或更新子行;外键约束失败   ('cars','opisynapraw',CONSTRAINT'Nr_Naprawy'FOREIGN Key   ('Nr_Naprawy')参考'naprawa'('Nr_Naprawy')删除操作无效   在更新时不采取任何措施)

我非常感谢您为解决这个难题提供的帮助。

提前谢谢

Rogupl

2 个答案:

答案 0 :(得分:0)

由于危险的sql注入代码,应始终使用SqlCommand及其参数。 另外,一个好主意是制作一个数据库处理程序类,它将处理所有这些事情。

但是让我们回到您的问题,我坚信您正在尝试将id插入到opisynapraw表中,而在naprawa表中不存在id作为id。请检查您要获取的ID,您要插入的ID并使用数据库数据进行验证。

答案 1 :(得分:0)

您需要将INSERT放入Naprawa,才能在同一查询中返回自动生成的值。在;

之后,将其添加到插入语句的末尾
SELECT LAST_INSERT_ID();

然后将其取回,将ExecuteNonQuery更改为ExecuteScalar-它返回的值将是您需要的值-它作为对象返回,因此可以将其强制转换为{{1} }。 (这要求您删除它插入1行的检查;但是请记住,它将抛出异常)。

现在删除与System.Convert查询相关的代码,它应该可以正常工作。

其他提示:

  1. 您的代码容易受到SQL注入攻击:使用SQL参数而不是字符串连接来构造查询。
  2. MySqlConnection,MySqlCommand和MySqlDataReader都是IDisposable的,因此每个都应放在LastIDnapr块中。
  3. 这些连接正在连接到同一数据库,因此请确保它们不重叠。一旦使用using块,这一点就显而易见。
  4. 看看can we stop using AddWithValue