Я использую SQL Server 2017 и .NET 9, здесь My Model:
P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> Pre Server 2017 и .NET 9, здесь. class = "lang-cs prettyprint-override">
Код: Выделить всё
[Keyless]
public class SqlOutput
{
[Column("SP_OUTPUT")]
public string? SpOutput { get; set; }
}
Код: Выделить всё
public DbSet SqlOutput { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasNoKey()
.ToView(null);
}
Код: Выделить всё
CREATE PROCEDURE myStoredProcedure
@id INT,
@random_text VARCHAR(50),
@key VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @successful VARCHAR(20) = 'SUCCESSFUL';
IF @key = 'MOD_REC'
BEGIN
UPDATE myDB.dbo.myTable
SET random_text = @random_text
WHERE id = @id AND disable = 0
IF @@ROWCOUNT > 0
BEGIN
SELECT @successful AS SP_OUTPUT
END
ELSE
BEGIN
SELECT NULL AS SP_OUTPUT
END
END
END
< /code>
В этих следующих фрагментах C# кода я изначально называю метод со своей страницы Razor таким образом: < /p>
SqlOutput? output = await SomeClass.SomeMethod("myStoredProcedure", id, anotherDataModel?.RandomText, "MOD_REC");
Код: Выделить всё
public async Task SomeMethod(string spName, params object?[] parameters) {...}
< /code>
, поскольку я стремлюсь свести к минимуму условно -исходную код, но все же гарантируя, что он может обрабатывать нулевые типы вместе с другими типами данных в объекте Single < /em> Params? SQLParameter [] Код: Выделить всё
var paramDefs = new (string Name, SqlDbType Type, int? Size)[]
{
("id", SqlDbType.Int, null),
("random_text", SqlDbType.VarChar, 50),
("key", SqlDbType.VarChar, 100)
};
Код: Выделить всё
return [.. paramDefs
.Select((def, i) =>
{
var param = def.Size is null
? new SqlParameter(def.Name, def.Type)
: new SqlParameter(def.Name, def.Type, def.Size.Value);
param.Value = parameters[i] ?? DBNull.Value;
return param;
})];
< /code>
Я инициализировал его таким образом: < /p>
public static SqlParameter[] SomeStaticMethod((string Name, SqlDbType Type, int? Size)[] paramDefs, params object?[] parameters) {...}
pre Class = "lang-csle- Praite-cole-cs.
Код: Выделить всё
public static FormattableString SomeOtherStaticMethod(string spName, SqlParameter[] sqlParameters) {
return sqlParameters.Length switch
{
1 => $"EXEC {spName} {sqlParameters[0]}",
2 => $"EXEC {spName} {sqlParameters[0]}, {sqlParameters[1]}",
3 => $"EXEC {spName} {sqlParameters[0]}, {sqlParameters[1]}, {sqlParameters[2]}",
_ => throw new ArgumentException("Too many parameters provided."),
};
}
Использование какого-то ComeTherStaticMethod returned antemple, я инициализировал его:
Praite-qued-aeprinde-uprinde-uprede-
Код: Выделить всё
FormattableString sqlParam = SomeStaticClass.SomeOtherStaticMethod(spName, sqlParameter);
var result = await _context.SqlOutput
.FromSql(sqlParam)
.ToListAsync();
return result.FirstOrDefault();
, которые можно использовать для меня, есть ли, что это может быть следующим образом. преодолеть:
[*] Существует огромная возможность для получения множественных операторов вставки SQL и обновления в одной транзакции (например, начинайте Tran ... Commit ).
< /li>
< /ul>
Осторожно Корректировки мне нужно сделать для этих вариантов использования? />
Примечание. Я ограничил модель данных с помощью сохраненных вызовов процедур. Вы можете спросить, почему я это делаю; Это просто потому, что я человек, который также несет ответственность за управление этими сценариями SQL в RDBMS, поэтому эта тема очень важна для меня, хотя существует крутой обходной путь, проходя глубокий поиск и имея тщательный анализ (к сожалению, я был запутан и немного разочарован). ценится!
Подробнее здесь: https://stackoverflow.com/questions/797 ... in-ef-core
Мобильная версия