.Net MySql用户定义变量作为输出参数

时间:2014-07-06 03:36:30

标签: c# mysql asp.net .net

我一直在搜索,但我找到的答案通常涉及存储过程或不同的功能。

我正在尝试执行一个阅读器,并在一个查询中返回一个标量。我以为我可以使用输出参数执行此操作,但是我在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;

2 个答案:

答案 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();
}