c# - SQL Server:执行存储过程问题
问题描述
我正在尝试执行一个存储过程,但我不断收到错误:
过程或函数“dynamictable”需要参数“@tablename”,但未提供该参数
你能修复我的代码吗?
conn.Open();
SqlCommand search = new SqlCommand("dbo.dynamictable", conn);
search.CommandType = CommandType.StoredProcedure;
search.Parameters.Add(new SqlParameter("@tablename", table));
search.Parameters.Add(new SqlParameter("width", housewidth.ToString()));
以下是查询是否可以帮助您:
CREATE PROCEDURE dynamictable
(@tablename nvarchar(100), @width nvarchar(50))
AS
BEGIN
DECLARE @SQL nvarchar(max)
SELECT @SQL = 'SELECT * FROM [' + @tablename+ '] WHERE [Width] = '+ @width;
EXEC sp_executesql @SQL
END
解决方案
如果table
为空,那么您将收到该消息。
你真的应该指定参数的类型和大小:
search.Parameters.Add(new SqlParameter("@tablename", SqlDbType.NVarChar, 128).Value = table;
search.Parameters.Add(new SqlParameter("@width", SqlDbType.Int).value = housewidth;
您当前的查询也存在 SQL 注入的风险。即使在动态部分,它也应该使用适当的参数化和转义:
CREATE procedure dynamictable
(@tablename nvarchar(128), @width int)
as
begin
declare @SQL nvarchar(max) =
N'SELECT * FROM ' + QUOTENAME(@tablename) + ' WHERE [Width] = @width;';
exec sp_executesql @SQL, N'@width int', @width = @width;
end
推荐阅读
- javascript - 在 http 有效载荷中获取图像
- mysql - 使用带有替换关键字的 INNER JOIN 连接两个表时出错
- javascript - 如何编写 Promise 链?
- python - 无法从“假期”导入名称“复活节”
- java - 从文本文件中读取整数并将其存储到单独的变量中?(扫描器)
- php - 尝试使用 AJAX 加载 ui 时,LARAVEL GET 404(未找到)
- conan - 柯南 protobuf 编译抱怨未定义的引用
- javascript - 使用 lodash isEqual 对对象进行深度比较得到误报
- java - 请求的资源上不存在“Access-Control-Allow-Origin”标头,CORS 问题
- apache-kafka - 为什么 3 个 Kafka 代理在同时重新启动后没有启动?