5

SQL Server にストアド プロシージャがあります

CREATE PROCEDURE ParseXML (@InputXML xml)

入力パラメータのデータ型は「xml」です。

ストアド プロシージャの LINQ to SQL 生成コードでは、入力パラメーターは System.Xml.Linq.XElement です。

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.ParseXML")]
public ISingleResult<ParseXMLResult> ParseXML([global::System.Data.Linq.Mapping.ParameterAttribute(Name="InputXML", DbType="Xml")] System.Xml.Linq.XElement inputXML)

さて、次の List を ParseXML メソッドに渡して、ストアド プロシージャを機能させるにはどうすればよいでしょうか。

編集

答えを読んだ後 - 別の解決策を以下に示します

XElement root = new XElement("ArrayOfBankAccountDTOForStatus",
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema"));


foreach (var element in bankAccountDTOList)
{

 XElement ex= new XElement("BankAccountDTOForStatus", 
                      new XElement("BankAccountID", element.BankAccountID),
                      new XElement("Status", element.Status));


 root.Add(ex);
} 

問題のコード

        string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";
        var theDataContext = new DBML_Project.MyDataClassesDataContext(connectionstring);

        List<DTOLayer.BankAccountDTOForStatus> bankAccountDTOList = new List<DTOLayer.BankAccountDTOForStatus>();
        DTOLayer.BankAccountDTOForStatus presentAccount1 = new DTOLayer.BankAccountDTOForStatus();
        presentAccount1.BankAccountID = 5;
        presentAccount1.Status = "FrozenF13";

        DTOLayer.BankAccountDTOForStatus presentAccount2 = new DTOLayer.BankAccountDTOForStatus();
        presentAccount2.BankAccountID = 6;
        presentAccount2.Status = "FrozenF23";
        bankAccountDTOList.Add(presentAccount1);
        bankAccountDTOList.Add(presentAccount2);

        //theDataContext.ParseXML(inputXML);

必要な XML 構造

ここに画像の説明を入力

注: この XML は、XML としてデータベースに直接格納するためではなく、一部の操作に使用されます。XML からのデータを一覧表示する選択クエリを作成する必要があります。

ストアド プロシージャ ロジック

DECLARE @MyTable TABLE (RowNumber int, BankAccountID int, StatusVal varchar(max))

INSERT INTO @MyTable(RowNumber, BankAccountID,StatusVal)

SELECT ROW_NUMBER() OVER(ORDER BY c.value('BankAccountID[1]','int') ASC) AS Row,
    c.value('BankAccountID[1]','int'),
    c.value('Status[1]','varchar(32)')
FROM
    @inputXML.nodes('//BankAccountDTOForStatus') T(c);

読む

  1. Linq to SQL を使用して、オブジェクトをシリアル化してデータベースに Xml として保存する方法

  2. XElement の名前が同じ場合に LINQ クエリを使用して XElement 値を取得する方法

  3. XML データベース フィールドを使用した Linq-to-SQL -- なぜ機能するのか?

  4. http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=176385

4

2 に答える 2

7

次のように、リストを XML フラグメントに変換できます。

        IEnumerable<XElement> el = list.Select(i => 
                            new XElement("BankAccountDTOForStatus", 
                              new XElement("BankAccountID", i.BankAccountID),
                              new XElement("Status", i.Status)
                            ));

次に、それを XElement に変換できます。

        XElement root = new XElement("root", el);

これで、XElement タイプのパラメーター inputXML としてそれを ParseXML に渡すことができます。ストアド プロシージャでは、次のように処理します。

DECLARE @InputXML NVARCHAR(1024) = N'
<root>
 <BankAccountDTOForStatus>
     <BankAccountID>2</BankAccountID>
     <Status>FrozenFA</Status>
 </BankAccountDTOForStatus>
 <BankAccountDTOForStatus>
     <BankAccountID>3</BankAccountID>
     <Status>FrozenSB</Status>
 </BankAccountDTOForStatus>
</root>'

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @InputXML

SELECT  *
FROM    OPENXML(@handle, '/root/BankAccountDTOForStatus', 1)
WITH    (
            BankAccountID INT 'BankAccountID/text()',
            Status VARCHAR(128) 'Status/text()'
)

EXEC sp_xml_removedocument @handle
于 2012-07-04T08:06:17.243 に答える
2

次のようなものが必要です。

  • 入力 XML を定義します - たとえば、文字列として
  • それをに変換しますXDocument
  • XDocument.RootLinq-to-SQL データ コンテキストの ParseXML メソッドに を渡します

したがって、コードは次のようになります。

// define input XML - e.g. load from file or whatever
string xmlInput =
            @"<ArrayOfBankAccountDTOForStatus>
                         <BankAccountDTOForStatus>
                             <BankAccountID>2</BankAccountID>
                             <Status>FrozenFA</Status>
                         </BankAccountDTOForStatus>
                         <BankAccountDTOForStatus>
                             <BankAccountID>3</BankAccountID>
                             <Status>FrozenSB</Status>
                         </BankAccountDTOForStatus>
                     </ArrayOfBankAccountDTOForStatus>";

// convert that into a XDocument
XDocument doc = XDocument.Parse(xmlInput);

// using your DataContext - call ParseXML
using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    var result = ctx.ParseXML(doc.Root);
}

以上です!これで、XML がストアド プロシージャに渡され、そこで処理されます。

于 2012-07-04T07:45:32.487 に答える