Member 14120682 Ответов: 2

Сопоставление типа объекта system.int32[] с известным собственным типом управляемого поставщика не существует.


cmd = new SqlCommand("INSERT INTO Table_2 VALUES (@Diagnostic_Data,@Error_Codes,@Input_Output,@Shift_Inhibits) ", conn);
                   
  cmd.Parameters.Clear();
  cmd.Parameters.AddWithValue("@Diagnostic_Data", display_diagnostic_data);
  cmd.Parameters.AddWithValue("@Error_Codes", Error_Codes);
  cmd.Parameters.AddWithValue("@Input_Output", Input_Output);
   cmd.Parameters.AddWithValue("@Shift_Inhibits", Shift_Inhibits);
      conn.Open();
      cmd.ExecuteNonQuery();//error
       conn.Close();


Что я уже пробовал:

cmd = new SqlCommand("INSERT INTO Table_2 VALUES (@Diagnostic_Data,@Error_Codes,@Input_Output,@Shift_Inhibits) ", conn);
                   
  cmd.Parameters.Clear();
  cmd.Parameters.AddWithValue("@Diagnostic_Data", display_diagnostic_data);
  cmd.Parameters.AddWithValue("@Error_Codes", Error_Codes);
  cmd.Parameters.AddWithValue("@Input_Output", Input_Output);
   cmd.Parameters.AddWithValue("@Shift_Inhibits", Shift_Inhibits);
      conn.Open();
      cmd.ExecuteNonQuery();//error
       conn.Close();

F-ES Sitecore

Одним из ваших значений param будет массив int, который вы не можете установить в качестве параметра SQL, так как SQL не имеет подходящего типа для использования. Решение зависит от того, как вы хотите обрабатывать параметр массива, который мы не знаем. Возможно, вам нужно превратить его в строку типа "1,2,3,4" или вызвать SP один раз для каждого элемента в массиве.

2 Ответов

Рейтинг:
2

MadMyche

Не зная, какова структура вашей таблицы и какие данные вы передаете... это действительно трудно, чтобы помочь вам.
И не только это; в то время как код находится в C#, фактическая проблема, с которой вы сталкиваетесь, находится в SQL. И опять же вы не указали какой именно SQL вы на самом деле используете

Поэтому я собираюсь ответить на этот вопрос, основываясь на:
1. OriginalGriff корректен, так как Error_Codes является массивом.
2. Вы используете версию (мс) для SQL Server, выпущенные за последние 5 лет.

Если бы это было моей задачей, я бы так и сделал.
_ Создать хранимая процедура на SQL сервере для этого нужно сделать следующее
_ Передайте значение массива хранимой процедуре в виде строки, разделенной запятыми

Хранимая процедура будет использовать String_Split функция и возвращает таблицу с одной строкой на каждое очерченное значение.

CREATE PROCEDURE dbo.Table2_Insert (
   @Diagnostic_Data NVARCHAR(100),
   @Error_Codes     NVARCHAR(100),
   @Input_Output    NVARCHAR(100),
   @Shift_Inhibits  NVARCHAR(100)
) AS
BEGIN
   INSERT into Table_2
   SELECT @Diagnostic_Data
        , value
        , @Input_Output
        , @Shift_Inhibits
   FROM String_Split('@Error_Codes', ',');
END
GO

В вашем коде C# изменения будут минимальными
_ Измените текст команды SQL
_ Установите команду SQL CommandType
_ Преобразовать Error_Codes массив в очерченную строку

cmd = new SqlCommand("Table2_Insert", conn);

cmd.CommandType = CommandType.StoredProcedure;
                   
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@Diagnostic_Data", display_diagnostic_data);
cmd.Parameters.AddWithValue("@Error_Codes", String.Join(",", Error_Codes));
cmd.Parameters.AddWithValue("@Input_Output", Input_Output);
cmd.Parameters.AddWithValue("@Shift_Inhibits", Shift_Inhibits);

conn.Open();
   int RowsAffected = cmd.ExecuteNonQuery();
/* NOTE
   RowsAffected will tell you how many rows were added.
   You could compare this to your arrays.length value
*/
conn.Close();
Рекомендации:
МС документы для SQL Split_String()[^]
MS DOCS: строка C#.Присоединяйтесь()[^]


Рейтинг:
1

OriginalGriff

Вы не можете передать массив целых чисел в качестве объекта SQL - SQL не имеет понятия о массивах, поэтому он не знает, что с ними делать. Единственный тип массива, который вы можете отправить напрямую, - это a byte[] в ВАРБИНАРНОЕ или подобное поле.

Мы понятия не имеем, какой из этих параметров является массивом целых чисел - хотя я бы заподозрил Error_Codes, - но есть вероятность, что вам придется либо отправить каждое значение отдельно в новую строку, либо изменить свою БД и отправить их в виде байтов строки (хотя последнее, как правило, плохая идея).

Кроме того, вы всегда должны перечислять столбцы, в которые вы хотите вставить:

INSERT INTO Table_2 (DiagData, ErrCodes, InOut, ShiftInhibits) VALUES (@Diagnostic_Data,@Error_Codes,@Input_Output,@Shift_Inhibits)
Если вы этого не сделаете, то SQL начнет с текущего столбца "самый левый" и попытается вставить данные последовательно. Если вы начинаете таблицу с строки идентификатора - а так и должно быть, - то SQL сначала попытается записать ее в этот столбец, и таким образом вы можете получить несколько неприятных ошибок.