ODBC c# как исправить ошибку 07S01

Имеется база данных.

IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'test')
BEGIN
    CREATE DATABASE [DTElevator]
END

use test;

create table [Organization]
(
    [organization_id] bigint primary key identity,
    [organization_name] varchar(50) not null,
)

create table [User]
(
    [user_id] bigint primary key identity,
    [user_name] varchar(20) not null,
    [user_surname] varchar (30) not null,
    [user_phone] varchar(12) not null,
    [user_avatar] image,
    [organization_id] bigint foreign key([organization_id])
    references [Organization]([organization_id]) not null,
)

Пытаюсь вставить данные в таблицу User.

public async Task CreateUser(User user)
{
    using (var connection = new OdbcConnection(_connectionString))
    {
        await connection.OpenAsync();
        using (var executeCommand = new OdbcCommand($"INSERT INTO [User] " +
            $"([user_name], [user_surname], [user_phone], [user_avatar], [organization_id]) " +
            //$"Values(?, ?, ?, ?, ?)", connection))
            //$"Values(?, ?, ?, ?, ?)", connection))
            $"Values('{user.Name}','{user.Surname}','{user.Phone}',?,{user.OrganizationId})", connection))
        {
            //executeCommand.Parameters.Add("@user_name", OdbcType.VarChar, 20).Value = user.Name;
            //executeCommand.Parameters.Add("@user_surname", OdbcType.VarChar, 30).Value = user.Surname;
            //executeCommand.Parameters.Add("@user_phone", OdbcType.VarChar, 12).Value = user.Phone;
            executeCommand.Parameters.Add("@user_avatar", OdbcType.Image).Value = user.Avatar;
            //executeCommand.Parameters.Add("@organization_id", OdbcType.BigInt).Value = user.OrganizationId;

            await executeCommand.ExecuteNonQueryAsync();
        }
    }
}

Получаю ошибки типа:

ERROR [07S01] [Microsoft][ODBC Driver 17 for SQL Server]Недопустимое использование стандартного параметра

При использовании ?

Необходимо объявить скалярную переменную "@name".

При использовании @param

Как решить данную проблему?


Ответы (1 шт):

Автор решения: Alexander Petrov

В ODBC нет именованных параметров. Нужно использовать позиционные параметры. Они задаются знаком вопроса. Binding Parameters ODBC.

Ваш код в принципе правильный. Я его почистил немного. Должно работать.

public async Task CreateUser(User user)
{
    string sql =
        "INSERT INTO [User] " +
        "([user_name], [user_surname], [user_phone], [user_avatar], [organization_id]) " +
        "Values (?, ?, ?, ?, ?)";

    using (var connection = new OdbcConnection(_connectionString))
    {
        await connection.OpenAsync();

        using (var command = new OdbcCommand(sql, connection))
        {
            command.Parameters.Add("@user_name", OdbcType.VarChar, 20).Value = user.Name;
            command.Parameters.Add("@user_surname", OdbcType.VarChar, 30).Value = user.Surname;
            command.Parameters.Add("@user_phone", OdbcType.VarChar, 12).Value = user.Phone;
            command.Parameters.Add("@user_avatar", OdbcType.Image).Value = user.Avatar;
            command.Parameters.Add("@organization_id", OdbcType.BigInt).Value = user.OrganizationId;

            await command.ExecuteNonQueryAsync();
        }
    }
}

Что важно: в sql-запросе перечислены пять колонок, соответственно должны быть пять маркеров параметров ?.

Параметры в OdbcCommand должны добавляться в том же порядке, в каком они указаны в запросе.


На что ещё нужно обратить внимание. Тип данных image в ДБ имеет отображение на тип данных byte[] (массив байтов) в C#. Какой тип у user.Avatar?

→ Ссылка