Member 14120682 Ответов: 3

в <предварительно&ГТ;соответствия не существует от системы типа объекта.типа int32[] в известном управляемом поставщика собственного типа.&ЛТ;/пре&ГТ;


No mapping exists from object type System.Int32[] to a known managed provider native type.


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

SqlConnection conn = new SqlConnection("Data Source=EME-01-LAP17\\SQLEXPRESS;Initial Catalog=my_sql;Integrated Security=True");
           SqlDataAdapter ada = new SqlDataAdapter();
           SqlCommand cmd = new SqlCommand("INSERT INTO Table_1 VALUES(@Diagnostic_Data)", conn);
           cmd.Parameters.AddWithValue("@Diagnostic_Data", diagnostic_data);
           conn.Open();
           cmd.ExecuteNonQuery();
           conn.Close();

3 Ответов

Рейтинг:
1

OriginalGriff

Это именно то, что говорит Ошибка:

No mapping exists from object type System.Int32[] to a known managed provider native type.
Вы передаете массив целых чисел - diagnostic_data - к вашему SQL-запросу для вставки в вашу таблицу, но SQL не поддерживает массивы.

Я понятия не имею, как выглядит ваша БД, что именно вы ожидаете хранить или даже в какой столбец должны быть вставлены ваши данные: но вы не можете передать SQL массив целых чисел.

Начните с вопроса "Является ли массив целых чисел тем, что вы хотели передать?", затем проверьте тип столбца и решите, что вы должны хранить в нем.

И сделай себе одолжение: никогда не делай этого.
INSERT INTO MyTable VALUES (...
Всегда перечисляйте столбцы, которые вы ожидаете вставить, по порядку - это делает ваше приложение более устойчивым при изменении базы данных:
INSERT INTO MyTable (MyColumn1, MyCOlumn2, ... ) VALUES (...


Jon McKee

+5 Отличный совет с явными столбцами!

Рейтинг:
1

TheRealSteveJudge

Вы пытаетесь вставить целочисленный массив в поле базы данных int.
Вы должны выполнить цикл через свой массив и вставить каждое отдельное целочисленное значение.


Рейтинг:
0

Jon McKee

Давайте разберем ошибку:

No mapping

Таким образом, мы имеем дело с некоторым преобразованием между ценностями.
System.Int32[]

Таким образом, исходные данные имеют тип int32[] что бы это было diagnostic_data учитывая ваш код.
known managed provider native type.

Тип, о котором знает используемый вами адаптер SQL (поставщик) для базы данных. Например, он не знает типа базы данных, который он может использовать в этой ситуации.

Итак, собирая все это вместе: int32[] не имеет собственного типа базы данных, в который он может быть преобразован. Это имеет полный смысл. Когда вы используете AddWithValue, вы создаете Объект sqlparameter[^]. - SqlParameter обрабатывается как одно литеральное значение по соображениям безопасности (sql-инъекция). Поскольку массив целых чисел не имеет очевидного одиночный буквальное значение, которое он может преобразовать в, вы получите ошибку.

Так как же это исправить? Мне скорее нравится это решение[^] найдено прямо здесь, на CodeProject. Вы также можете вручную построить массив SqlParameters, что-то вроде:
SqlCommand cmd = new SqlCommand("INSERT INTO Table_1 VALUES(@value0, @value1)"); /*add however many values you need*/
List<SqlParameter> commands = new List<SqlParameter> {
    new SqlParameter("@value0", diagnostic_data[0]),
    new SqlParameter("@value1", diagnostic_data[1])
    //etc..
};
cmd.Parameters.AddRange(commands);

Однако, насколько мне известно, нет никакого способа сделать это с одним параметром из-за того, как параметры обрабатываются для обеспечения безопасности.