我有一個查詢,我想通過 C# 應用程式運行。沒有選項可以在應用程式之外執行此操作。我有以下代碼:
var keyGroupsToCleanUp = new List<string>
{
"Address",
"Manufacturer",
"Product",
"Customer",
"Picture",
"Category",
"Vendor",
"SS_A_Attachment",
"SS_A_AttachmentDownload",
"SS_MAP_EntityMapping",
"SS_MAP_EntityWidgetMapping",
};
foreach (var keyGroup in keyGroupsToCleanUp)
{
_databaseFacade.ExecuteSqlCommand($@"
DELETE
FROM GenericAttribute
WHERE KeyGroup = {keyGroup} AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM [{keyGroup}]);
");
}
我想遍歷串列中的每個名稱并為每個名稱運行以下查詢。當我嘗試這樣做時,我收到以下錯誤:
System.Data.SqlClient.SqlException (0x80131904): Invalid object name '@p1'.
從我在網上搜索后收集到的,這是因為表名不能是字串。您必須宣告一個變數并將此變數用于表名。我了解到 Table 變數有需要宣告的列,我感到一陣恐懼涌上心頭。這些表都沒有相同的列結構。
我正在嘗試做的可能嗎?如果是這樣,我該怎么做?
uj5u.com熱心網友回復:
嘗試以下操作:
foreach (var keyGroup in keyGroupsToCleanUp)
{
var sql = @"DELETE FROM GenericAttribute
WHERE KeyGroup = @Group
AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM @Group)"; // Or [@Group], depends on schema
_databaseFacade.ExecuteSqlCommand(
sql,
new SqlParameter("@Group", keyGroup));
此代碼假定,ExecuteSqlCommand在您的外觀中遵循標準的 Microsoft 模式(與 Microsoft 的覆寫相同)。
uj5u.com熱心網友回復:
猜測,您正在使用 Entity Framework Core。該ExecuteSqlCommand方法接受 a FormattableString,并將任何占位符轉換為命令引數。但是您的占位符似乎是列/表名稱,不能作為引數傳遞。
由于還有一個接受 a 的多載string,它具有不同的行為,因此該方法已被標記為過時,并由ExecuteSqlInterpolatedand替換ExecuteSqlRaw。
假設您的所有值都不會受到用戶的影響,并且您很高興不會引入SQL 注入漏洞,那么您可以ExecuteSqlRaw改用:
_databaseFacade.ExecuteSqlRaw($@"
DELETE
FROM GenericAttribute
WHERE KeyGroup = [{keyGroup}] AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM [{keyGroup}]);
");
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359835.html
上一篇:需要的SQL查詢邏輯
下一篇:如何查詢JSONB陣列
