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 шт):
В 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?