private static void SqlDataReaderToXml( SqlDataReader AReader, //DataTable ADataTable, XmlTextWriter AWriter, Boolean ASkipNameColumn, String ARowTag, TRowSetMap AMap ) { const String ROW_TAG = "ROW"; const String METADATA_TAG = "METADATA"; const String FIELD_TAG = "FIELD"; const String NONAME_FIELD_PREFIX = "FIELD"; int i, start_field_index = ASkipNameColumn ? 1 : 0, empty_name_field_no = 1; String FieldName; DataTable LDataTable = AReader.GetSchemaTable(); List<TFieldAlias> LFields = new List<TFieldAlias>(); TFieldAlias LField; int FieldCount = AReader.FieldCount; if(AMap.Fields.Length > 0) { foreach (String FieldMap in AMap.Fields.Split(new char[] {','})) { i = FieldMap.IndexOf('='); if(i >= 0) { LField.Name = FieldMap.Substring(0, i); FieldName = FieldMap.Substring(i + 1); } else { LField.Name = FieldMap; FieldName = FieldMap; } for(i = start_field_index; i < FieldCount; i++) { if(FieldName.Equals(AReader.GetName(i), StringComparison.InvariantCultureIgnoreCase)) break; } if((i < 0) || (i >= FieldCount)) throw new SystemException("RowSet Field = [" + FieldName + "] not found."); // LField.Name = XmlConvert.EncodeLocalName(LField.Name); LField.FieldIndex = i; LFields.Add(LField); //AWriter.WriteStartAttribute(LField.Name); //AWriter.WriteValue(SqlMetaDataToString(LDataTable.Rows[i])); } } else { for(LField.FieldIndex = start_field_index; LField.FieldIndex < FieldCount; LField.FieldIndex++) { FieldName = AReader.GetName(LField.FieldIndex); if(FieldName.Length == 0) FieldName = NONAME_FIELD_PREFIX + (empty_name_field_no++).ToString(); LField.Name = FieldName; //LField.Name = XmlConvert.EncodeLocalName(FieldName); LFields.Add(LField); //AWriter.WriteStartAttribute(LField.Name); //AWriter.WriteValue(SqlMetaDataToString(LDataTable.Rows[LField.FieldIndex])); } } AWriter.WriteStartElement(METADATA_TAG); for (i = 0; i < LFields.Count; i++) { AWriter.WriteStartElement(FIELD_TAG); AWriter.WriteStartAttribute(ATTRIBUTE_INDEX); AWriter.WriteValue(i + 1); AWriter.WriteStartAttribute(ATTRIBUTE_NAME); AWriter.WriteValue(LFields[i].Name); AWriter.WriteStartAttribute(ATTRIBUTE_TYPE); AWriter.WriteValue(SqlMetaDataToString(LDataTable.Rows[LFields[i].FieldIndex])); AWriter.WriteEndElement(); } AWriter.WriteEndElement(); object Value; while (AReader.Read()) { AWriter.WriteStartElement(ARowTag ?? ROW_TAG); for (i = 0; i < LFields.Count; i++) { Value = AReader.GetValue(LFields[i].FieldIndex); if (Value != DBNull.Value) // NULL пропускаем { AWriter.WriteStartAttribute(XmlConvert.EncodeLocalName(LFields[i].Name)); try { AWriter.WriteValue(Value); } catch (InvalidCastException) { AWriter.WriteValue(Value.ToString()); } AWriter.WriteEndAttribute(); } } AWriter.WriteEndElement(); } }
private static void SendTable(SqlDataReader reader, TRowSetMap Map) { //SqlDataRecord ReadRecord = new SqlDataRecord(DataReaderFields(reader)); DataTable LDataTable = reader.GetSchemaTable(); SqlDataRecord WriteRecord; List<TFieldAlias> Fields = new List<TFieldAlias>(); TFieldAlias Field; string FieldName; int FieldCount = reader.FieldCount, WriteFieldCount = 0; int i; SqlMetaData[] WriteFields; if(Map.Fields.Length > 0) { WriteFields = new SqlMetaData[0]; foreach (string FieldMap in Map.Fields.Split(new char[] {','})) { i = FieldMap.IndexOf('='); if(i >= 0) { Field.Name = FieldMap.Substring(0, i); FieldName = FieldMap.Substring(i + 1); } else { Field.Name = FieldMap; FieldName = FieldMap; } for(i = 0; i < FieldCount; i++) { if(FieldName.ToUpper() == reader.GetName(i).ToUpper()) break; } if((i < 0) || (i >= FieldCount)) throw new SystemException("RowSet Field = [" + FieldName + "] not found."); Field.FieldIndex = i; Fields.Add(Field); Array.Resize(ref WriteFields, ++WriteFieldCount); //WriteFields[WriteFieldCount - 1] = SqlMetaData(LDataTable.Rows[WriteFieldCount - 1], Field.Name); WriteFields[WriteFieldCount - 1] = SqlMetaData(LDataTable.Rows[Field.FieldIndex], Field.Name); } } else { WriteFields = new SqlMetaData[FieldCount]; for (; WriteFieldCount < reader.FieldCount; WriteFieldCount++) WriteFields[WriteFieldCount] = SqlMetaData(LDataTable.Rows[WriteFieldCount]); } WriteRecord = new SqlDataRecord(WriteFields); try { SqlContext.Pipe.SendResultsStart(WriteRecord); Object[] values = new Object[FieldCount]; while (reader.Read()) { reader.GetValues(values); if(Map.Fields.Length > 0) { for(i = 0; i < WriteFieldCount; i++) WriteRecord.SetValue(i, values[Fields[i].FieldIndex]); } else { WriteRecord.SetValues(values); } SqlContext.Pipe.SendResultsRow(WriteRecord); } } finally { SqlContext.Pipe.SendResultsEnd(); } }