如何将记录插入数据库中的多个表

时间:2014-04-30 18:00:22

标签: c# sql-server

我在C#和SQL Server 2005中自学

我在SQL Server 2005中有3个表,我在C#中有一个表单,接受要保存在数据库中的输入。

我的3张桌子是

  • HotelHotel No, Hotel Name, Location
  • GuestGuest No, Guest Name, Address
  • RoomRoom No Room Type, Room Price

和所有三个表相遇的联结表

  • Booking Hotel No, Guest No, Room No, Date From, Date To

我设置了酒店号,客人号,房间号是预订表的外键的关系

在我的C#表单中,我有一个代码填充了酒店名称和房间类型的组合框

private void FillComboBoxHotelName()
{
   conn.Open();
   SqlCommand cmd1 = new SqlCommand("SELECT * FROM Hotel", conn);
   SqlDataAdapter da = new SqlDataAdapter(cmd1);
   da.SelectCommand.CommandText = cmd1.CommandText.ToString();
   DataTable dt = new DataTable();
   da.Fill(dt);
   cmbHotelName.DataSource = dt;
   cmbHotelName.DisplayMember = "Hotel Name";
   cmbHotelName.ValueMember = "HotelNo";
   conn.Close();
}

private void FillComboBoxRoomType()
{
   conn.Open();
   SqlCommand cmd = new SqlCommand("SELECT * FROM Room", conn);
   SqlDataAdapter da = new SqlDataAdapter(cmd);
   da.SelectCommand.CommandText = cmd.CommandText.ToString();
   DataTable dt = new DataTable();
   da.Fill(dt);
   cmbRoomType.DataSource = dt;
   cmbRoomType.DisplayMember = "Room Type";
   cmbRoomType.ValueMember = "RoomNo";
   conn.Close();
}

此代码有效,我在酒店和房间的表格中的记录填写了我的表单中的组合框,我现在的问题是如何将表单中的输入值存储到我的数据库中。我是否需要为每个表创建单独的Insert查询命令,因为数据将转到3个表,我很遗憾。

我的表单如下:

Hotel Name : Combo Box
Guest Name: 
Guest Address:
Date From:
Date To:
Room Type:

Button (Save)

请帮助我仍然无法发布图片。

2 个答案:

答案 0 :(得分:1)

实现它的方法有两种:插入语句和存储过程。

插入

 string sql = "INSERT INTO Hotel (Hotel No, Hotel Name, Location) values (@HotelNo,@HotelName,@Location)";
 conn.Open();
 SqlCommand cmd = new SqlCommand(sql, conn);
 cmd.Parameters.Add("@HotelNo", SqlDbType.Int);
 cmd.Parameters.Add("@HotelName", SqlDbType.VarChar);
 cmd.Parameters.Add("@Location", SqlDbType.VarChar); 

 cmd.Parameters["@HotelNo"].Value = HotelNo; // Hotel number name in Int
 cmd.Parameters["@HotelName"].Value = HotelName;//Hotel Name in string  
 cmd.Parameters["@Location"].Value = Location;//Location in form of text

 cmd.ExecuteNonQuery(); 

注意:在代码中我假设酒店No是Int,酒店名称是VarChar,Location是VarChar。

以类似的方式,您可以为其余2个表创建Insert语句,并将代码插入2个表中。

存储过程

为要插入数据库的所有列创建存储过程。像

CREATE PROCEDURE yourInsertOperation 
  -- Add the parameters for the stored procedure here
  @HotelNo INT, 
  @HotelName VARCHAR(20),
  @Location VARCHAR(20),
--......rest of all your parameter list goes here

AS
  BEGIN
     INSERT INTO resourceTable(column1, column2) VALUES (@HotelNo, @HotelName, @Location )
   --Other 2 insert statements will go here
  End
  Go

存储过程在数据库中就绪后。您可以将该存储过程与C#代码中的参数一起调用。

 SqlCommand cmd = new SqlCommand("yourInsertOperation",con);
 cmd.CommandType = CommandType.StoredProcedure;

 cmd.Parameters.Add("@HotelNo", SqlDbType.Int);
 cmd.Parameters.Add("@HotelName", SqlDbType.VarChar);
 cmd.Parameters.Add("@Location", SqlDbType.VarChar); 
 //Other columns to insert will go here 

 cmd.Parameters["@HotelNo"].Value = HotelNo; // Hotel number name in Int
 cmd.Parameters["@HotelName"].Value = HotelName;//Hotel Name in string  
 cmd.Parameters["@Location"].Value = Location;//Location in form of text
 //Values for columns will go here     

 cmd.ExecuteNonQuery();  

总结一下,我建议您使用Insert查询,因为它可以轻松快捷地插入数据库。在此,您不必为创建SP付出努力。但是你仍然可以选择使用任何一种或两种方法作为学习目的。

答案 1 :(得分:0)

有多种方法可以解决您的问题:

  1. 在表格中插入时创建触发器将填充其余相关表格

  2. 在每个涉及的表中为您的C#插入SQL,而不是最好的方法,但可以完成。

  3. 构建存储过程以按顺序插入所有4个表。从您的C#代码中调用此SP。

  4. 我更喜欢按优先顺序使用3个或1个选项。