我正在尝试执行一个存储过程,我一直得到一个错误:
过程或函数'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
为null,则您将获得该消息。
你应该指定参数的类型和大小:
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
去掉"@"从参数名传递
search.Parameters.Add(new SqlParameter("tablename", table));
'过程或函数'dynamictable'期望参数'@tablename',该参数未提供。'
该错误通常意味着c#变量table
为空。您的存储过程似乎没有任何相关问题。(你提到'@'这是额外的-所以技术上,tablename还没有设置…(:)