繁体   English   中英

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

[英]C# Running 3 MYSQL insert queries with single button press - Data from textboxes and listview

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

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

请参阅下面的表格设置:Naprawa

|--------------+----------------+------+-----+---------+----------------+
| 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键('Nr_Naprawy')参考'naprawa'('Nr_Naprawy')删除时不采取任何措施,但没有采取任何更新措施

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

先感谢您

罗古普

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

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

您需要在Naprawa中INSERT才能在同一查询中返回自动生成的值。 将其添加到插入语句的末尾;

SELECT LAST_INSERT_ID();

然后取回它,将ExecuteNonQuery更改为ExecuteScalar它返回的值将是您需要的值-它以对象的形式返回,因此可以将其System.Convert (这要求您删除它插入1行的检查;但是请记住,它将抛出异常而失败)。

现在删除与LastIDnapr查询有关的代码,它应该可以正常工作。

其他提示:

  1. 您的代码容易受到SQL注入攻击:使用SQL参数而不是字符串连接来构造查询。
  2. MySqlConnection,MySqlCommand和MySqlDataReader都是IDisposable的,因此每个都应该在using块中。
  3. 这些连接正在连接到同一数据库,因此请确保它们不重叠。 一旦使用using块,这将很明显。
  4. 看一下我们是否可以停止使用AddWithValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM