Имя столбца DataTable с двойными кавычками в имени столбца и создание столбца SQL без него

#c# #datatable

#c# #datatable

Вопрос:

Я пытаюсь разрешить пользователю вводить столбец (ячейку B2) в файле Excel как «GameLength», а затем удалять двойные кавычки в начале и в конце, чтобы затем сгенерировать столбец для базы данных как GameLength

введите описание изображения здесь

Я могу обновить столбец до длины игры без каких-либо проблем.

 CREATE TABLE [dbo].[123](
      [PTIKeyId] [integer] IDENTITY(1,1) NOT NULL,

      [Game Number] [int] NULL,
      [Game Length] [int] NULL
CONSTRAINT [PK_123] PRIMARY KEY CLUSTERED
(
      [PTIKeyId] ASC
) ON [PRIMARY])
 

Когда я добираюсь до кода для циклирования строк с данными, я вижу эту ошибку:

 Column '"Game Length"' does not belong to table .
 

Вот строка кода, в которой происходит сбой:

введите описание изображения здесь

Похоже, что мой текст элемента правильный, но, возможно, таблица данных не может его обработать?

Какие у меня варианты?

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

Кажется, я не могу понять, почему он не может найти «длину игры» в таблице данных?

Вот цикл foreach для циклического перебора строк таблицы данных:

Исходные поля — это столбцы из таблицы данных

             foreach (DataRow row in dataTableResults.Rows)
            {
                sbInsert.Clear();

                // create start insert statement with the proper columns that will be used.
                sbInsert.AppendFormat(CultureInfo.CurrentCulture, "INSERT INTO [{0}].[{1}]", schemaName, tableName).AppendLine();
                sbInsert.Append("(");
                foreach (var item in destinationFields.Where(w => w != PrimaryKeyId))
                {
                    sbInsert.AppendFormat(CultureInfo.CurrentCulture, "[{0}], ", item);
                }

                // set to - 2 because we are adding ', ' (comma then a space for readability)
                sbInsert.Remove(sbInsert.Length - 2, 1);

                // Now create the actual values
                sbInsert.Append(")").AppendLine();
                sbInsert.Append("VALUES").AppendLine();
                sbInsert.Append("(");

                foreach (var item in sourceFields)
                {
                    var cellValue = row[item];
                    var dataMappingRecord = dataMappings.Where(w => w.SourceFieldName == item).FirstOrDefault();

                    sbInsert.AppendFormat(CultureInfo.CurrentCulture, "{0}", GetCellValue(dataMappingRecord, cellValue, dataTypes));
                }

                // set to - 2 because we are adding ', ' (comma then a space for readability)
                sbInsert.Remove(sbInsert.Length - 2, 1);
                sbInsert.Append(");");
            }
 

Как я заполняю исходные поля:

         private async Task<IList<DataMappingDTO>> GenerateCreateNewTableDataMappings(Workbook workbook, FileDetailDTO fileDetail)
        {
            var sourceFields = await GetSourceFields(workbook, fileDetail, false).ConfigureAwait(false);

            foreach (var item in sourceFields)
            {
                // add code to remove any double quotes in the column name for the destination file
                string destinationFieldUpdated = item.ColumnName.Replace(""", string.Empty);

                if (fileDetail.DataMappings.Any(a => a.SourceFieldName.ToLower(CultureInfo.CurrentCulture) == item.ColumnName.ToLower(CultureInfo.CurrentCulture)) == false)
                {
                    var mapping = new DataMappingDTO
                    {
                        Index = item.ColumnIndex,
                        ImportDetailId = fileDetail.ImportDetailId,
                        ImportData = true,
                        SourceFieldName = item.ColumnName,
                        DestinationFieldName = destinationFieldUpdated,
                        DataType = item.DataType,
                        Precision = item.Precision ?? null,
                        ColumnLength = item.DataType == GetDataTypeList().Where(w => w.ImporterDataTypes == ImporterDataTypes.StringDT).Select(s => s.Id).FirstOrDefault() ? 255 : (int?)null,
                        Format = GetFormatTypeFromSourceField(item)
                    };

                    mapping.UpdateModifiedInfo(UserRequestingId);
                    fileDetail.DataMappings.Add(mapping);
                }
            }

            return fileDetail.DataMappings;
        }
 

Комментарии:

1. Как вы заполняете коллекцию soucefields? Кроме того , вы заметили , что внутри есть пробел Game Length ? Ожидается ли это?

2. @ChetanRanpariya Я добавил код для исходных полей. Теперь я вижу пробел! Однако я не вижу его в файле! Позвольте мне еще раз проверить код и выполнить отладку.

3. @ChetanRanpariya: Я опубликовал свой ответ! Спасибо!

Ответ №1:

Спасибо @ChetanRanpariya

В начале был пробел:

введите описание изображения здесь

Я перешел к документу Excel и полностью удалил все в B2. Затем я вернулся и вставил

 "Game Length"
 

и все заработало!!!

Еще раз спасибо.