C# 使用单个按钮运行 3 个 MYSQL 插入查询 - 来自文本框和列表视图的数据

Posted

技术标签:

【中文标题】C# 使用单个按钮运行 3 个 MYSQL 插入查询 - 来自文本框和列表视图的数据【英文标题】:C# Running 3 MYSQL insert queries with single button press - Data from textboxes and listview 【发布时间】:2018-07-28 17:53:48 【问题描述】:

我想知道你是否可以帮助我。首先,我想说这是我创建的第一个 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 键 ('Nr_Naprawy') 参考 'naprawa'('Nr_Naprawy') ON DELETE NO ACTION 更新无操作)

我将非常感谢任何有助于解决这个谜团的帮助。

提前谢谢你

罗古普

【问题讨论】:

Visual Studio 标记明确指出:“不要在有关代码的问题上使用此标记,而这些代码恰好是用 Visual Studio 编写的”,所以我将把它从你的问题。 foreach 循环中也有问题,所以我会注释掉导致问题的位...请检查我的编辑,如果不正确,请修复它。 【参考方案1】:

您需要将INSERT 输入 Naprawa,以便在同一查询中返回自动生成的值。将此添加到插入语句的末尾,在 ; 之后

SELECT LAST_INSERT_ID();

然后要取回它,请将 ExecuteNonQuery 更改为 ExecuteScalar - 它返回的值将是您需要的值 - 它作为一个对象返回它,所以要么转换它,要么转换它或 System.Convert 它。 (这需要您删除检查它是否插入了 1 行;但请记住,它会抛出失败的异常。)

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

其他提示:

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

【讨论】:

嗨!非常感谢您的回答 !!我已经设法调整代码以使用正确的 FK 将列表视图中的记录插入到“opisynapraw”中。 !不幸的是,我对 FOREACH 循环有一些问题,因为当我有多个记录时,它会显示“参数 @Val1 已被定义” 也非常感谢您提供额外的提示!!。我将把这些放在船上,一旦我拥有了我需要的所有功能,我就会整理代码。 !! 我建议让每个数据库调用独立。因此,有一种方法可以插入父项并返回自动生成的值,另一种方法可以插入单个子记录。 MySqlConnections 和 MySqlCommands 等中的每一个都应该被推入这两种方法中的相关一种。这将为您提供更好的关注点分离,使数据存储逻辑远离您想要存储的逻辑。这样,存储子记录的每个调用都是独立的,因此您的问题将消失。或者便宜又讨厌的解决方法是cmd2.Parameters.Clear(); 再次感谢您!这解决了我的问题。就像我说的,我稍后会整理代码,因为我知道我的系统存在一些缺陷。我希望我能给你一个代表点,但我想我自己需要 15 个才能给一个。【参考方案2】:

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

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

【讨论】:

以上是关于C# 使用单个按钮运行 3 个 MYSQL 插入查询 - 来自文本框和列表视图的数据的主要内容,如果未能解决你的问题,请参考以下文章

对多个方法 C# 使用单个事务?

如何将来自三个 Perl 数组的数据插入到单个 MySQL 表中?

mysql--对行(表中数据)的增删改查

mysql 的增删改查 实现代码

我无法使用 C# 添加数据以访问 2007,任何人都可以帮助我吗?

使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)