Điều đầu tiên trước tiên:Tôi không biết bạn đang lấy tableName
ở đâu và columnName
, nhưng nếu chúng do người dùng cung cấp, thì điều này sẽ mở cho SQL injection. Ít nhất, hãy sử dụng QUOTENAME()
để đảm bảo không có mã thực nào được đưa vào.
Thứ hai, bạn không thực sự sử dụng TVP. Mã bạn có chỉ là IN (@IDTable)
đó không phải là cách bạn sử dụng TVP.
TVP chỉ là một biến bảng và nên được sử dụng giống như bất kỳ bảng nào khác:
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();
}
}