Report Viewer X Dapper

前端 未结 4 1773
野的像风
野的像风 2021-01-18 16:11

I\'m feeding a ReportDataSource with a query using Dapper. However, I have an empty report, even with an IEnumerable loaded data. When you spend a

相关标签:
4条回答
  • As I could not find another way to feed my ReportViewer to a query Dapper.Query then downloaded the source and added the code below.

        #region CODTEC SISTEMAS
        /// <summary>
        /// Return a typed list of objects, reader is closed after the call
        /// </summary>
        public static DataTable Query(this IDbConnection cnn, string sql, object param, IDbTransaction transaction, int? commandTimeout, CommandType? commandType)
        {
            var identity = new Identity(sql, commandType, cnn, typeof(DapperRow), param == null ? null : param.GetType(), null);
            var info = GetCacheInfo(identity);
    
            IDbCommand cmd = null;
            IDataReader reader = null;
    
            bool wasClosed = cnn.State == ConnectionState.Closed;
            try
            {
                cmd = SetupCommand(cnn, transaction, sql, info.ParamReader, param, commandTimeout, commandType);
    
                if (wasClosed) cnn.Open();
                reader = cmd.ExecuteReader(wasClosed ? CommandBehavior.CloseConnection : CommandBehavior.Default);
                wasClosed = false; // *if* the connection was closed and we got this far, then we now have a reader
                // with the CloseConnection flag, so the reader will deal with the connection; we
                // still need something in the "finally" to ensure that broken SQL still results
                // in the connection closing itself
    
                DataTable dt = new DataTable();
                dt.Load(reader);
    
    
                // happy path; close the reader cleanly - no
                // need for "Cancel" etc
                reader.Dispose();
                reader = null;
    
                return dt;
            }
            finally
            {
                if (reader != null)
                {
                    if (!reader.IsClosed) try { cmd.Cancel(); }
                        catch { /* don't spoil the existing exception */ }
                    reader.Dispose();
                }
                if (wasClosed) cnn.Close();
                if (cmd != null) cmd.Dispose();
            }
        }
        #endregion
    
    0 讨论(0)
  • 2021-01-18 16:23

    Not sure how Dapper works, but a datatable is binded like this:

    DataTable dt = new DataTable();
    DataColumn dc = dt.Columns.Add();
    dc.ColumnName = "DataColumn1";
    dc = dt.Columns.Add();
    
    dc.ColumnName = "DataColumn2";
    dt.Rows.Add(new object[] { "Frank", 32 });
    this.reportViewer1.LocalReport.DataSources.Clear();
    
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1_DataTable1", dt));
    this.reportViewer1.RefreshReport();
    

    and since I am using C#, I bind data sources like this:

    this.bindingSource1.DataSource = getListMethod(); // this method/property returns a list of objects
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Point", (this.bindingSource1)));
    //Point is the datatable name in my Dataset.xsd file
    
    0 讨论(0)
  • 2021-01-18 16:35

    To Get the DataTable from SqliteDB using Dapper.

    1. Pass the query such as "select*from table" inside the method.

    2. list is formed, by executing query.

    3. Then serialize the object into Json and then deserialize the Json into the DataTable.

      public DataTable method(string query)
         {
             string connection = @"Data Source= C:\User\DBFolder\sampleDB.db;Version=3;New=False;Compress=True;";
      
             using (IDbConnection dbConnection = new SQLiteConnection(connection))
              {
                  dbConnection.Open();
                  var output1 = dbConnection.Query(query).ToList();
                  dbConnection.Close();
                  var json = JsonConvert.SerializeObject(output1);
                  DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
                  return dt;
              }
          }
      
    0 讨论(0)
  • 2021-01-18 16:37

    Looks like Dapper now supports the DataTable...

    From the test:

    public void ExecuteReader()
    {
        var dt = new DataTable();
        dt.Load(connection.ExecuteReader("select 3 as [three], 4 as [four]"));
        dt.Columns.Count.IsEqualTo(2);
        dt.Columns[0].ColumnName.IsEqualTo("three");
        dt.Columns[1].ColumnName.IsEqualTo("four");
        dt.Rows.Count.IsEqualTo(1);
        ((int)dt.Rows[0][0]).IsEqualTo(3);
        ((int)dt.Rows[0][1]).IsEqualTo(4);
    }
    

    Also now supported is using a DataTable as a TableValueParameter:

    public void DataTableParameters()
    {
        try { connection.Execute("drop proc #DataTableParameters"); } catch { }
        try { connection.Execute("drop table #DataTableParameters"); } catch { }
        try { connection.Execute("drop type MyTVPType"); } catch { }
        connection.Execute("create type MyTVPType as table (id int)");
        connection.Execute("create proc #DataTableParameters @ids MyTVPType readonly as select count(1) from @ids");
    
        var table = new DataTable { Columns = { { "id", typeof(int) } }, Rows = { { 1 }, { 2 }, { 3 } } };
    
        int count = connection.Query<int>("#DataTableParameters", new { ids = table.AsTableValuedParameter() }, commandType: CommandType.StoredProcedure).First();
        count.IsEqualTo(3);
    
        count = connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter("MyTVPType") }).First();
        count.IsEqualTo(3);
    
        try
        {
            connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter() }).First();
            throw new InvalidOperationException();
        } catch (Exception ex)
        {
            ex.Message.Equals("The table type parameter 'ids' must have a valid type name.");
        }
    }
    
    0 讨论(0)
提交回复
热议问题