ListDictionary _Items;                          // list of report items

        public DataSourcesDefn(ReportDefn r, ReportLink p, XmlNode xNode) : base(r, p)
        {
            // Run thru the attributes
//			foreach(XmlAttribute xAttr in xNode.Attributes)
//			{
//			}
            _Items = new ListDictionary();
            // Loop thru all the child nodes
            foreach (XmlNode xNodeLoop in xNode.ChildNodes)
            {
                if (xNodeLoop.NodeType != XmlNodeType.Element)
                {
                    continue;
                }
                if (xNodeLoop.Name == "DataSource")
                {
                    DataSourceDefn ds = new DataSourceDefn(r, this, xNodeLoop);
                    if (ds.Name != null)
                    {
                        _Items.Add(ds.Name.Nm, ds);
                    }
                }
            }
            if (_Items.Count == 0)
            {
                OwnerReport.rl.LogError(8, "For DataSources at least one DataSource is required.");
            }
        }
예제 #2
0
        public bool AreSameDataSource(DataSourceDefn dsd)
        {
            if (this.DataSourceReference != null &&
                this.DataSourceReference == dsd.DataSourceReference)
            {
                return(true);                           // datasource references are the same
            }
            if (this.ConnectionProperties == null ||
                dsd.ConnectionProperties == null)
            {
                return(false);
            }

            ConnectionProperties cp1 = this.ConnectionProperties;
            ConnectionProperties cp2 = dsd.ConnectionProperties;

            return(cp1.DataProvider == cp2.DataProvider &&
                   cp1.ConnectstringValue == cp2.ConnectstringValue &&
                   cp1.IntegratedSecurity == cp2.IntegratedSecurity);
        }
		ListDictionary _Items;			// list of report items

		public DataSourcesDefn(ReportDefn r, ReportLink p, XmlNode xNode) : base(r, p)
		{
			// Run thru the attributes
//			foreach(XmlAttribute xAttr in xNode.Attributes)
//			{
//			}
			_Items = new ListDictionary();
			// Loop thru all the child nodes
			foreach(XmlNode xNodeLoop in xNode.ChildNodes)
			{
				if (xNodeLoop.NodeType != XmlNodeType.Element)
					continue;
				if (xNodeLoop.Name == "DataSource")
				{
					DataSourceDefn ds = new DataSourceDefn(r, this, xNodeLoop);
					if (ds.Name != null)
						_Items.Add(ds.Name.Nm, ds);
				}
			}
			if (_Items.Count == 0)
				OwnerReport.rl.LogError(8, "For DataSources at least one DataSource is required.");
		}
		public bool AreSameDataSource(DataSourceDefn dsd)
		{
			if (this.DataSourceReference != null &&
				this.DataSourceReference == dsd.DataSourceReference)
				return true;		// datasource references are the same

			if (this.ConnectionProperties == null ||
				dsd.ConnectionProperties == null)
				return false;

			ConnectionProperties cp1 = this.ConnectionProperties;
			ConnectionProperties cp2 = dsd.ConnectionProperties;
			return (cp1.DataProvider == cp2.DataProvider &&
				cp1.ConnectstringValue == cp2.ConnectstringValue &&
				cp1.IntegratedSecurity == cp2.IntegratedSecurity);
		}
예제 #5
0
        public bool GetData(Report rpt, Fields flds, Filters f)
        {
            Rows uData = this.GetMyUserData(rpt);

            if (uData != null)
            {
                this.SetMyData(rpt, uData);
                return(uData.Data == null || uData.Data.Count == 0 ? false : true);
            }

            // Treat this as a SQL statement
            DataSourceDefn ds = _DataSourceDefn;

            if (ds == null || _CommandText == null)
            {
                this.SetMyData(rpt, null);
                return(false);
            }

            IDbConnection cnSQL = ds.SqlConnect(rpt);

            if (cnSQL == null)
            {
                this.SetMyData(rpt, null);
                return(false);
            }

            Rows        _Data = new Rows(rpt, null, null, null);                // no sorting and grouping at base data
            String      sql   = _CommandText.EvaluateString(rpt, null);
            IDbCommand  cmSQL = null;
            IDataReader dr    = null;

            try
            {
                cmSQL             = cnSQL.CreateCommand();
                cmSQL.CommandText = AddParametersAsLiterals(rpt, cnSQL, sql, true);
                if (this._QueryCommandType == QueryCommandTypeEnum.StoredProcedure)
                {
                    cmSQL.CommandType = CommandType.StoredProcedure;
                }
                if (this._Timeout > 0)
                {
                    cmSQL.CommandTimeout = this._Timeout;
                }

                AddParameters(rpt, cnSQL, cmSQL, true);
                dr = cmSQL.ExecuteReader(CommandBehavior.SingleResult);

                List <Row> ar = new List <Row>();
                _Data.Data = ar;
                int rowCount   = 0;
                int maxRows    = _RowLimit > 0? _RowLimit: int.MaxValue;
                int fieldCount = flds.Items.Count;

                // Determine the query column number for each field
                int[] qcn = new int[flds.Items.Count];
                foreach (Field fld in flds)
                {
                    qcn[fld.ColumnNumber] = -1;
                    if (fld.Value != null)
                    {
                        continue;
                    }
                    try
                    {
                        qcn[fld.ColumnNumber] = dr.GetOrdinal(fld.DataField);
                    }
                    catch
                    {
                        qcn[fld.ColumnNumber] = -1;
                    }
                }

                while (dr.Read())
                {
                    Row or = new Row(_Data, fieldCount);

                    foreach (Field fld in flds)
                    {
                        if (qcn[fld.ColumnNumber] != -1)
                        {
                            or.Data[fld.ColumnNumber] = dr.GetValue(qcn[fld.ColumnNumber]);
                        }
                    }

                    // Apply the filters
                    if (f == null || f.Apply(rpt, or))
                    {
                        or.RowNumber = rowCount;                                //
                        rowCount++;
                        ar.Add(or);
                    }
                    if (--maxRows <= 0)                                                 // don't retrieve more than max
                    {
                        break;
                    }
                }
                ar.TrimExcess();                // free up any extraneous space; can be sizeable for large # rows
                if (f != null)
                {
                    f.ApplyFinalFilters(rpt, _Data, false);
                }
//#if DEBUG
//				rpt.rl.LogError(4, "Rows Read:" + ar.Count.ToString() + " SQL:" + sql );
//#endif
            }
            catch (Exception e)
            {
                rpt.rl.LogError(8, "SQL Exception" + e.Message + "\r\n" + e.StackTrace);
            }
            finally
            {
                if (cmSQL != null)
                {
                    cmSQL.Dispose();
                    if (dr != null)
                    {
                        dr.Close();
                    }
                }
            }
            this.SetMyData(rpt, _Data);
            return(_Data == null || _Data.Data == null || _Data.Data.Count == 0 ? false : true);
        }
예제 #6
0
        // Handle parsing of function in final pass
        override public void FinalPass()
        {
            if (_CommandText != null)
            {
                _CommandText.FinalPass();
            }
            if (_QueryParameters != null)
            {
                _QueryParameters.FinalPass();
            }

            // verify the data source
            DataSourceDefn ds = null;

            if (OwnerReport.DataSourcesDefn != null &&
                OwnerReport.DataSourcesDefn.Items != null)
            {
                ds = OwnerReport.DataSourcesDefn[_DataSourceName];
            }
            if (ds == null)
            {
                OwnerReport.rl.LogError(8, "Query references unknown data source '" + _DataSourceName + "'");
                return;
            }
            _DataSourceDefn = ds;

            IDbConnection cnSQL = ds.SqlConnect(null);

            if (cnSQL == null || _CommandText == null)
            {
                return;
            }

            // Treat this as a SQL statement
            String      sql   = _CommandText.EvaluateString(null, null);
            IDbCommand  cmSQL = null;
            IDataReader dr    = null;

            try
            {
                cmSQL             = cnSQL.CreateCommand();
                cmSQL.CommandText = AddParametersAsLiterals(null, cnSQL, sql, false);
                if (this._QueryCommandType == QueryCommandTypeEnum.StoredProcedure)
                {
                    cmSQL.CommandType = CommandType.StoredProcedure;
                }

                AddParameters(null, cnSQL, cmSQL, false);
                dr = cmSQL.ExecuteReader(CommandBehavior.SchemaOnly);
                if (dr.FieldCount < 10)
                {
                    _Columns = new ListDictionary();                            // Hashtable is overkill for small lists
                }
                else
                {
                    _Columns = new Hashtable(dr.FieldCount);
                }

                for (int i = 0; i < dr.FieldCount; i++)
                {
                    QueryColumn qc = new QueryColumn(i, dr.GetName(i), Type.GetTypeCode(dr.GetFieldType(i)));

                    try { _Columns.Add(qc.colName, qc); }
                    catch                       // name has already been added to list:
                    {                           // According to the RDL spec SQL names are matched by Name not by relative
                                                //   position: this seems wrong to me and causes this problem; but
                                                //   user can fix by using "as" keyword to name columns in Select
                                                //    e.g.  Select col as "col1", col as "col2" from tableA
                        OwnerReport.rl.LogError(8, String.Format("Column '{0}' is not uniquely defined within the SQL Select columns.", qc.colName));
                    }
                }
            }
            catch (Exception e)
            {
                OwnerReport.rl.LogError(4, "SQL Exception during report compilation: " + e.Message + "\r\nSQL: " + sql);
            }
            finally
            {
                if (cmSQL != null)
                {
                    cmSQL.Dispose();
                    if (dr != null)
                    {
                        dr.Close();
                    }
                }
            }

            return;
        }
예제 #7
0
		DataSourceDefn _dsd;	// DataSource definition

		public DataSource(Report rpt, DataSourceDefn dsd)
		{
			_rpt = rpt;
			_dsd = dsd;
		}
예제 #8
0
		// Handle parsing of function in final pass
		override public void FinalPass()
		{
			if (_CommandText != null)
				_CommandText.FinalPass();
			if (_QueryParameters != null)
				_QueryParameters.FinalPass();

			// verify the data source
			DataSourceDefn ds=null;
			if (OwnerReport.DataSourcesDefn != null &&
				OwnerReport.DataSourcesDefn.Items != null)
			{
				ds = OwnerReport.DataSourcesDefn[_DataSourceName];
			}
			if (ds == null)
			{
				OwnerReport.rl.LogError(8, "Query references unknown data source '" + _DataSourceName + "'");
				return;
			}
			_DataSourceDefn = ds;

			IDbConnection cnSQL = ds.SqlConnect(null);
			if (cnSQL == null || _CommandText == null)
				return;

			// Treat this as a SQL statement
			String sql = _CommandText.EvaluateString(null, null);
			IDbCommand cmSQL=null;
			IDataReader dr=null;
			try 
			{
				cmSQL = cnSQL.CreateCommand();		
				cmSQL.CommandText = AddParametersAsLiterals(null, cnSQL, sql, false);
                if (this._QueryCommandType == QueryCommandTypeEnum.StoredProcedure)
                    cmSQL.CommandType = CommandType.StoredProcedure;

				AddParameters(null, cnSQL, cmSQL, false);
				dr = cmSQL.ExecuteReader(CommandBehavior.SchemaOnly);
				if (dr.FieldCount < 10)
					_Columns = new ListDictionary();	// Hashtable is overkill for small lists
				else
					_Columns = new Hashtable(dr.FieldCount);

				for (int i=0; i < dr.FieldCount; i++)
				{ 
					QueryColumn qc = new QueryColumn(i, dr.GetName(i), Type.GetTypeCode(dr.GetFieldType(i)) );

					try { _Columns.Add(qc.colName, qc); }
					catch	// name has already been added to list: 
					{	// According to the RDL spec SQL names are matched by Name not by relative
						//   position: this seems wrong to me and causes this problem; but 
						//   user can fix by using "as" keyword to name columns in Select 
						//    e.g.  Select col as "col1", col as "col2" from tableA
						OwnerReport.rl.LogError(8, String.Format("Column '{0}' is not uniquely defined within the SQL Select columns.", qc.colName));
					}
				}
			}
			catch (Exception e)
			{
				OwnerReport.rl.LogError(4, "SQL Exception during report compilation: " + e.Message + "\r\nSQL: " + sql);
			}
			finally
			{
				if (cmSQL != null)
				{
					cmSQL.Dispose();
					if (dr != null)
						dr.Close();
				}
			}

			return;
		}
예제 #9
0
        DataSourceDefn _dsd;    // DataSource definition

        public DataSource(Report rpt, DataSourceDefn dsd)
        {
            _rpt = rpt;
            _dsd = dsd;
        }