C# SQL批量+;存储过程

C# SQL批量+;存储过程,c#,sql,C#,Sql,错误:给定的列映射与源或目标中的任何列都不匹配。有人知道如何解决这个问题吗?它给出的错误是因为我试图通过treinNaam获取我的TreinId,它存储在不同的表中吗?或我正在使用SQLServerManagementStudio 2008 非常感谢您的帮助 public void BatchBulkCopy(string rapport) { // Get the DataTable DataTable dtInsertRows

错误:给定的列映射与源或目标中的任何列都不匹配。有人知道如何解决这个问题吗?它给出的错误是因为我试图通过treinNaam获取我的TreinId,它存储在不同的表中吗?或我正在使用SQLServerManagementStudio 2008

非常感谢您的帮助

public void BatchBulkCopy(string rapport)
        {
            // Get the DataTable 
            DataTable dtInsertRows = TextReader(rapport);

            using (SqlBulkCopy sbc = new SqlBulkCopy(GetConnectionString(), SqlBulkCopyOptions.KeepIdentity))
            {
                sbc.DestinationTableName = "dbo.Fouten";
                sbc.BatchSize = 2000;


                sbc.ColumnMappings.Add("Datum", "Datum");
                sbc.ColumnMappings.Add("Foutcode", "FoutCode");
                sbc.ColumnMappings.Add("Omschrijving", "Omschrijving");
                sbc.ColumnMappings.Add("Module", "Module");
                sbc.ColumnMappings.Add("Time", "Time");
                sbc.ColumnMappings.Add("Teller", "Teller");
                sbc.ColumnMappings.Add("Mnemo", "Mnemo");
                sbc.ColumnMappings.Add("treinNaam", "treinNaam");

                sbc.NotifyAfter = dtInsertRows.Rows.Count;
                sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);

                sbc.WriteToServer(dtInsertRows);
                sbc.Close();
            }

        }

        void sbc_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
        {
            throw new NotImplementedException();
        }
数据表提交人:

dt.Rows.Add(new object[] { datum, foutcode, omschrijving, test[test.Length - 1],tijd,teller,absentOfPresent,TreinNaam });
return dt;
SQL存储过程:

USE [Events]
GO
/****** Object:  StoredProcedure [dbo].[sp_BatchInsert]    Script Date: 03/15/2016 09:13:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_BatchInsert] (@Datum date, @Foutcode varchar(8), @Omschrijving varchar(50), @Module varchar(20), @Time time(3), @Teller int, @Mnemo varchar(9), @treinNaam int)
AS
BEGIN
            INSERT INTO dbo.Fouten VALUES (@Datum,@Foutcode,@Omschrijving,@Module,@Time,@Teller,@Mnemo,(SELECT TreinId from [Events].[dbo].[Treinen] WHERE Name = @treinNaam));
END 
数据库设计:


从DBMS的角度来看,TreinNaam在此上下文中不存在。它必须是一列可用的字体

您有两种选择:

  • 提前找到所有treinId并用treinId替换treinNaam
  • 创建临时表并转储数据,然后编写存储过程,该过程将负责将数据移动到Fouten中,并查找所有必需的连接

  • 使用标记dbms。(该存储过程代码看起来不像ANSI SQL…
    sbc.ColumnMappings.Add(“treinNaam”、“treinId”)似乎就是它!谢谢