ASP.NET/VB.NET помощь в решении проблем! - PullRequest
1 голос
/ 01 апреля 2010

У меня проблема, с которой мне нужна помощь. По сути, я собираюсь разработать форму (часть более крупного веб-приложения), в которой будет перечислено множество клиентов, а также бизнес-контакт, технический контакт 1 и технический контакт 2.

Идея заключается в быстром вводе данных. Итак, одна форма показывает каждого клиента с его контактами в выпадающих списках, и я могу изменить каждого из них, а затем нажать кнопку сохранения, чтобы выполнить массовое сохранение.

база данных выглядит так:

tblClient

ClientID

ClientName

BusinessContact

Tech1

Tech2

Моя идея заключалась в том, чтобы использовать ретранслятор для форматирования данных следующим образом:

Клиент

Деловой контакт

Tech1

Tech2

Client2

Деловой контакт

Tech1

Tech2

Что я застрял на том, как сделать массовое обновление? Могу ли я сделать что-то подобное для каждого элемента в Repeater1, а затем выполнить оператор SQL обновления? - Джонси

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

Ручной подход состоит в том, чтобы отформатировать данные в блок XML и передать их в хранимую процедуру, где затем можно создать инструкцию UPDATE, которая присоединяется к XML для выполнения обновления за один раз.

XML, который вы хотели бы создать, был бы похож на:

<ClientData>
    <Client ClientID="1" BusinessContact="..." Tech1="..." Tech2="..." />
    <Client ClientID="2" ... />
    ...
</ClientData>

Один из способов создать это, используя XmlWriter и зацикливая свой ретранслятор для сбора данных. В VB.NET:

Dim stream As New System.IO.MemoryStream
Dim settings As New System.Xml.XmlWriterSettings

settings.Encoding = Encoding.GetEncoding("iso-8859-1") 'This encoding handles special characters pasted in from MS Word

Dim writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(stream, settings)

With writer
    .WriteStartElement("ClientData")
    For Each item As RepeaterItem In myRepeater.Items
        .WriteStartElement("Client")
        .WriteAttributeString("ClientId", CType(item.FindControl("ClientIdHidden"), HtmlInputHidden).Value)
        .WriteAttributeString("BusinessContact", CType(item.FindControl("BusinessContact"), TextBox).Text)
        ...
        .WriteEndElement()
    Next
    .WriteEndElement()
    .Flush()
End With

Dim xmlString As String = writer.Settings.Encoding.GetString(stream.ToArray())

Затем создайте хранимую процедуру, которая принимает параметр, который вы можете передать в XML:

CREATE PROCEDURE [dbo].[BulkUpdateClients]
(
    @xmlInput AS text
)
AS

DECLARE @xmlHandle int

EXEC sp_xml_preparedocument @xmlHandle output, @xmlInput

UPDATE c
SET
    BusinessContact = x.BusinessContact,
    Tech1 = x.Tech1,
    Tech2 = x.Tech2
FROM tblClient c
    JOIN 
    (
        SELECT
            ClientId,
            BusinessContact,
            Tech1,
            Tech2
        FROM
           OPENXML (@xmlHandle, '/ClientData/Client', 1)
           WITH
           (
               ClientId int,
               BusinessContact varchar(50),
               Tech1 varchar(50),
               Tech2 varchar(50)
           )
   ) x ON c.ClientId = x.ClientId

Приведенный выше код не был проверен, но я думаю, что общая схема есть. Я использовал эту технику для массовых вставок в ряде случаев. Мне это нравится, потому что он выполняет работу за одну операцию с базой данных.

0 голосов
/ 01 апреля 2010

Если вы используете инструменты GUI в VS для создания источника данных с DataAdaptors и подключаете их к сетке, весь код написан для вас, кроме вызова update для вашей кнопки сохранения.

...