Вставка SQLKata не работает с VARBINARYC#

Место общения программистов C#
Ответить
Anonymous
 Вставка SQLKata не работает с VARBINARY

Сообщение 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 генерируется @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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»