Как массово вставить строки с некоторыми столбцами типа XML в базу данных?

2

Я пытаюсь массово вставить строки в базу данных. Некоторые из столбцов этой таблицы имеют тип XML, и там, где я сталкиваюсь с некоторыми проблемами.

Я пытался использовать SqlBulkCopy для достижения этой цели, но продолжал получать ошибку, что XElement не может быть преобразован в строку, хотя я никогда не выполняю приведение типов.

Это мой дизайн стола:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TasksQueue]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Type] [int] NOT NULL,
    [ProcessData] [xml] NOT NULL,
    [MetaData] [xml] NULL,
    [SubmittedBy] [int] NULL,
    [Status] [int] NOT NULL,
    [ResultData] [xml] NULL,
    [SubmittedDate] [datetime] NULL,
    [ProcessedDate] [datetime] NULL,
    [ProcessingTime] [varchar](28) NULL,
    [DistrictID] [int] NULL,
    [Name] [nvarchar](128) NULL,
 CONSTRAINT [PK_TasksQueue] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Мой код в С#:

public static void CreateBulkTasks(List<Task> BulkTasks)
{
        string connectionString = ConfigurationManager.AppSettings[AppSettingsKeys.QwizdomOnlineDBConnectionString];
        _obj = new object();

        lock (_obj)
        {
            DataTable tableMember = new DataTable();
            DataTable tableLicense = new DataTable();

            var x = BulkTasks[0].MetaData;

            tableMember.Columns.Add("Type", typeof(Int32));
            tableMember.Columns.Add("ProcessData", typeof(XElement));
            tableMember.Columns.Add("MetaData", typeof(XElement));
            tableMember.Columns.Add("SubmittedBy", typeof(Int32));
            tableMember.Columns.Add("Status", typeof(Int32));
            tableMember.Columns.Add("ResultData", typeof(XElement));
            tableMember.Columns.Add("SubmittedDate", typeof(DateTime));
            tableMember.Columns.Add("ProcessedDate", typeof(DateTime));
            tableMember.Columns.Add("ProcessingTime", typeof(string));
            tableMember.Columns.Add("DistrictID", typeof(Int32));
            tableMember.Columns.Add("Name", typeof(string));

            foreach (var task in BulkTasks)
            {
                tableMember.Rows.Add(
                    task.Type,
                    task.ProcessData,
                    task.MetaData,
                    task.SubmittedBy,
                    task.Status,
                    task.ResultData,
                    task.SubmittedDate,
                    task.ProcessedDate,
                    task.ProcessingTime,
                    task.DistrictID,
                    task.Name
                );
            }

            using (System.Data.SqlClient.SqlBulkCopy bulkCopyGroupMembers = new System.Data.SqlClient.SqlBulkCopy(connectionString))
            {
                bulkCopyGroupMembers.DestinationTableName = "[TasksQueue]";
                bulkCopyGroupMembers.ColumnMappings.Add("Type", "Type");
                bulkCopyGroupMembers.ColumnMappings.Add("ProcessData", "ProcessData");
                bulkCopyGroupMembers.ColumnMappings.Add("MetaData", "MetaData");
                bulkCopyGroupMembers.ColumnMappings.Add("SubmittedBy", "SubmittedBy");
                bulkCopyGroupMembers.ColumnMappings.Add("Status", "Status");
                bulkCopyGroupMembers.ColumnMappings.Add("ResultData", "ResultData");
                bulkCopyGroupMembers.ColumnMappings.Add("SubmittedDate", "SubmittedDate");
                bulkCopyGroupMembers.ColumnMappings.Add("ProcessedDate", "ProcessedDate");
                bulkCopyGroupMembers.ColumnMappings.Add("ProcessingTime", "ProcessingTime");
                bulkCopyGroupMembers.ColumnMappings.Add("DistrictID", "DistrictID");
                bulkCopyGroupMembers.ColumnMappings.Add("Name", "Name");
                bulkCopyGroupMembers.WriteToServer(tableMember);
    }
}

public class Task
{
    public int? ID { get; set; }
    public TasksQueueType Type { get; set; }
    public XElement ProcessData { get; set; }
    public XElement MetaData { get; set; }
    public int? SubmittedBy { get; set; }
    public string SubmittedByName { get; set; }
    public TasksQueueItemStatus Status { get; set; }
    public XElement ResultData { get; set; }
    public int? DistrictID { get; set; }
    public DateTime SubmittedDate { get; set; }
    public DateTime? ProcessedDate { get; set; }
    public TimeSpan? ProcessingTime { get; set; }
    public bool? HighPriority { get; set; }
    public string Name { get; set; }
}

Я ожидаю, что объемные данные будут вставлены в таблицу за один раз. Вместо этого я получаю эту ошибку:

Исключение типа "System.InvalidCastException" возникло в System.Data.dll, но не было обработано в коде пользователя

Дополнительная информация: Невозможно привести объект типа "System.Xml.Linq.XElement" к типу "System.String".

Теги:
asp.net-mvc
ssms

1 ответ

0

Я думаю, что вы должны использовать XmlDocument вместо XElement в вашем коде. Тип данных для ProcessData, MetaData и ResultData должен быть XmlDocument.

  • 0
    @ JustLearning это сработало для тебя?
  • 0
    лол нет, я только что отредактировал ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню