【问题标题】:How to insert multiple rows of one user with common ID (primary key) into SQL Server database?如何将具有公共 ID(主键)的一个用户的多行插入 SQL Server 数据库?
【发布时间】:2017-07-22 02:03:13
【问题描述】:

我想在我的 Asp.net 表单中记录学历。因为我要拿10、12、毕业的记录,硕士。所以我为此创建了四行......和 ​​5 列(考试年份、董事会、百分比、总分、部门)。

现在我想通过在所有四个记录中维护一个用户通用的主键,一键单击将所有行插入数据库中。

请帮我写代码(C#)

【问题讨论】:

  • 您可以执行多个插入查询。你就是这样做的。
  • 问题在于多个插入查询是...我已将 studentID 列设为主键并标识 key 。并且对于多个插入查询,它每次都会更改并导致重复值。您还可以建议我另一种方法来解决我的问题。谢谢
  • 您应该将学生表与主键分开,并将其用作学生资格表中的外键。这样你就不会遇到这个问题。如果您可以共享您的代码和表结构,以便为您的问题提供适当的解决方案,那就更好了。
  • 实际上我正在尝试上传我的代码和表单的图像..但每次堆栈溢出应用程序崩溃时。在那之前...我将尝试通过创建两个表来实现您的想法,如您所说。谢谢
  • 您可能不需要多个表,具体取决于您当前使用的表的意图。为了澄清,我知道总共有六列:(StudentId、YearOfExam、Board、Percentage、TotalMark、Division)。这是正确的吗?

标签: c# asp.net sql-server


【解决方案1】:

您可能想看看使用复合主键。这是使用多列组成单个键的主键。有支持和反对这种策略的论据。见:What are the pros and cons of using multi column primary keys?

例如,如果您的表格如下所示:

CREATE TABLE [dbo].[StudentExam]
(
    [StudentId] INT NOT NULL PRIMARY KEY, 
    [Year] INT NOT NULL, 
    [Board] SOMEDATATYPE NOT NULL, 
    [Percentage] FLOAT NOT NULL, 
    [TotalMark] INT NOT NULL, 
    [Division] SOMEDATATYPE NOT NULL, 
)

您可以将架构改为如下所示:

CREATE TABLE [dbo].[StudentExam]
(
    [StudentId] INT NOT NULL, 
    [Year] INT NOT NULL, 
    [Board] SOMEDATATYPE NOT NULL, 
    [Percentage] FLOAT NOT NULL, 
    [TotalMark] INT NOT NULL, 
    [Division] SOMEDATATYPE NOT NULL, 
    CONSTRAINT [PK_StudentExam] PRIMARY KEY ([StudentId], [Year])
)

通过这样做,您声明对于此表中的任何给定行,它由 Student 和 Year 一起唯一标识。您仍然可以仅查询学生或仅查询年份,但只有将它们组合在一起才能识别一行。

有关主键的更多信息,请参阅Create Primary Keys

【讨论】:

    【解决方案2】:

    在Sql中创建表类型

     CREATE TYPE [dbo].[TypeName] AS TABLE(
    [name1] [varchar](1000) NULL,
    [name2] [varchar](1000) NULL,
    [name3] [varchar](max) NULL
    )
    GO
    

    在 SQL 中创建过程:

     ALTER PROCEDURE [dbo].[InsertData]
     @TableType TypeName readonly
     AS 
    
       INSERT INTO [dbo].[Table_Master]
       (Tname1,Tname2,Tname3)
        select name1,name2,name3 from @TableType
    

    然后转到后面的代码

            OpenConnection();
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.CommandText = spName;
            sqlcmd.Connection = sqlconn;
    
            SqlParameter tvpParam = sqlcmd.Parameters.AddWithValue("@Type", Your 
            Datatable); 
            tvpParam.SqlDbType = SqlDbType.Structured; 
            SqlParameter returnParameter = sqlcmd.Parameters.Add("RetVal", 
             SqlDbType.Int);
            returnParameter.Direction = ParameterDirection.ReturnValue;
            sqlcmd.ExecuteNonQuery();
    
            int Result = (int)returnParameter.Value;
    
            sqlcmd.Dispose();
            return Result;
    

    在上级代码中传递您的 DT...它将完全工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2015-06-23
      • 1970-01-01
      相关资源
      最近更新 更多