0

次のような XML ドキュメントを解析する必要があります。

    <?xml version="1.0" encoding="utf-8" ?>
    <DialsList>
      <Dial>
        <Id>123</Id>
        <Source>SQL</Source>
        <Server>myServer</Server>
        <Database>myDB</Database>
        <UserName>myUserName</UserName>
        <Password>myPassword</Password>
        <TableName>myTable</TableName>
        <Query>GetAvgForUser</Query>
        <Parameters>
          <Param1>
            <Name>@DialId</Name>
            <Type>Int</Type>
          </Param1>
          <Param2>
            <Name>@UserId</Name>
            <Type>String</Type>
          </Param2>
        </Parameters>
      </Dial>
      <Dial>
    <Id>789</Id>
    <Source>SQL</Source>
    <Server>someServer</Server>
    <Database>someDB</Database>
    <UserName>someUser</UserName>
    <Password>somePwd</Password>
    <TableName>someTbl</TableName>
    <Query>someQry</Query>
    <Parameters>
      <Param1>
        <Name>@myParam</Name>
        <Type>Int</Type>
      </Param1>
      <Param2>
        <Name>@anotherParam</Name>
        <Type>String</Type>
      </Param2>
    </Parameters>
  </Dial>
    </DialsList>

<Query>アプリケーションは、この XML ドキュメントを読み取り、接続文字列を形成し、ノードで指定されたクエリ/ストアド プロシージャを実行する必要があります。接続文字列の形成に問題はありません。それは任意のストアド プロシージャであり、任意の数を持つことができるためparameters、この XML を解析する方法がわかりません。XML は動的になります - パラメータ、パラメータ名、パラメータ タイプなど。そしてそれは私の支配下にありません。これまでのところ、パラメーターが1つしかない場合に機能するこのコードがあります(「int」になると想定しています):

    XDocument doc = XDocument.Load(xmlFileName);
    string dialID = Convert.ToString(DialId);
    XElement DialsDoc = (from xml2 in doc.Descendants("Dial")                       where xml2.Element("Id").Value == dialID                                              select xml2).FirstOrDefault();
    dialDataSrc.Source = DialsDoc.Element("Source").Value.ToString();
    if (dialDataSrc.Source.ToString() == "SQL")
    {
        DataSource dialDataSrc = new DataSource();
        dialDataSrc.MethodNameIndividual = string.Empty;
        dialDataSrc.MethodNameGroup = string.Empty;
        dialDataSrc.Server = DialsDoc.Element("Server").Value.ToString();
        dialDataSrc.Database = DialsDoc.Element("Database").Value.ToString();
        dialDataSrc.Username = DialsDoc.Element("UserName").Value.ToString();
        dialDataSrc.Password = DialsDoc.Element("Password").Value.ToString();
        dialDataSrc.TableName = DialsDoc.Element("TableName").Value.ToString();
        dialDataSrc.Query = DialsDoc.Element("Query").Value.ToString();
        dialDataSrc.Parameters = DialsDoc.Element("Parameters").Value.ToString();
    }

次に、接続文字列を作成し、ストアド プロシージャを実行します。動的な場合、これを処理するにはどうすればよいですか?

4

1 に答える 1

2

dialDataSrc の Type を把握できませんが、これで問題が解決するはずです。

var listOfparameters = DialsDoc
        .Element("Parameters")
        .Elements()
        .Select(p => MyCreateParam((string) p.Element("Name"), (string) p.Element("Type")))
        .ToList();

DbTypeなどを把握するための小さなヘルパーメソッドを使用:

private SqlParameter MyCreateParam(string name, string _type) { ... }
于 2013-09-13T07:07:40.420 に答える