C# ExecuteSqlRaw(sql,param1,param2)抛出SqlException
我使用的ef核心版本是:3.0 我编写的代码如下所示:C# ExecuteSqlRaw(sql,param1,param2)抛出SqlException,c#,asp.net-core,C#,Asp.net Core,我使用的ef核心版本是:3.0 我编写的代码如下所示: SqlParameter table = new SqlParameter("@tableName", tableName); SqlParameter entryId = new SqlParameter("@entryId", id); string sql = "delete from @tableName where id = @entryId"; context.Database.ExecuteSqlRaw(sql, table
SqlParameter table = new SqlParameter("@tableName", tableName);
SqlParameter entryId = new SqlParameter("@entryId", id);
string sql = "delete from @tableName where id = @entryId";
context.Database.ExecuteSqlRaw(sql, table , entryId);
我的sql语句有两个参数,我已经定义并传递了这两个参数,但每次执行它时,我都会遇到以下异常,请帮助查看。谢谢
Microsoft.Data.SqlClient.SqlException(0x80131904):必须声明
表变量“@tableName”。在
Microsoft.Data.SqlClient.SqlConnection.OneError(SqlException,
布尔断开连接,操作1 wrapCloseInAction)位于
Microsoft.Data.SqlClient.SqlInternalConnection.OneError(SqlException
异常,布尔断开连接,操作
1 wrapCloseInAction)位于
Microsoft.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject
stateObj、布尔调用方连接锁、布尔异步关闭)位于
Microsoft.Data.SqlClient.TdsParser.TryRun(运行行为,
SqlCommand cmdHandler、SqlDataReader数据流、,
BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject
stateObj、Boolean和dataReady)位于
Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader
ds,运行行为,字符串重置选项字符串,布尔值
isInternal,用于描述参数加密的布尔值,布尔值
应该缓存(始终加密)在
Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior、RunBehavior、Boolean returnStream、Boolean
isAsync、Int32超时、任务和任务、布尔异步写入、布尔
在数组中,SqlDataReader ds,布尔描述参数加密请求)
在
Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(命令行为
cmdBehavior、RunBehavior、Boolean returnStream、,
TaskCompletionSource1完成,Int32超时,任务和任务,布尔值&
usedCache、Boolean asyncWrite、Boolean inRetry、String方法)位于
Microsoft.Data.SqlClient.SqlCommand.InternalExecuteOnQuery(TaskCompletionSource
1
完成,布尔sendToPipe,Int32超时,布尔和usedCache,
布尔值异步写入、布尔值输入、字符串方法名)位于
Microsoft.Data.SqlClient.SqlCommand.ExecuteOnQuery()位于
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteOnQuery(RelationalCommandParameterObject
参数对象)在
Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlRaw(DatabaseFacade
databaseFacade、字符串sql、IEnumerable`1参数)位于
Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlRaw(DatabaseFacade
databaseFacade、字符串sql、对象[]参数)位于
无法参数化表名和列名。用C#术语来说,这就像将类名放入字符串中并尝试实例化它:
string className = "Person";
className p = new className; //it doesn't work
您的代码必须更像:
SqlParameter entryId = new SqlParameter("@entryId", id);
string sql = "delete from "+tableName+" where id = @entryId";
context.Database.ExecuteSqlRaw(sql, entryId);
不要让最终用户能够更改tableName变量的内容
额外信息由Lutti Coelho提供: 为了避免查询中的SQL注入,最好使用
ExecuteSqlInterpolated
方法。此方法允许以防止SQL注入攻击的方式使用字符串插值语法
context.Database.ExecuteSqlInterpolated("delete from {tableName} where id = {id}");
对原始SQL查询始终使用参数化
在将任何用户提供的值引入原始SQL查询时,必须小心避免SQL注入攻击。除了验证这些值是否不包含无效字符外,请始终使用参数化,将值与SQL文本分开发送
特别是,切勿将带有未经验证的用户提供值的串联或插值字符串($“”)传递到FromSqlRaw或ExecuteSqlRaw中。FromSqlInterpolated和ExecuteSqlInterpolated方法允许以防止SQL注入攻击的方式使用字符串插值语法
context.Database.ExecuteSqlInterpolated("delete from {tableName} where id = {id}");
您可以通过以下链接查看有关原始SQL查询的更多信息:
无法参数化表名和列名。用C#术语来说,这就像将类名放入字符串中并尝试实例化它:
string className = "Person";
className p = new className; //it doesn't work
您的代码必须更像:
SqlParameter entryId = new SqlParameter("@entryId", id);
string sql = "delete from "+tableName+" where id = @entryId";
context.Database.ExecuteSqlRaw(sql, entryId);
不要让最终用户能够更改tableName变量的内容
额外信息由Lutti Coelho提供: 为了避免查询中的SQL注入,最好使用
ExecuteSqlInterpolated
方法。此方法允许以防止SQL注入攻击的方式使用字符串插值语法
context.Database.ExecuteSqlInterpolated("delete from {tableName} where id = {id}");
对原始SQL查询始终使用参数化
在将任何用户提供的值引入原始SQL查询时,必须小心避免SQL注入攻击。除了验证这些值是否不包含无效字符外,请始终使用参数化,将值与SQL文本分开发送
特别是,切勿将带有未经验证的用户提供值的串联或插值字符串($“”)传递到FromSqlRaw或ExecuteSqlRaw中。FromSqlInterpolated和ExecuteSqlInterpolated方法允许以防止SQL注入攻击的方式使用字符串插值语法
context.Database.ExecuteSqlInterpolated("delete from {tableName} where id = {id}");
您可以通过以下链接查看有关原始SQL查询的更多信息:
仅凭stacktrace和消息,我们将无法帮助您。此外,消息必须声明表变量“@tableName”。我似乎很清楚。你在寻求什么样的帮助?@PeterBons,sql应该可以从文档中工作,但是我遇到了一个错误,我想知道如何使它工作。不能使用稳定名称、列名和其他sql标识符parameterized@CaiusJard真正地我没有在Microsoft文档中找到这个,如果是的话,我知道原因。谢谢你,只是一个stacktrace和消息,我们将无法帮助你。此外,消息必须声明表变量“@tableName”。我似乎很清楚。你在寻求什么样的帮助?@PeterBons,sql应该可以从文档中工作,但是我遇到了一个错误,我想知道如何使它工作。名称、列名