我有一个存储过程,该过程接受大约8个参数并返回一堆数据。存储过程本身运行良好,当我在SSMS中调用它时它会返回数据。但是,当我使用Dapper ORM从我的应用程序中调用它时,我没有得到任何数据。
我在这里查找了类似的主题,并且尝试了所有建议的方法:Dapper multi-parameter stored procedure query returns nothing back from database
这是我的代码:
localConnection = new SqlConnection(defaultSettings.SetConnectionString(auth.DB_Name));
var parameters = new DynamicParameters();
try
{
parameters.Add("@param2", "val1");
parameters.Add("@param3", "val2");
parameters.Add("@param4", "val3");
parameters.Add("@param5", "val4");
parameters.Add("@param6", "val5");
parameters.Add("@param7", "val6");
parameters.Add("@param8", "val7");
var orders = localConnection.Query<Order>("spGetData", parameters, commandType: CommandType.StoredProcedure).ToList();
}
catch (Exception ex)
{
log.Error("Getdata Error: " + ex.Message);
}
这是SQL Server存储过程:
CREATE PROCEDURE [dbo].[spGetData]
@param1 VARCHAR(8),
@param2 VARCHAR(8),
@param3 VARCHAR(8),
@param4 VARCHAR(8),
@param5 VARCHAR(8),
@param6 VARCHAR(8),
@param7 VARCHAR(8)
AS
SET NOCOUNT ON
SELECT TOP 1 *
FROM Orders a
JOIN ChangeLog b ON a.id = b.id
WHERE a.name = @param1
AND a.col2 = @param2
AND b.col1 = @param3
AND b.col3 = @param4
AND b.col4 = @param5
AND a.col3 = @param6
AND b.col5 = @param7
RETURN 0
知道发生了什么吗?还是我做错了什么?
答案 0 :(得分:1)
据我所知,Dapper和多个参数没有问题。这是我创建的测试代码:
class Program
{
static void Main(string[] args)
{
SqlConnection c = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb;Data Source=.\SQLEXPRESS");
c.Execute(@"
CREATE PROCEDURE GetPerson(
@N VARCHAR(10),
@A INT,
@S INT
)AS
BEGIN
SELECT @N as Name, @A as Age, @S as Salary;
END;");
//works
var p = c.Query<Person>("GetPerson", new { A = 1, N = "John", S = 1000 }, commandType: System.Data.CommandType.StoredProcedure);
//doesn't work, "procedure expects parameter @A which was not supplied"
int i = 2, j = 2000; string n = "Frank";
var q = c.Query<Person>("GetPerson", new { i, n, j }, commandType: System.Data.CommandType.StoredProcedure);
//works
int A = 3, S = 3000; string N = "Joe";
var r = c.Query<Person>("GetPerson", new { S, A, N }, commandType: System.Data.CommandType.StoredProcedure);
//works
DynamicParameters dp = new DynamicParameters();
dp.Add("@A", 4);
dp.Add("@N", "Derek");
dp.Add("@S", 4000);
var s = c.Query<Person>("GetPerson", dp, commandType: System.Data.CommandType.StoredProcedure);
DynamicParameters dp2 = new DynamicParameters();
dp2.Add("A", 5);
dp2.Add("N", "Tim");
dp2.Add("S", 5000);
var t = c.Query<Person>("GetPerson", dp2, commandType: System.Data.CommandType.StoredProcedure);
}
}
class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
所有//works
返回1个人的查询。该查询输出的Salary列未在Person类中表示,因此只会丢失。
主要要点:
您发现这是对您的情况至关重要的最后一个;您的查询没有输出名称与您的订单对象匹配的列
答案 1 :(得分:1)
我发现了问题。我正在使用的<Button
variant="contained"
component="label"
>
Upload File
<input
type="file"
style={{ display: "none" }}
/>
</Button>
类具有应与存储过程的数据列匹配的属性,与之不匹配。
一旦我解决了这个问题,我就会开始工作。