У меня есть блок кода, который вставляет данные в такие таблицы:
public async Task InsertRowAsync(InsertRowRequest request)
{
using var conn = _dbConnectionContext.CreateConnection(request.DbAlias);
using var db = new QueryFactory(conn, new SqlServerCompiler());
var data = new List();
for (int j = 0; j < request.ColumnNames.Length; j++)
{
data.Add(new KeyValuePair(request.ColumnNames[j], request.RowItems[j].ToString()));
}
var id = await db.Query(request.TableName).InsertGetIdAsync(data);
return id;
}
А это запрос DTO:
public class InsertRowRequest
{
public string DbAlias { get; set; }
public string TableName { get; set; }
public string[] ColumnNames { get; set; }
public object[] RowItems { get; set; }
}
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что с таблицами со столбцами типа varbinary это не удается, и я понятия не имею, есть ли способ заставить ее работать правильно.При такой настройке (сервер MSSQL):
create table SqlKataTable
(
Id INT NOT NULL,
Doc VARBINARY(MAX) NULL,
DocType NVARCHAR(255) NULL
)
Приведенный выше метод создаст сценарий sql для вставки, например этот:
exec sp_executesql N'INSERT INTO [SqlKataTable] ([Id], [Doc], [DocType]) VALUES (@p0, @p1, @p2);SELECT scope_identity() as Id'
,N'@p0 nvarchar(4000),@p1 nvarchar(max) ,@p2 nvarchar(4000)'
,@p0=N'19751',@p1=N'asdasdasd',@p2=N'pdf'
Что происходит с этим сообщением об ошибке:
Implicit conversion from data type nvarchar(max) to varbinary(max) is not allowed. Use the CONVERT function to run this query.
Проблема в том, что для столбца varbinary генерируется @p1 nvarchar(max), что приводит к сбою сервера SQL.
Есть идеи, как заставить это работать с варбинарными типами? По сути, это метод, лежащий в основе контроллера для вызова API для отдыха, поэтому входные данные поступают в виде тела json.
Позднее редактирование:
Я понял, что у меня есть недостаток дизайна. Request.RowItems[j].ToString() работает почти во всех случаях, когда я его тестировал, за исключением varbinary, для которого мне приходится кодировать строку base64, полученную из запроса, в byte[ ], но это испортит общую/динамическую добавленную ценность этого API. Если я изменю тело функции на это (только в демонстрационных целях), она будет работать:
public async Task InsertRowAsync(InsertRowRequest request)
{
using var conn = _dbConnectionContext.CreateConnection(request.DbAlias);
using var db = new QueryFactory(conn, new SqlServerCompiler());
var data = new List();
for (int j = 0; j < request.ColumnNames.Length; j++)
{
if(request.RowItems[j].ToString().Length > 150)
data.Add(new KeyValuePair(request.ColumnNames[j], Encoding.UTF8.GetBytes(request.RowItems[j].ToString())));
else
data.Add(new KeyValuePair(request.ColumnNames[j], request.RowItems[j].ToString()));
}
var id = await db.Query(request.TableName).InsertGetIdAsync(data);
return id;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -varbinary
Вставка SQLKata не работает с VARBINARY ⇐ C#
Место общения программистов C#
1720706065
Anonymous
У меня есть блок кода, который вставляет данные в такие таблицы:
public async Task InsertRowAsync(InsertRowRequest request)
{
using var conn = _dbConnectionContext.CreateConnection(request.DbAlias);
using var db = new QueryFactory(conn, new SqlServerCompiler());
var data = new List();
for (int j = 0; j < request.ColumnNames.Length; j++)
{
data.Add(new KeyValuePair(request.ColumnNames[j], request.RowItems[j].ToString()));
}
var id = await db.Query(request.TableName).InsertGetIdAsync(data);
return id;
}
А это запрос DTO:
public class InsertRowRequest
{
public string DbAlias { get; set; }
public string TableName { get; set; }
public string[] ColumnNames { get; set; }
public object[] RowItems { get; set; }
}
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что с таблицами со столбцами типа varbinary это не удается, и я понятия не имею, есть ли способ заставить ее работать правильно.При такой настройке (сервер MSSQL):
create table SqlKataTable
(
Id INT NOT NULL,
Doc VARBINARY(MAX) NULL,
DocType NVARCHAR(255) NULL
)
Приведенный выше метод создаст сценарий sql для вставки, например этот:
exec sp_executesql N'INSERT INTO [SqlKataTable] ([Id], [Doc], [DocType]) VALUES (@p0, @p1, @p2);SELECT scope_identity() as Id'
,N'@p0 nvarchar(4000),@p1 nvarchar(max) ,@p2 nvarchar(4000)'
,@p0=N'19751',@p1=N'asdasdasd',@p2=N'pdf'
Что происходит с этим сообщением об ошибке:
Implicit conversion from data type nvarchar(max) to varbinary(max) is not allowed. Use the CONVERT function to run this query.
Проблема в том, что для столбца varbinary генерируется [b]@p1 nvarchar(max)[/b], что приводит к сбою сервера SQL.
Есть идеи, как заставить это работать с варбинарными типами? По сути, это метод, лежащий в основе контроллера для вызова API для отдыха, поэтому входные данные поступают в виде тела json.
[b]Позднее редактирование:[/b]
Я понял, что у меня есть недостаток дизайна. Request.RowItems[j].ToString() работает почти во всех случаях, когда я его тестировал, за исключением varbinary, для которого мне приходится кодировать строку base64, полученную из запроса, в byte[ ], но это испортит общую/динамическую добавленную ценность этого API. Если я изменю тело функции на это (только в демонстрационных целях), она будет работать:
public async Task InsertRowAsync(InsertRowRequest request)
{
using var conn = _dbConnectionContext.CreateConnection(request.DbAlias);
using var db = new QueryFactory(conn, new SqlServerCompiler());
var data = new List();
for (int j = 0; j < request.ColumnNames.Length; j++)
{
if(request.RowItems[j].ToString().Length > 150)
data.Add(new KeyValuePair(request.ColumnNames[j], Encoding.UTF8.GetBytes(request.RowItems[j].ToString())));
else
data.Add(new KeyValuePair(request.ColumnNames[j], request.RowItems[j].ToString()));
}
var id = await db.Query(request.TableName).InsertGetIdAsync(data);
return id;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78735559/sqlkata-insert-not-working-with-varbinary[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия