c#运行3个mysql insert查询,只需按一下按钮,即可从文本框和listview获取数据

vwkv1x7d  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我想知道你是否能帮我。首先,我想说这是我在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  |
|------------+--------------+---------+-----------|

表1:

+---------------+---------------+------+-----+---------+----------------+
| 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',约束'nr\u naprawy'外键('nr\u naprawy')在删除时引用'naprawa'('nr\u naprawy')在更新时不操作)
如果能帮我解开这个谜,我将不胜感激。
先谢谢你
流氓

gj3fmq9x

gj3fmq9x1#

由于sql注入代码的危险性,您应该始终使用sqlcommand及其参数。另外,一个好主意是创建一个数据库处理程序类,它将处理所有这些事情。
但让我们回到您的问题,我坚信您正在尝试将id插入到表opisynapraw中,但表naprawa中不存在id。请检查您获得的id,尝试插入的内容,并用数据库数据验证它。

0s7z1bwu

0s7z1bwu2#

你需要 INSERT 输入naprawa,以返回同一查询中自动生成的值。在insert语句末尾的 ; ```
SELECT LAST_INSERT_ID();

然后要把它拿回来,就换个新的 `ExecuteNonQuery` 进入 `ExecuteScalar` -它返回的值将是您需要的值-它将它作为对象返回,因此可以强制转换它或 `System.Convert` 是的(这就要求你删除你的支票,它插入1行;但请记住,它会抛出一个异常(如果失败)
现在删除与 `LastIDnapr` 查询,应该可以。
其他提示:
您的代码容易受到sql注入攻击:使用sql参数而不是字符串串联来构造查询。
mysqlconnection、mysqlcommand和mysqldatareader都是可idisposable的,因此每个都应该在 `using` 阻止。
这些连接正在连接到同一个数据库,因此请确保它们不会重叠。一旦你使用 `using` 阻碍。
看看我们能不能停止使用addwithvalue

相关问题