Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# 如何将一个用户的多行公共ID(主键)插入SQL Server数据库?_C#_Asp.net_Sql Server - Fatal编程技术网

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

C# 如何将一个用户的多行公共ID(主键)插入SQL Server数据库?,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我想以Asp.net的形式获取教育资格记录。因为我要考10、12班的成绩,毕业,硕士。所以我为这个创建了四行。。。和5列(考试年份、委员会、百分比、总分、部门) 现在,我想通过在所有四个记录中维护一个用户的主键common,通过单击按钮插入数据库中的所有行 请帮助我使用代码(C#)您可能需要查看如何使用组合主键。这是一个主键,它使用多个列组成一个键。这一战略有赞成和反对的理由。见: 例如,如果您的表如下所示: CREATE TABLE [dbo].[StudentExam] ( [Stu

我想以Asp.net的形式获取教育资格记录。因为我要考10、12班的成绩,毕业,硕士。所以我为这个创建了四行。。。和5列(考试年份、委员会、百分比、总分、部门)

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


请帮助我使用代码(C#)

您可能需要查看如何使用组合主键。这是一个主键,它使用多个列组成一个键。这一战略有赞成和反对的理由。见:

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

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])
)
通过这样做,您可以声明,对于该表中的任何给定行,它都是由学生和年份一起唯一标识的。您仍然可以只查询学生,或只查询年份,但它们只能一起标识一行


有关主键的详细信息,请参见在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…它将完全工作

您可以执行多个插入查询。这就是你要做的。多重插入查询的问题是。。。我已经把studentID列作为主键,也作为识别键。对于多重插入查询,每次都会更改它,并导致重复值。你也可以给我建议另一种解决方案。谢谢,您应该将主键与studentqualification表分开,并将其用作studentqualification表中的外键。这样你就不会面对这个问题。如果您可以共享代码和表结构,以便为您的问题提供适当的解决方案,那就更好了。实际上,我正在尝试上载我的代码和表单的图像。但是每次堆栈溢出应用程序崩溃时。在那之前,我会像你说的那样,通过创建两个表来实现你的想法。谢谢您可能不需要多个表,这取决于您当前使用的表的用途。为了澄清,我知道总共有六列:(学生ID、毕业年份、董事会、百分比、总分、部门)。这是正确的吗?