Не понятная ошибка

Обсуждение Stimulsoft Reports.NET
Ответить
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Не понятная ошибка

Сообщение compositum »

ДатаСет не пустой, получаю странную ошибку:
Изображение

Никакого ДрагЭндДропа я нигде не реализовывал. А посему не пойму в чем дело... Это вообще консольное приложение...

Код выглядит так (ошибка вылезает в предпоследней строке кода):

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Documents;
using System.Data.OleDb;
using System.Data;
using Stimulsoft.Report;
using System.Windows.Forms;
namespace ConsoleProgramm
{
    class Program
    {
        static void Main(string[] args)
        {
            //Данные для формирования отчета получаю из файла аксесс
            OleDbConnectionStringBuilder cnnBild = new OleDbConnectionStringBuilder();
            cnnBild.DataSource = @"\\Server-buh\bushman\mdb-files\Builder Premium_be.mdb";
            cnnBild.Provider = "Microsoft.Jet.OLEDB.4.0";
            cnnBild.PersistSecurityInfo = false;
            #region формирую ДатаСет для сметы...
            //смета
            DataSet ds = new DataSet("ds");
            DataTable estimates = new DataTable("estimates");
            estimates.Columns.Add("SmetaID", typeof(int));
            estimates.Columns.Add("SmetaNomber", typeof(int));
            estimates.Columns.Add("SmetaName", typeof(string));
            estimates.PrimaryKey = new DataColumn[] {estimates.Columns["SmetaID"]};            
            ds.Tables.Add(estimates);
            //разделы
            DataTable parts = new DataTable("EstimatesParts");
            parts.Columns.Add("PartID", typeof(int));
            parts.Columns.Add("PartNomber", typeof(int));
            parts.Columns.Add("PartName", typeof(string));
            parts.Columns.Add("SmetaID", typeof(int));
            parts.PrimaryKey = new DataColumn[] { parts.Columns["PartID"] };
            ds.Tables.Add(parts);
            ForeignKeyConstraint partFK = new ForeignKeyConstraint("partFK",estimates.Columns["SmetaID"],
                parts.Columns["SmetaID"]);
            parts.Constraints.Add(partFK);
            ds.Relations.Add(new DataRelation("estimate_parth", estimates.Columns["SmetaID"],
                parts.Columns["SmetaID"]));
            //работы
            DataTable works = new DataTable("WorksSm");
            works.Columns.Add("WorkSmID", typeof(int));
            works.Columns.Add("WorkSmNomber", typeof(int));
            works.Columns.Add("WorkSmName", typeof(string));
            works.Columns.Add("ED", typeof(string));
            works.Columns.Add("PartID", typeof(int));
            works.PrimaryKey = new DataColumn[] { works.Columns["WorkSmID"] };
            ds.Tables.Add(works);
            ForeignKeyConstraint worksFK = new ForeignKeyConstraint("worksFK", parts.Columns["PartID"],
                works.Columns["PartID"]);
            works.Constraints.Add(worksFK);
            ds.Relations.Add(new DataRelation("parth_works", parts.Columns["PartID"],
                works.Columns["PartID"]));
            //материалы 
            DataTable materials = new DataTable("materials");
            materials.Columns.Add("MatID", typeof(int));
            materials.Columns.Add("MatName", typeof(string));
            materials.Columns.Add("MatMarka", typeof(string));
            materials.Columns.Add("MatCost", typeof(decimal));
            materials.Columns.Add("MatValue", typeof(decimal));
            materials.Columns.Add("MatED", typeof(string));
            materials.Columns.Add("MatDeskript", typeof(string));
            materials.Columns.Add("smWorkID", typeof(int));
            materials.PrimaryKey = new DataColumn[] { works.Columns["MatID"] };
            ds.Tables.Add(materials);
            ForeignKeyConstraint materialFK = new ForeignKeyConstraint("materialFK", works.Columns["WorkSmID"],
                materials.Columns["smWorkID"]);
            materials.Constraints.Add(materialFK);
            ds.Relations.Add(new DataRelation("material_work", works.Columns["WorkSmID"],
                materials.Columns["smWorkID"]));
            //механизмы
            DataTable machines = new DataTable("machines");
            machines.Columns.Add("recID", typeof(int));
            machines.Columns.Add("smMeh", typeof(string));
            machines.Columns.Add("smMehMarka", typeof(string));
            machines.Columns.Add("smMehED", typeof(string));
            machines.Columns.Add("smMehCost", typeof(decimal));
            machines.Columns.Add("smMehValue", typeof(decimal));
            machines.Columns.Add("smWorkID", typeof(int));
            machines.PrimaryKey = new DataColumn[] { machines.Columns["recID"] };
            ds.Tables.Add(machines);
            ForeignKeyConstraint machinesFK = new ForeignKeyConstraint("machinesFK", works.Columns["WorkSmID"],
                machines.Columns["smWorkID"]);
            machines.Constraints.Add(machinesFK);
            ds.Relations.Add(new DataRelation("machines_work", works.Columns["WorkSmID"],
                machines.Columns["smWorkID"]));
            //начисления на раздел работ
            DataTable partNach = new DataTable("partNachHidden");
            partNach.Columns.Add("KoeffID", typeof(int));
            partNach.Columns.Add("KoeffNomber", typeof(int));
            partNach.Columns.Add("KoeffName", typeof(string));
            partNach.Columns.Add("KoeffTypeName", typeof(string));
            partNach.Columns.Add("koefNombers", typeof(string));
            partNach.Columns.Add("KoeffValue", typeof(decimal));
            partNach.Columns.Add("PartID", typeof(int));
            partNach.PrimaryKey = new DataColumn[] { partNach.Columns["KoeffID"] };
            partNach.Columns["KoeffID"].ReadOnly = true;
            partNach.Columns["KoeffID"].AutoIncrement = true;
            partNach.Columns["KoeffID"].AutoIncrementStep = 1;            
            partNach.Columns["KoeffID"].AutoIncrementSeed = 1;
            ds.Tables.Add(partNach);
            ForeignKeyConstraint partNachFK = new ForeignKeyConstraint("partNachHiddenFK", parts.Columns["PartID"],
                partNach.Columns["PartID"]);
            partNach.Constraints.Add(partNachFK);
            ds.Relations.Add(new DataRelation("partNacn_parts", parts.Columns["PartID"],
                partNach.Columns["PartID"]));
            #endregion
            #region заношу данные в полученный DataSet...
            Console.Write("SmetaID: ");
            int id =Convert.ToInt32(Console.ReadLine());
            using (OleDbConnection cnn = new OleDbConnection(cnnBild.ConnectionString))
            {
                cnn.Open();
                OleDbCommand cmd = new OleDbCommand("select SmetaID, SmetaNomber, SmetaName from " +
                    "tblSmeta where SmetaID = " +
                    id.ToString(), cnn);
                OleDbDataReader dr = cmd.ExecuteReader();
                if (dr.HasRows) 
                {
                    estimates.Load(dr);
                    cmd.CommandText = "select PartID, PartNomber, PartName, pt.SmetaID from tblPartsSmet as pt inner join " +
                        "tblSmeta as sm on  sm.SmetaID=pt.SmetaID where pt.SmetaID = " + id.ToString() +
                        " order by PartNomber";
                    dr = cmd.ExecuteReader();
                    if (dr.HasRows) 
                    {
                        parts.Load(dr);
                        cmd.CommandText = "SELECT tblWorksSm.WorkSmID, tblWorksSm.WorkSmNomber, " +
                            "tblWorksSm.WorkSmName, tblWorksSm.WorkSmED, tblWorksSm.WorkSmValue, " +
                            " tblWorksSm.WorkSmCostGP, tblWorksSm.PartID FROM (tblSmeta INNER JOIN tblPartsSmet ON " +
                            "tblSmeta.SmetaID = tblPartsSmet.SmetaID) INNER JOIN tblWorksSm ON " +
                            "tblPartsSmet.PartID = tblWorksSm.PartID WHERE (((tblSmeta.SmetaID)=" + 
                            id.ToString() + ")) ORDER BY tblWorksSm.WorkSmNomber;";
                        dr = cmd.ExecuteReader();
                        if (dr.HasRows)
                        {
                            works.Load(dr);
                            cmd.CommandText = "SELECT tbl_sm_Mat.MatID, tbl_sm_Mat.MatName, tbl_sm_Mat.MatMarka, " +
                                "tbl_sm_Mat.MatED, tbl_sm_Mat.MatValue, tbl_sm_Mat.MatCost, tbl_sm_Mat.smWorkID " +
                                "FROM ((tblSmeta INNER JOIN tblPartsSmet ON tblSmeta.SmetaID = tblPartsSmet.SmetaID)" +
                                " INNER JOIN tblWorksSm ON tblPartsSmet.PartID = tblWorksSm.PartID) INNER JOIN " +
                                " tbl_sm_Mat ON tblWorksSm.WorkSmID = tbl_sm_Mat.smWorkID WHERE " +
                                " (((tblSmeta.SmetaID)=" + id.ToString() +
                                ")) ORDER BY tbl_sm_Mat.MatName, tbl_sm_Mat.MatMarka;";
                            dr = cmd.ExecuteReader();
                            if (dr.HasRows) materials.Load(dr);
                            cmd.CommandText = "SELECT tbl_sm_Meh.recID, tbl_sm_Meh.smMeh, tbl_sm_Meh.smMehMarka, " +
                                "tbl_sm_Meh.smMehED, tbl_sm_Meh.smMehValue, tbl_sm_Meh.smMehCost, " +
                                "tbl_sm_Meh.smWorkID FROM ((tblSmeta INNER JOIN tblPartsSmet ON " +
                                "tblSmeta.SmetaID = tblPartsSmet.SmetaID) INNER JOIN tblWorksSm ON " +
                                "tblPartsSmet.PartID = tblWorksSm.PartID) INNER JOIN tbl_sm_Meh ON " +
                                " tblWorksSm.WorkSmID = tbl_sm_Meh.smWorkID WHERE " +
                                "(((tblSmeta.SmetaID)=" + id.ToString() + 
                                ")) ORDER BY tbl_sm_Meh.smMeh, tbl_sm_Meh.smMehMarka;";
                            dr = cmd.ExecuteReader();
                            if (dr.HasRows) machines.Load(dr);
                        }
                        cmd.CommandText = "SELECT tblPartsSmet.PartID, tblKoeffGP.KoeffNomber, " + 
                            " tblKoeffGP.KoeffName, tblKoeffType.KoeffTypeName, tblKoeffType.koefNombers, " +
                            "tblKoeffGP.KoeffValue FROM tblKoeffType INNER JOIN ((tbl_grKoef INNER JOIN " +
                            "(tblSmeta INNER JOIN tblPartsSmet ON tblSmeta.SmetaID = tblPartsSmet.SmetaID) " +
                            "ON tbl_grKoef.grKoefID = tblPartsSmet.grKoefs) INNER JOIN tblKoeffGP ON " +
                            " tbl_grKoef.grKoefID = tblKoeffGP.grKoefID) ON tblKoeffType.KoeffTypeID = " +
                            "tblKoeffGP.KoeffType WHERE (((tblSmeta.SmetaID)=" + id.ToString() +
                            ")) ORDER BY tblPartsSmet.PartID, tblKoeffGP.KoeffNomber;";
                        dr = cmd.ExecuteReader();
                        if (dr.HasRows) partNach.Load(dr);
                    }
                }
            }
            #endregion
            #region Проверяю заполненность таблиц моего DataSet...
            Console.WriteLine("Количество закаченных смет: {0}", estimates.Rows.Count);
            Console.WriteLine("Количество разделов в смете: {0}", parts.Rows.Count);
            Console.WriteLine("Количество записей работ по смете: {0}", works.Rows.Count);
            Console.WriteLine("Количество записей материалов по смете: {0}", materials.Rows.Count);
            Console.WriteLine("Количество записей механизмов по смете: {0}", machines.Rows.Count);
            Console.WriteLine("Количество записей начислений по разделам: {0}", partNach.Rows.Count);
            #endregion
            ds.WriteXmlSchema(@"c:\MyDataSet.xsd");
            ds.WriteXml(@"c:\MyDataSet.xml");
            //Создаю объект отчета и открываю его в режиме дизайна...
            StiReport report = new StiReport();
            report.RegData("myData",ds);            
            report.Design();//ошибка вылезает здесь
            Console.Read();
            
        }
    }
}
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Не понятная ошибка

Сообщение compositum »

Подправляю код (смотрю что получится):

Код: Выделить всё

StiReport report = new StiReport();            
            report.RegData("myData",ds);
            report.Show();//открываю не в режиме дизайна, а в режиме просмотра
            //report.Design();            
            Console.Read();
Получаю это:

Изображение

зависает моментально... Я так понимаю, что вся проблема в том, что я вызываю отчет из консоли. хотя теоретически все должно работать - все референсы подключены.
Перекинул этот код на ВинФормз - заработало....
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Не понятная ошибка

Сообщение Edward »

Измените, пожалуйста, Ваш код следующим образом:

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Data;
using Stimulsoft.Report;
using System.Windows.Forms;
using System.Net;
using System.Threading;

namespace ConsoleProgramm
{
    class Program
    {     
        static StiReport report;
        [STAThread]
        static void Main(string[] args)
        {
            //Данные для формирования отчета получаю из файла аксесс
            //Создаю объект отчета и открываю его в режиме дизайна...
            report = new StiReport();
            report.RegData("myData",ds);
            Thread t = new Thread(new ThreadStart(A));
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }

        static void A()
        {
            report.Design();//ошибка вылезает здесь
        }
    }
}
Спасибо.
Аватара пользователя
compositum
Сообщения: 252
Зарегистрирован: 15 янв 2008, 15:12
Откуда: Санкт-Петербург

Не понятная ошибка

Сообщение compositum »

Edward писал(а): Измените, пожалуйста, Ваш код следующим образом...
Большое спасибо! Я как-то и не подумал даже в сторону [STAThread]... Хотя достаточно было добавить только этот атрибут (все заработало) - тем не менее я добавил и код, запускающий отчет в отдельном потоке, как вы и указали.

Изображение
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Не понятная ошибка

Сообщение Edward »

Дайте знать, если понадобится дополнительная помощь.
Ответить