如何将具有公共ID(主键)的一个用户的多行插入SQL Server数据库?

时间:2017-07-22 02:03:14

标签: c# asp.net sql-server

我想以我的Asp.net表格获取教育资格记录。因为我要上第10,第12,毕业,硕士的记录。所以我为此创建了四行......和5列(考试年份,董事会,百分比,总分,分部)。

现在,我希望通过在所有四个记录中保持一个用户的主键共用,通过单击按钮插入数据库中的所有行。

请帮我处理代码(C#)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在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传递给Uper Code ...它将完全正常工作