Za prvé:Nemám ponětí, kde získáváte tableName
a columnName
, ale pokud jsou poskytnuty uživatelem, pak je to otevřené pro SQL injection. Přinejmenším použijte QUOTENAME()
abyste zajistili, že nebude vložen žádný skutečný kód.
Za druhé, ve skutečnosti nepoužíváte TVP. Kód, který máte, jen říká IN (@IDTable)
což není způsob, jakým používáte TVP.
TVP je pouze proměnná tabulky a měla by se používat jako každá jiná tabulka:
protected virtual void DoDeleteRecords(List<Guid> ids)
{
if (ids.Count == 0)
return;
DataTable tvp = new DataTable();
tvp.Columns.Add("Id", typeof(Guid));
foreach (Guid id in ids)
tvp.Rows.Add(id);
const string sql = @"
DELETE FROM table
WHERE idColumnName IN (SELECT * FROM @IDTable);
";
using(SqlConnection connection = new SqlConnection(CoreSettings.ConnectionString))
using(SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.Add(
new SqlParameter("@IDTable", SqlDbType.Structured)
{
Value = tvp,
Direction = ParameterDirection.Input,
TypeName = "dbo.IDList"
});
connection.Open();
command.ExecuteNonQuery();
}
}