C# 将DataTable插入/更新到SQL Server错误:提供的列名称或值数与表定义不匹配

C# 将DataTable插入/更新到SQL Server错误:提供的列名称或值数与表定义不匹配,c#,sql-server,C#,Sql Server,我尝试了以下解决方案,尝试将数据表插入/更新到sql server中,但出现了一些问题 我创建了一个表:People 创建表[dbo].[People]( [ID][varchar](10)不为空, [Name][varchar](50)空, [Email][varchar](50)空, [Country][varchar](50)空 )在[小学] 创建用户定义的表类型:PeopleType 将类型[dbo].[PeopleType]创建为表( [ID][varchar](10)不为空, [N

我尝试了以下解决方案,尝试将数据表插入/更新到sql server中,但出现了一些问题

  • 我创建了一个表:People
  • 创建表[dbo].[People](
    [ID][varchar](10)不为空,
    [Name][varchar](50)空,
    [Email][varchar](50)空,
    [Country][varchar](50)空
    )在[小学]
    
  • 创建用户定义的表类型:PeopleType
  • 将类型[dbo].[PeopleType]创建为表(
    [ID][varchar](10)不为空,
    [Name][varchar](50)空,
    [电邮][varchar](50)空
    )
    
  • 我尝试使用这种表类型创建一个过程:更新人
  • CREATE PROCEDURE[dbo].[Update\u People]
    @tblpeople PeopleType只读
    作为
    开始
    不计数;
    融入人群
    使用@tblpeople p2
    在p1.ID=p2.ID上
    当匹配时
    更新集p1.Name=p2.Name
    ,p1.Email=p2.Email
    当不匹配时
    插入值(p2.ID、p2.Name、p2.Email);
    结束
    
    但是,当我尝试使用用户定义的表类型创建过程时,发生了一个SQL server错误

    “提供的值的列名或数目与表定义不匹配。”


    我做错了什么或遗漏了什么吗?

    如果您不想添加国家/地区,请将您的
    Insert
    语句更改为:

    INSERT INTO People(Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);
    
    收到错误的原因是,您没有指定要使用
    Insert
    语句的列,因为表中定义了4。但你只提供3个

    另一个选项是将Country属性添加到用户定义的类型,并使用以下步骤添加Country:

    CREATE TYPE [dbo].[PeopleType] AS TABLE(
      [ID] [varchar](10) NOT NULL,
      [Name][varchar](50) NULL,
      [Email][varchar](50) NULL,
      [Country][varchar](50) NULL
    )
    
    INSERT VALUES(p2.ID, p2.Name, p2.Email, p2.Country);
    
    编辑:我不确定语法,因为我已经有一段时间没有使用它了,但可能您只需要提供如下列名:

    INSERT (Id, Email, Name) VALUES(p2.ID, p2.Name, p2.Email);
    

    插入值(p2.ID、p2.Name、p2.Email)国家在哪里?我只想在人员表中插入ID、姓名、电子邮件,而不是所有列。因此,我只将ID、名称、电子邮件定义为用户定义的表类型。请尝试
    插入值(p2.ID、p2.Name、p2.Email,默认值)
    没问题,很乐意提供帮助