Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExecuteSqlRaw(sql,param1,param2)抛出SqlException_C#_Asp.net Core - Fatal编程技术网

C# ExecuteSqlRaw(sql,param1,param2)抛出SqlException

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

我使用的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 , 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、, TaskCompletionSource
1完成,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应该可以从文档中工作,但是我遇到了一个错误,我想知道如何使它工作。名称、列名