Вставка строк с использованием списка SqlDatRecord Результат Ошибка внешнего ключа в базе данных - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь вставить Список записей в базу данных, используя технику #SqlDataRecord с #MetaData. Я обнаружил проблему с ограничениями внешнего ключа, пока все работает нормально:

Первый. Как вы знаете, мы создаем пользовательский тип в sql:

USE [db_Visitors]
GO

/****** Object:  UserDefinedTableType [dbo].[type_PathType]    Script Date: 9/7/2018 10:14:29 AM ******/
DROP TYPE [dbo].[type_PathType]
GO

/****** Object:  UserDefinedTableType [dbo].[type_PathType]    Script Date: 9/7/2018 10:14:29 AM ******/
CREATE TYPE [dbo].[type_PathType] AS TABLE(
    [GateID] [int] NULL,
    [VisitRequestID] [int] NULL,
    [VisitorID] [int] NULL,
    [Confirmation] [bit] NULL,
    [Finished] [bit] NULL
)
GO

ВТОРОЙ: создаем хранимую процедуру:

USE [db_Visitors]
GO
/****** Object:  StoredProcedure [dbo].[AddTypePathList]    Script Date: 9/7/2018 9:16:18 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[AddTypePathList]




    @TBL_PathType type_PathType READONLY
    AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO TBL_Path 
    (GateID , VisitRequestID , VisitorID , Confirmation , Finished)
    SELECT 
     pat.GateID , 
     pat.VisitRequestID ,
      pat.VisitorID , 
      pat.Confirmation , 
      pat.Finished FROM @TBL_PathType pat
END

THIRD :: Внутренний доступ к данным: создание списка SqlDataRecords:

   private List<SqlDataRecord> SqlList_TypePath(List<TypePath> PathTypeList)
       {
           List<SqlDataRecord> SqlDataRecordList = new List<SqlDataRecord>();
           SqlMetaData[] metadata = new SqlMetaData[5];
           metadata[0] = new SqlMetaData("GateID", SqlDbType.Int);
           metadata[1] = new SqlMetaData("VisitRequestID", SqlDbType.Int);
           metadata[2] = new SqlMetaData("VisitorID", SqlDbType.Int);
           metadata[3] = new SqlMetaData("Confirmation", SqlDbType.Bit);
           metadata[4] = new SqlMetaData("Finished", SqlDbType.Bit);
           foreach (TypePath path in PathTypeList)
           {
               SqlDataRecord record = new SqlDataRecord(metadata);
               TypePath pathType = new TypePath();
               record.SetInt32(0, pathType.GateID);
               record.SetInt32(1, pathType.VisitRequestID);
               record.SetInt32(2, pathType.VisitorID);
               record.SetBoolean(3, pathType.Confirmation);
               record.SetBoolean(4, pathType.Finished);
               SqlDataRecordList.Add(record);
           }
           return SqlDataRecordList;
       }

ЧЕТВЕРТЫЙ: Соединение - Команда - Параметры - Выполнения:

 private void _Command_AddTypePath(List<TypePath> PathTypeList)
       {
           string procedureName = "AddTypePathList";
           string ConnectionString = ConfigurationManager.ConnectionStrings["VisitorConnectionString"].ConnectionString;
           SqlConnection connection = new SqlConnection(ConnectionString);
           SqlCommand command = new SqlCommand(procedureName, connection);
           command.CommandType = CommandType.StoredProcedure;
           if (connection.State != ConnectionState.Open)
           {
               connection.Close();
               connection.Open();
           }
           var parameter = new SqlParameter("@TBL_PathType", SqlDbType.Structured);
           parameter.TypeName = "type_PathType";
           parameter.Value = List_TypePath(PathTypeList);
           command.Parameters.Add(parameter);
           command.ExecuteNonQuery();
       }

Я проверил записи в списке sql, все они существуют. Я проверил ID внешних ключей, все они существовали в таблице ** НО ЭТО ПРОДОЛЖАЕТ ИНОСТРАННЫЙ КЛЮЧ Проблема **

FIFTH: таблица: TBL_Path содержит:

[PathID]
      ,[VisitRequestID] : Primary
      ,[GateID] : Foreign
      ,[DateOfEntrance]
      ,[DateOfLeave]
      ,[Finished]
      ,[CardID] : Foreign
      ,[VisitorID] : Foreign
      ,[Confirmation]
      ,[Remarks]
  FROM [dbo].[TBL_Path]

ЗАКЛЮЧИТЕЛЬНО: Я сбросил ограничения внешних ключей. строки вставляются, но со значениями по умолчанию, а не с реальными значениями. чем проблема внутри кода C #. Я приложил снимок экрана, чтобы вы могли видеть, что список заполнен прямо enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...