我一直在搜索,但我找到的答案通常涉及存储过程或不同的功能。
我正在尝试执行一个阅读器,并在一个查询中返回一个标量。我以为我可以使用输出参数执行此操作,但是我在NULL = @rows_found()附近检查我的语法时出现异常,因此看起来输出参数未初始化。
基本上我需要知道这是否可行,因为我还没有找到这样的代码示例。
command.CommandText = @"
SELECT SQL_CALC_FOUND_ROWS
accounting.*
FROM
accounting
WHERE
transaction_type = @transaction_type
LIMIT
@index, @results;
SET @total_rows = FOUND_ROWS();
";
command.Parameters.AddWithValue("transaction_type", transaction_type);
command.Parameters.AddWithValue("index", index);
command.Parameters.AddWithValue("results", results);
MySqlParameter totalRows = new MySqlParameter("total_rows", 0);
totalRows.Direction = System.Data.ParameterDirection.Output;
command.Parameters.Add(totalRows);
using (MySqlDataReader dr = command.ExecuteReader())
{
while (dr.Read())
invoices.Add(new AccountingDataModel(dr));
}
invoices.Total = (int)totalRows.Value;
答案 0 :(得分:0)
cmd.Parameters["@output"].Value.ToString()
使用命令对象访问out参数.... 你不能直接访问perameter。
你应该像
一样使用invoices.Total = Convert.ToInt32(command.Parameters["total_rows"].Value.ToString())
存储过程的示例
MySqlCommand cmd = new MySqlCommand(nameOfStoredRoutine, connection);
cmd.CommandType = CommandType.StoredProcedure;
//input parameters
for (int i = 0; i < (parameterValue.Length / 2); i++)
{
cmd.Parameters.AddWithValue(parameterValue[i, 0], parameterValue[i, 1]);
cmd.Parameters[parameterValue[i, 0]].Direction = ParameterDirection.Input;
parameterList = parameterList + parameterValue[i,0] + " " + parameterValue[i,1] + " ";
}
//single output parameter
cmd.Parameters.AddWithValue("@output", MySqlDbType.Int32);
cmd.Parameters["@output"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery(); //Execute command
return Convert.ToInt32(cmd.Parameters["@output"].Value.ToString());
答案 1 :(得分:0)
似乎这是不可能的。来自Direction
属性MySqlParameter
's members的文档:
获取或设置一个值,该值指示参数是仅输入,仅输出,双向还是存储过程返回值参数。从MySQL 4.1及更早版本开始,仅输入是唯一有效的选择。
因此,无论您将Direction
设置为什么,参数始终是输入参数。如果您将值从null
更改为其他任何内容(例如15),您应该会看到生成的查询类似于
SET 15 = FOUND_ROWS()
最终我最终运行了两个查询。可能这并不像它可能的那样高效,但至少它得到了预期的结果(使用EF Core):
using (var context = new MyDbContext(...))
{
context.Database.OpenConnection();
var estates = context.MySet
.FromSql("SELECT SQL_CALC_FOUND_ROWS * FROM myset LIMIT 25 OFFSET 25")
.ToList();
var cmd = context.Database.GetDbConnection().CreateCommand();
cmd.CommandText = "SELECT FOUND_ROWS()";
var rows = (long)cmd.ExecuteScalar();
context.Database.CloseConnection();
}