как создать пользовательский компонент ssis, который используется для преобразования XML-данных в место назначения oledb - PullRequest
1 голос
/ 04 июля 2019

Я хочу разработать пользовательский компонент SSIS, который берет путь документа XML с локального компьютера, а затем читает этот документ XML в соответствии с тем, что если есть корневой узел, то циклически перебираю документ и выбираю корневой узел, а также перебираю другой родительский элемент исоответствующие дочерние элементы.С помощью XML-файла я хочу, чтобы он автоматически генерировал столбец таблицы и поля, которые я хочу затем передать в OLE DB Destination.

Я пробую это с примером XML-документа, но я не знаю правильный путьпрочитать файл XML и в соответствии с этим сделать столбец и типы данных для OLE DB Destination

Вот мой код для этого конкретного компонента, это метод, который

public DataTable GetRSSDataTable(String xmlpath)
{
    DataTable dt = new DataTable();
    try
    {
        XmlReader reader = XmlReader.Create(xmlpath);
        XmlDocument document = new XmlDocument();
        document.Load(reader);

        dt.Columns.Add("Title", Type.GetType("System.String"));
        //dt.Columns.Add("pubDate", Type.GetType("System.DateTime"));
        dt.Columns.Add("URL", Type.GetType("System.String"));

        foreach (XmlNode node in document.DocumentElement)
        {
            DataRow dRow = dt.NewRow();
            dRow["Title"] = node.InnerText;
            //dRow["PublishDate"] = node.Attributes[1].ToString();
            dRow["URL"] = node.InnerText;
            dt.Rows.Add(dRow);
        }

        return dt;
    }
    catch (Exception e)
    {
        throw e;
    }

}

public void AddOutputColumns(String propertyValue)
    {
        DataTable dt = GetRSSDataTable(propertyValue);
        if (dt != null)
        {
            //Check if there are any rows in the datatable
            if (dt.Rows != null && dt.Rows.Count > 0)
            {
                DataTable schemaDT = dt.CreateDataReader().GetSchemaTable();
                foreach (DataRow row in schemaDT.Rows)
                {
                    IDTSOutputColumn100 outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();

                    bool isLong = false;
                    DataType dType = DataRecordTypeToBufferType((Type)row["DataType"]);
                    dType = ConvertBufferDataTypeToFitManaged(dType, ref isLong);
                    int length = ((int)row["ColumnSize"]) == -1 ? 1000 : (int)row["ColumnSize"];
                    int precision = row["NumericPrecision"] is System.DBNull ? 0 : (short)row["NumericPrecision"];
                    int scale = row["NumericScale"] is System.DBNull ? 0 : (short)row["NumericScale"];
                    int codePage = schemaDT.Locale.TextInfo.ANSICodePage;

                switch (dType)
                {
                    case DataType.DT_STR:
                    case DataType.DT_TEXT:
                        precision = 0;
                        scale = 0;
                        break;
                    case DataType.DT_NUMERIC:
                        length = 0;
                        codePage = 0;
                        if (precision > 38)
                            precision = 38;
                        if (scale > precision)
                            scale = precision;
                        break;
                    case DataType.DT_DECIMAL:
                        length = 0;
                        precision = 0;
                        codePage = 0;
                        if (scale > 28)
                            scale = 28;
                        break;
                    case DataType.DT_WSTR:
                        precision = 0;
                        scale = 0;
                        codePage = 0;
                        break;
                    default:
                        length = 0;
                        precision = 0;
                        scale = 0;
                        codePage = 0;
                        break;
                }

                outputCol.Name = row["ColumnName"].ToString();
                outputCol.SetDataTypeProperties(dType, length, precision, scale, codePage);
            }
        }
    }
}

Остальной код тот же самыйкоторый мы используем, чтобы сделать любой пользовательский компонент

На самом деле я хочу знать, какой из них является лучшим способом для чтения данных в XML-файле на локальном компьютере и, во-вторых, в соответствии с этой информацией, как создавать выходные столбцы и данные в этих столбцахкоторый требуется передать в пункт назначения OLE DB.Пожалуйста, помогите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...