Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将记录插入数据库中的多个表中_C#_Sql Server - Fatal编程技术网

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

C# 如何将记录插入数据库中的多个表中,c#,sql-server,C#,Sql Server,我正在自学C#和SQL Server 2005 我在SQLServer2005中有3个表,在C#中有一个表单,它接受要保存在数据库中的输入 我的3张桌子是 酒店带列酒店编号、酒店名称、位置 Guest带列客人编号、客人姓名、地址 房间带列房间无房间类型,房间价格 和一张三张桌子交汇处的连接桌 预订酒店号、客人号、房间号、日期从、日期到 我设置了酒店号、客人号、房间号是预订表外键的关系 在我的C#表单中,我有一个代码填充酒店名称和房间类型的组合框 private void FillComb

我正在自学C#和SQL Server 2005

我在SQLServer2005中有3个表,在C#中有一个表单,它接受要保存在数据库中的输入

我的3张桌子是

  • 酒店
    带列
    酒店编号、酒店名称、位置
  • Guest
    带列
    客人编号、客人姓名、地址
  • 房间
    带列
    房间无房间类型,房间价格
和一张三张桌子交汇处的连接桌

  • 预订
    酒店号、客人号、房间号、日期从、日期到
我设置了酒店号、客人号、房间号是预订表外键的关系

在我的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();
}
这段代码可以工作,我在Hotel和in Room的表中的记录填充了我表单中的组合框,我现在的问题是如何将表单中的输入值存储到数据库中。我是否需要为每个表创建一个单独的Insert查询命令,因为数据将进入3个表,我处于丢失状态

我的表单如下所示:

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

Button (Save)

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

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

  • 在表预订中插入时创建触发器,该触发器将填充其余相关表

  • 在C#中为每个涉及的表插入SQL,这不是最好的方法,但可以做到

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


  • 我希望按照优先顺序使用3个或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(); 
    
    注意:在代码中,我假设Hotel No是Int,Hotel Name是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#代码中的参数


    总而言之,我建议您使用Insert查询,因为它可以方便快捷地插入到数据库中。在这方面,您不必在创建SP上下功夫,但您仍然可以选择使用任何一种或两种方法来实现学习目的

    我尝试在中为每个表插入一个insert SQL命令,但没有插入任何记录,并引发一个常规异常“名称附近的语法不正确”,我将在何处构建SP?在SQL Server 2005或C#中,我将在“保存”按钮中调用该方法显示insert语句以及编码。。存储过程和触发器是SQL Server的一部分。还有一件事,您的列名不应该是两个字,像使用Room_No一样使用它以避免不必要的麻烦。private void StoreGuest(){conn.Open();SqlCommand InsertCommand=new SqlCommand(“插入到Guest(Guest Name,Location)值(“+txtGuestName.Text+”,“+txtGuestAddress.Text+”),conn);InsertCommand.Connection=conn;InsertCommand.ExecuteOnQuery();conn.Close();(用于来宾输入的我的插入方法)正如我所怀疑的:客人的名字应该是Guest\u Name OK我会在db中将Guest\u Name改为Guest\u Name,如果问题解决了,我会留言,谢谢,我会试试这个,你的权利我的酒店号是INT,位置是VARCHARI我还有一个问题,关于我的酒店号,在我的表格中我没有酒店号,我只有酒店名在组合框中,我根据数据库中的数据填充了组合框,所以如果我不在C#中的insert sql命令中包含它,可以吗?谢谢。在这种情况下,您不必在C#中包含Hotel No作为参数。我刚刚尝试了您建议的第一个选项cmd.Parameters.Add(“@HotelName”,SqlDbType.VarChar);和cmd.Parameters[“@HotelName”].Value=HotelName;//字符串中的HotelName我将HotelName替换为cmbHotelName.SelectedValue因为我的HotelName是一个组合框,然后我注释掉HotelNo和位置,当我运行程序时,它返回一个Sql异常“varchar附近的语法不正确\ Name附近的语法不正确”,感谢有多种可能出现“语法错误”。1)Check提供了所有必要的列以插入,如HotelName(如果您在Hotel中有Location列)2)因为错误表明您可能在insert语句中发送了一些不正确的字符
     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();