सबसे पहले चीज़ें:मुझे नहीं पता कि आपको tableName
कहां मिल रहा है? और columnName
, लेकिन अगर वे उपयोगकर्ता द्वारा आपूर्ति की जाती हैं, तो यह SQL इंजेक्शन के लिए खुला है। कम से कम, QUOTENAME()
का उपयोग करें यह सुनिश्चित करने के लिए कि कोई वास्तविक कोड इंजेक्ट नहीं किया गया है।
दूसरे, आप वास्तव में TVP का उपयोग नहीं कर रहे हैं। आपके पास जो कोड है वह सिर्फ IN (@IDTable)
. कह रहा है ऐसा नहीं है कि आप टीवीपी का उपयोग कैसे करते हैं।
टीवीपी सिर्फ एक टेबल वेरिएबल है, और इसे किसी भी अन्य टेबल की तरह इस्तेमाल किया जाना चाहिए:
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();
}
}