c# - EC Core ExecuteSqlCommandAsync 截断参数不起作用
问题描述
我看过这个线程:如何将参数传递给 DbContext.Database.ExecuteSqlCommand 方法?
我感觉 EF Core 正在阻止我truncate
对 Azure Sql 数据库中的表使用参数化查询。
我试过了:
var tableName = csvEntity.FileName.Replace(".csv", string.Empty);
var tableNameParam = new SqlParameter("@TableName", tableName);
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);
和:
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);
和:
await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");
和:
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);
但所有这些都会导致以下变化:
错误:“@TableName”附近的语法不正确。
但是如果我跑
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE AllStarFull");
我们都很好!
你不能在ExecuteSqlCommandAsync的截断语句中使用变量作为表名吗
一些屏幕截图:
例外:
异常前的第三次尝试
第三次尝试异常
解决方案
你的第一次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @TableName", tableNameParam);
不起作用,因为无法将表名作为参数传递给 SQL 语句。
你的第二次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE @{0}", tableNameParam);
不起作用,因为更换{0}
需要您使用string.Format
你的第三次尝试
await DbContext.Database.ExecuteSqlCommandAsync($"TRUNCATE TABLE {tableName}");
不起作用,因为实体框架需要一个常量字符串作为原始 SQL。
你的第四次尝试
await DbContext.Database.ExecuteSqlCommandAsync("TRUNCATE TABLE {tableName}", tableName);
无法正常工作,因为ExecuteSqlCommandAsync
无法正确映射参数。
为了解决这个问题,我们可以使用您的第三次尝试稍有不同,如下所示。
var sqlQuery = $"TRUNCATE TABLE {tableName}";
await DbContext.Database.ExecuteSqlCommandAsync(sqlQuery);
这确保了当查询被传递到实体框架时,它确切地知道需要什么。
推荐阅读
- c# - EPPLus C# 创建和写入文件以在垃圾中流式传输
- python - 在model/official/resnet/resnet_run_loop.py文件中无法使Dataset.filter()工作
- c++ - 如何使 2D 矢量中的每个矢量不同?
- android - 处理 ViewPager 的方向变化
- java - Mediaplayer 不播放来自 URL 的音频
- python - 如何查看或保存
使用普通的python(不是ipython)? - python-3.x - 在Python中追加多个文件时如何插入一个空行
- reinforcement-learning - 当有多个决策要学习时的强化学习
- python - 如何按顺序比较列表中的项目?
- python - 如何在 ArUco 标记上制作 3d 圆柱体/立方体?