Интерполировать аргументы SQLParameter [] с «exec {stordEdprocedure}» динамически [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Интерполировать аргументы SQLParameter [] с «exec {stordEdprocedure}» динамически [закрыто]

Сообщение Anonymous »

Я использую .net 9 для этого проекта Blazor Web App, я пытаюсь достичь, так это написать динамическую обработку SQLParameter [] аргументы и интерполировать ее с помощью «exec {storedProcedure}» без указания индекса для параметра и значения, используя эту ссылку:
public static FormattableString FromSqlSQLParamStatic(string storedProcedure, string[] paramName, params object?[] parameters)
{
if (paramName.Length != parameters.Length)
{
throw new ArgumentException("Parameters count mismatch.");
}

SqlParameter[] sqlParameterparam =
[
new SqlParameter(paramName[0], parameters[0] ?? DBNull.Value),
new SqlParameter(paramName[1], parameters[1] ?? DBNull.Value),
new SqlParameter(paramName[2], parameters[2] ?? DBNull.Value),
];
return $"EXEC {storedProcedure} {sqlParameterparam[0]}, {sqlParameterparam[1]}, {sqlParameterparam[2]}";
}
< /code>
Приведенный выше метод работает, но мне нужно вручную указать имя и значение индекса PERATER в манере < /em>.

Код: Выделить всё

public static FormattableString FromSqlSQLParamDynamic(string storedProcedure, string[] paramName, params object?[] parameters)
{
if (paramName.Length != parameters.Length)
{
throw new ArgumentException("Parameters count mismatch.");
}

SqlParameter[] sqlParameterparam = [.. paramName.Select((name, i) =>
new SqlParameter(name, parameters[i] ?? DBNull.Value)
)];

FormattableString sqlQuery = $"EXEC {storedProcedure} {string.Join(", ", sqlParameterparam.Select(p => p))}"; // EXEC myStoredProcedure id, random_text, key

return sqlQuery;
}
Чтобы добавить больше краткости к этому сценарию, это рабочая структура динамического SQLParameter [] экземпляр:

Код: Выделить всё

SqlParameter[] sqlParameterparam = [.. paramName.Select((name, i) =>
new SqlParameter(name, parameters[i] ?? DBNull.Value)
)];
< /code>
Но, к сожалению, я не могу интерполировать его с "exec {stordedProcedure}" < /code> динамически. < /p>

Однако заменив: < /p>
 < /p>
 p))}";
< /code>
С этой строкой кода вместо этого работает нормально на моем конце: < /p>
FormattableString sqlQuery = $"EXEC {storedProcedure} {sqlParameterparam[0]}, {sqlParameterparam[1]}, {sqlParameterparam[2]}";
< /code>
Но опять же, мне нужно сделать sqlparameterparam < /code> интерполированным с «exec {storedprocedure}" < /code> динамическим образом (т.е. без указания каждого индекса peremer name и value).  GetRandtextsfromsqlroasync 
метод в sqlserverhelper class:
using Microsoft.EntityFrameworkCore;
using MyProject.Models.SQLServer;
using MyProject.Data.SQLServer;

class SQLServerHelper(SQLServerContext context)
{
private readonly SQLServerContext _context = context;

public async Task GetRandTextsFromSqlROAsync(string storedProcedure, params object?[] parameters)
{
string[] paramNames = ["id", "random_text", "key"];

if (parameters.Length != paramNames.Length)
{
throw new ArgumentException("Parameters count mismatch.");
}

var sqlParam = SQLDbSettings.FromSqlSQLParamDynamic(storedProcedure, paramNames, parameters);

return await _context.RandText
.FromSql(sqlParam)
.AsNoTracking()
.ToListAsync();
}

}
< /code>

и вот как я называю getrandtextsfromsqlroasync < /code> Метод: < /p>
@page "/sql_server/crud/randtext"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using MyProject.Models.SQLServer
@using MyProject.Data.SQLServer
@implements IAsyncDisposable
@inject IDbContextFactory DbFactory

@code {
private SQLServerContext context = default!;
private List randText = new();

protected override async Task OnInitializedAsync()
{
context = DbFactory.CreateDbContext();
var sQLServerHelper = new SQLServerHelper(context);
randText = await sQLServerHelper.GetRandTextsFromSqlROAsync("myStoredProcedure", null, null, "SEE_RECORDS");
}

public async ValueTask DisposeAsync()
{
await context.DisposeAsync();
}
}
< /code>
Использование текущего состояния создает эту ошибку. /> microsoft.data.sqlclient.sqlcommand+< >C.B__211_0(task
Result) < /p>
< /blockquote>
также обратите внимание, что я использую SQL Server для этого случая. < /P>
PrettyPrint-Override ">CREATE PROCEDURE myStoredProcedure
-- Add the parameters for the stored procedure here
@id INT,
@random_text VARCHAR(50),
@key VARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
DECLARE @successful VARCHAR(20) = 'SUCCESSFUL';

IF @key = 'SEE_RECORDS'
BEGIN

SELECT
RandText.id
,RandText.random_text
,RandText.dt_stamp
--,disable
FROM
myDB.dbo.myTable AS RandText
WHERE RandText.disable = 0
ORDER BY RandText.dt_stamp DESC

END

ELSE IF @key = 'SEE_DETAILS'
BEGIN

SELECT
RandText.id
,RandText.random_text
,RandText.modifier
,RandText.dt_stamp
--,disable
FROM
myDB.dbo.myTable AS RandText
WHERE
RandText.id = @id

END

ELSE IF @key = 'DELETE_UPDATE'
BEGIN

UPDATE myDB.dbo.myTable
SET disable = 1
WHERE id = @id

IF @@ROWCOUNT > 0
BEGIN

SELECT @successful AS SP_OUTPUT

END

END

ELSE
BEGIN

SELECT CONCAT('@key parameter value: ', '''', @key, '''', ' cannot be found.') SP_OUTPUT

END
END
< /code>

Для тех, кто путает с моей задачей, ознакомьтесь с этими ссылками: < /p>

(SQL-запросы) Передача параметров, которые я буду цитировать: < /li>
< /ul>


"langire =" langride = "raTride =" langrIde = "rAtride ="var user = new SqlParameter("user", "johndoe");

var blogs = await context.Blogs
.FromSql($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
.ToListAsync();
< /code>
примечание < /h4>
Параметры, которые вы передаете, должны точно соответствовать определению сохраненной процедуры
. Обратите особое внимание на упорядочение параметров,
, чтобы не пропустить и не упустить ни одного из них - или рассмотрите возможность использования
именованных параметров. Кроме того, убедитесь, что типы параметров
соответствуют, и что их аспекты (размер, точность, масштаб) установлены как
need.
< /blockquote>

веб -приложение Blazor с использованием .NET 9: SQLDBSETTINGS PAMITICE < /li>
< /ul>
reaized!>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -dynamical
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Интерполировать аргументы SQLParameter [] с «exec {stordEdprocedure}» динамически [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Интерполировать аргументы SQLParameter [] с «exec {stordEdprocedure}» динамически [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Blazor Web App: Интерполирует аргументы sqlParameter [] с «exec {storedProcedure}» динамически [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Php exec внутри exec/вложенный exec
    Anonymous » » в форуме Php
    0 Ответы
    64 Просмотры
    Последнее сообщение Anonymous
  • Exec /usr/java/openjdk-20/bin/java: ошибка формата exec при запуске образа Docker AWS ECS Fargate
    Anonymous » » в форуме JAVA
    0 Ответы
    114 Просмотры
    Последнее сообщение Anonymous

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