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
// FormattableString sqlQuery = $"EXEC {storedProcedure} {sqlParameterparam[0]}, {sqlParameterparam[1]}, {sqlParameterparam[2]}";
return sqlQuery;
}
Код: Выделить всё
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
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 ... toredproce