Npgsql 传递参数数组

Npgsql passing an array of parameters

我是 Npgsql 的新手,我尝试在我的 asp.net 项目中创建一个助手,以便我可以在我的控制器方法中方便地调用它。

npgsqlqueryhelper

  public DataSet ExecuteQueryWithParams(string commandText, params NpgsqlParameter[] parameters)
  {
     using (var connection = npgsqlcon.GetnpgsqlConnection())
     using (NpgsqlCommand command = new NpgsqlCommand(commandText, connection))
     {
          DataSet ds = new DataSet();
          command.Parameters.AddRange(parameters);
          command.CommandTimeout = 5000;
          NpgsqlDataAdapter da = new NpgsqlDataAdapter(command);
          da.Fill(ds);
          connection.Close();
          return ds;
     }
  }

My Controller Method

   List<rollingPAR> rollingparlist = new List<rollingPAR>();
   npgsqlhelper = new npgsqlQueryHelper();
   NpgsqlParameter[] parameterList = {
                new NpgsqlParameter("@lid", r.lid),
                new NpgsqlParameter("@posting_date", r.date_end)
   };
   var table = npgsqlhelper.ExecuteQueryWithParams("SELECT ln.get_payment_status()", parameterList).Tables[0];
   rollingparlist = table.AsEnumerable().Select(row => new rollingPAR
    {
        get_payment_status = row.Field<int>("get_payment_status")
    }).ToList();

当我尝试 运行 我的程序时,我总是遇到一个错误 function ln.get_payment_status() does not exist 但是当我尝试直接在查询中提供参数时

(例如 var table = npgsqlhelper.ExecuteQueryWithParams("SELECT ln.get_payment_status(1231,'06-18-2019')", parameterList).Tables[0];

它给了我需要的数据。我不知道我的错误是什么,从昨天开始我就被困在这里了。谁能帮我这个? TIA

参数占位符不会自动包含在函数调用中。尝试添加它们:

var table = npgsqlhelper.ExecuteQueryWithParams("SELECT ln.get_payment_status(@lid,@posting_date)", parameterList).Tables[0];

在@JGH 先生的帮助下,我发现我的查询缺少参数占位符,但在我编辑它之后,我遇到了关于 asp.net datetimedatetime 之间数据类型的错误postgresql 日期所以我添加了这段代码来消除错误。

parameterList[1].NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Date;

现在是新代码:

   List<rollingPAR> rollingparlist = new List<rollingPAR>();
       npgsqlhelper = new npgsqlQueryHelper();
       NpgsqlParameter[] parameterList = {
               new NpgsqlParameter("@lid", r.lid),
               new NpgsqlParameter("@posting_date", r.date_end)
       };
       parameterList[1].NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Date;
       var table = npgsqlhelper.ExecuteQueryWithParams("SELECT ln.get_payment_status(@lid,@posting_date)", parameterList).Tables[0];
       rollingparlist = table.AsEnumerable().Select(row => new rollingPAR
            {
               get_payment_status = row.Field<int?>("get_payment_status")
            }).ToList();

谢谢@JGH先生