What is the correct type on a method's parameter when passing a Multi-value parameter to an ObjectDataSource?

1 Answer 46 Views
Miscellaneous
Ryan
Top achievements
Rank 1
Ryan asked on 01 Nov 2024, 02:45 AM

Hi, 

I have been exploring on how to use ObjectDataSource and manage to make it work but I am encountering an error when passing parameter with Multi-value

HourlyTicketODS DataSource : Object must implement IConvertible.

I searched on online and based on the answers provided i should change the parameter type to object[] however it still doesn't work.  I tried string[], IEnumerable<string>, IEnumerable<object>, List<object> and List<string>  still the same.

Solutions i found on the internet but doesn't work:

https://docs.telerik.com/reporting/knowledge-base/object-must-implement-iconvertible

https://www.telerik.com/forums/objectdatasource-and-multivalue-parameter

 

Using =JOIN() and making the method's parameter as string works. Is it really doable to pass array? because on the documentation it states that

 "The Data Source Components are based on ADO.NET and ADO.NET does not allow a collection of values to be passed. The SqlDataSource Component however supports parametrized SQL queries by associating the report parameters with placeholders in the SelectCommand query. "

My config and code for reference

 

 

using System.ComponentModel; using System.Diagnostics; namespaceTelerikReportData { public class HourlyTicket { publicint Id { get; set; } publicstring Category { get; set; } = string.Empty; publicstring Status { get; set; } = string.Empty; } [DataObject] public class HourlyTickets { [DataObjectMethod(DataObjectMethodType.Select)] public List<HourlyTicket> GetHourlyTickets(DateTime from, DateTime to, object[] categories) { Debug.WriteLine($"HOURLY TICKET ODS | Date Range Params: From = {from.ToString()}, To = {to.ToString()}"); //Debug.WriteLine($"HOURLY TICKET ODS | Categories = {categories}");return [new HourlyTicket { Id = 1, Category = "Load Reprocessing", Status = "ongoing" }]; } } }

1 Answer, 1 is accepted

Sort by
0
Accepted
Ryan
Top achievements
Rank 1
answered on 04 Nov 2024, 02:30 AM

I managed to fix this issue. The solution is simple and can be found here: Telerik Documentation - Object Must Implement IConvertible. Whenever you change a method's parameters, such as updating the data type, make sure to go through the ObjectDataSource Wizard again.

 

Ryan
Top achievements
Rank 1
commented on 04 Nov 2024, 02:31 AM


using Dapper;
using System.ComponentModel;
using System.Text;
namespace TelerikReportData
{

    public class HourlyTicket
    {
        public int ID { get; set; }
        public string ReferenceNumber { get; set; } = string.Empty;
        public string Category { get; set; } = string.Empty;
        public string Type { get; set; } = string.Empty;
        public string Status { get; set; } = string.Empty;

        public DateTime Created { get; set; }
        public string Aging { get; set; } = string.Empty;

        public string? Remarks { get; set; }
    }
    [DataObject]
    public class HourlyTickets
    {

        [DataObjectMethod(DataObjectMethodType.Select)]
        public List<HourlyTicket> GetHourlyTickets(DateTime from, DateTime to, object[]? categories, object[]? statuses)
        {

            var config = Configuration.Get() ?? throw new InvalidOperationException("Config is null.");
            using var db = new AppSupportToolDbContext(config).CreateConnection();

            var query = new StringBuilder("SELECT ID, refnum as ReferenceNumber, categoryname as Category, typename as Type, statusid as Status, created as Created, aging as Aging ,remarks as Remarks FROM HourlyTicketList WHERE 1 = 1");
            var queryParams = new Dictionary<string, object>
            {
                {"@from", from},
                {"@to", to }

            };

            if (categories is not null && categories.Length > 0)
            {
                query.Append(" AND categoryname IN @categories");
                queryParams.Add("@categories", categories);
            }
            if (statuses is not null && statuses.Length > 0)
            {
                query.Append(" AND statusid IN @statuses");
                queryParams.Add("@statuses", statuses);
            }
            query.Append(" AND created BETWEEN @from AND @to");

            var tickets = db.Query<HourlyTicket>(query.ToString(), new DynamicParameters(queryParams));
            return tickets.ToList();
        }
    }
}
My ObjectDataSourceCode 
Tags
Miscellaneous
Asked by
Ryan
Top achievements
Rank 1
Answers by
Ryan
Top achievements
Rank 1
Share this question
or