2013-07-14 181 views
0

我有这个问题。我在MySql中创建了两个与外键连接的表。我想从c#中的表中插入数据。无法将数据从c#插入到mysql数据库中

表人士
ID - INT,自动增加,主键
FIRST_NAME - VARCHAR
姓氏 - VARCHAR

表地址
ID - 自动递增,主键
城市 - VARCHAR
steet_number - varchar
persons_id - 外键

string mySqlString = "server=localhost;uid=root;pwd=root;database=address_book;"; 
    MySqlConnection conn = new MySqlConnection(mySqlString); 
    try 
    { 
     conn.Open(); 

     string insertPerson = "INSERT INTO persons(first_name, last_name) VALUES (@first_name, @last_name)"; 
     string insertAddress = "INSERT INTO addresses(city, street_number, persons_id) VALUES (@city, @street_number, @persons_id)"; 

     MySqlCommand command = new MySqlCommand(insertPerson, conn); 
     MySqlCommand secondCommand = new MySqlCommand(insertAddress, conn); 

     command.Parameters.AddWithValue("@first_name", TextBox1.Text); 
     command.Parameters.AddWithValue("@last_name", TextBox2.Text); 
     int id = Convert.ToInt32(command.LastInsertedId); 

     command.ExecuteNonQuery(); 

     secondCommand.Parameters.AddWithValue("@city", TextBox3.Text); 
     secondCommand.Parameters.AddWithValue("@street_number", TextBox4.Text); 
     secondCommand.Parameters.AddWithValue("@persons_id", id); 

     secondCommand.ExecuteNonQuery(); 
    } 
    catch (MySqlException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     conn.Clone(); 
    } 

但是这不起作用,我应该如何从主键获取最后插入的值以将该值插入到“persons_id”列中?或者,也许我错了别的地方?

+1

看一看:你在连接两个没有';'的sql语句。相反,为什么你不把这两个语句分开并在事务中执行它? – HuorSwords

+0

我试过了,但这不是问题。我可以做两个字符串和两个命令,但仍然会出错。问题是我不知道如何从列“table.id”中获取最后一个值。 – PUDEV

回答

1

在一个去,你可以直接使用LAST_INSERT_ID()上查询:

string insertPerson = "INSERT INTO persons(first_name, last_name) VALUES (@first_name, @last_name);" 
        + "INSERT INTO addresses(city, street_number,persons_id) VALUES (@city, @street_number, LAST_INSERT_ID());"; 
MySqlCommand command = new MySqlCommand(insertPerson, conn); 
command.Parameters.AddWithValue("@first_name", TextBox1.Text); 
command.Parameters.AddWithValue("@last_name", TextBox2.Text); 
command.Parameters.AddWithValue("@city", TextBox3.Text); 
command.Parameters.AddWithValue("@street_number", TextBox4.Text); 
command.ExecuteNonQuery(); 

或者你可以运行两个命令1插入个人和检索ID和其他插入地址:

string insertPerson = "INSERT INTO persons(first_name, last_name) VALUES (@first_name, @last_name)"; 
MySqlCommand command = new MySqlCommand(insertPerson, conn); 
command.Parameters.AddWithValue("@first_name", TextBox1.Text); 
command.Parameters.AddWithValue("@last_name", TextBox2.Text); 
command.ExecuteNonQuery(); 
int id = Convert.ToInt32(command.LastInsertedId); 

另一种方法是使用这样的双重查询:

string insertPerson = "INSERT INTO persons(first_name, last_name) VALUES (@first_name, @last_name); SELECT last_insert_id();"; 
MySqlCommand command = new MySqlCommand(insertPerson, conn); 
command.Parameters.AddWithValue("@first_name", TextBox1.Text); 
command.Parameters.AddWithValue("@last_name", TextBox2.Text); 
int id = Convert.ToInt32(comm.ExecuteScalar()); 

然后,您可以在您的下一个查询中使用生成的id

+0

您应该将这两个查询放在单个事务范围内。 – YK1

+0

1st query =='你的演示之一';第二个查询=='然后运行你的2查询并使用id.'。您应该在单笔交易中同时运行第一和第二。 – YK1

+0

正确你没有使用它 - 但你是_telling_ OP使用它说'然后运行你的2查询并使用id.'。因此,两个命令在同一个事务中运行是非常重要的 - 这是我最初的建议。 – YK1

相关问题