我想知道你是否能帮我。首先,我想说这是我在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')在更新时不操作)
如果能帮我解开这个谜,我将不胜感激。
先谢谢你
流氓
2条答案
按热度按时间gj3fmq9x1#
由于sql注入代码的危险性,您应该始终使用sqlcommand及其参数。另外,一个好主意是创建一个数据库处理程序类,它将处理所有这些事情。
但让我们回到您的问题,我坚信您正在尝试将id插入到表opisynapraw中,但表naprawa中不存在id。请检查您获得的id,尝试插入的内容,并用数据库数据验证它。
0s7z1bwu2#
你需要
INSERT
输入naprawa,以返回同一查询中自动生成的值。在insert语句末尾的;
```SELECT LAST_INSERT_ID();