Кодирование для создания таблицы SQL из формы InfoPath 2003, не зная заранее полей - PullRequest
0 голосов
/ 16 августа 2011

Использование: InfoPath 2003 (и его XML), Microsoft SQL Server 2005, Visual Studio 2005, C # (для создания веб-службы)

Я пытался что-то найтиэто уже делается, и либо мои навыки Google не работают, либо это на самом деле невозможно, потому что я не могу поверить, что это кому-то уже не нужно.

Я пытаюсь создать веб-службу, которая требуетформа InfoPath, получает список всех полей из формы (и связанные с ними ожидаемые типы данных, если пользователь обеспокоен проверкой) и создает таблицу в базе данных SQL с теми же полями и ожидаемыми типами (вероятно, используя varchar в качестветип по умолчанию, где проверка не использовалась).Я не могу просто перечислить поля заранее, потому что теоретически менеджеры и инженеры будут создавать новые формы для самых разных целей, и мне нужно избегать их путаницы или предоставления им прямого доступа к серверу.

Я никогда не делал ничего подобного раньше и не использовал XML (или C #, если на то пошло).Прежде чем сводить себя с ума, пытаясь заставить все работать, я должен знать: возможно ли это?Я знаю, что XML-документы в основном состоят из пользовательских тегов, и я не знаю, есть ли способ отличить поля формы от любых других тегов, связанных с правильным отображением документа.Я также не знаю, есть ли методы для получения ожидаемых типов данных.Если это возможно, любые указания о том, как это будет оценено.


Обновление

Судя по форме InfoPath на уровне XML, кажется, что всеполя содержатся в теге <my:myFields>.Он также содержит тег <xd:SchemaInfo>, так что теперь я должен выяснить, как получить доступ ко всем полям, игнорируя это.

Я до сих пор не знаю, пытаюсь ли я что-то сделатьэто странно, невозможно по другой причине или из-за плохой практики, поэтому совет от людей, которые знают вещи, всегда приветствуется.

1 Ответ

1 голос
/ 17 августа 2011

Да, это вполне возможно.Единственное, что вам нужно убедиться, это то, что менеджеры / инженеры отправляют свои формы на ваш веб-сервис в виде строки, как показано на этом скриншоте.

enter image description here

Причина, по которой вам нужноотправить форму в виде строки просто - вы не можете настроить IP для прямой отправки объекта XmlDocument.Это возможно, однако вам нужен собственный код в каждой форме, которую вы / ваши коллеги создаете, поэтому я бы предложил использовать решение без кода.

Вот как вы можете реализовать метод веб-службы.

[WebMethod]
public void CreateTable(string infoPathData)
{
    var doc = new XmlDocument();
    doc.LoadXml(infoPathData);

    //gets the namespace uri - it is unique for each form
    string nsUri = doc.ChildNodes[3].Attributes["xmlns:my"].Value;

    var nsManager = new XmlNamespaceManager(doc.NameTable);
    nsManager.AddNamespace("my", nsUri);

    //select the myField node
    var root = doc.SelectSingleNode("my:myFields", nsManager);

    var sqlStatement = new StringBuilder();
    sqlStatement.Append("CREATE TABLE ....");

    foreach (XmlNode n in root.ChildNodes)
    {
        //n.Name - gets the name of the node (incl. NS)
        //n.InnerText - gets the field value 

        //append to sqlStatement
    }

    //execute sql statement ...
}

Вы создаете XmlDocument из отправленных данных IP, а затем перебираете его поля.В зависимости от ваших требований, вам также может понадобиться перебирать дочерние узлы (то есть, если форма содержит папки / повторяющиеся таблицы и т. Д.), Но это действительно ваше дело; -)

Если вы никогда раньше не работали с XmlDocument,Обязательно ознакомьтесь с этой ссылкой http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

Вам нужно будет применить некоторые конкретные правила для людей, которые используют ваш веб-сервис, например, что происходит, когда кто-то переименовывает «my: myFields» в «my: myBlaBla» (которыйвозможно) и отправляет свою форму на ваш веб-сервис.Также я предлагаю очень тяжелую регистрацию ошибок, потому что при таком общем подходе что-то может (и будет!) Пойти не так.

Единственная проблема, о которой я могу подумать, - это как определить тип данных каждого поляпотому что он не включен в данные формы InfoPath.Вы можете попробовать обычные методы преобразования C # (например, Int32.TryParse и т. Д.).

Надеюсь, это поможет: -)

...