2010-04-01 39 views
1

有一个问题,我需要帮助。基本上,我会制定一个表格(更大的web应用程序的一部分),该目录的客户端的负载,有业务联系,技术联系人1,和技术联系人2.ASP.NET/VB.NET解决问题的帮助!

的想法是快速的数据输入。因此,一种形式显示了其在下拉菜单中的联系人每一个客户和我,我们可以改变每一个然后点击保存按钮做了大规模救。

数据库看起来是这样的:

tblClient

的ClientID

CLIENTNAME

BusinessContact

Tech1

技术2

我的想法是使用一个中继器格式化这样的数据:

客户

业务联系

Tech1

TECH2

客户端2

业务联系

Tech1

TECH2

什么我卡上是如何做大规模更新?我可以为Repeater1中的每个项目执行类似操作,然后执行更新SQL语句吗? - Jonesy

回答

0

如果你使用VS的GUI工具来建立与DataAdaptors一个数据源,这些钩到一个gridview,所有的代码为你写的,不是你的保存按钮调用更新等。

+0

这个保存按钮是否会在oner中完成所有操作?我以前使用过gridview更新按钮,但我需要添加几个下拉菜单。 GridView支持下拉列表可以吗? – iamjonesy 2010-04-01 10:22:19

+0

一个gridview可以支持一些工作下拉。如果您将gridview绑定到数据源对象,然后该数据源对象挂钩到数据适配器中,则Save只需调用DataAdaptor上的update方法。 – cjk 2010-04-01 11:25:01

+0

这已经变成了一个小丑。熟悉VS sqldatasources不支持SQL 2008 :(所以我不得不在后面的代码中查询它们,并绑定gridview和dropdowns。这将能够工作相同吗? – iamjonesy 2010-04-01 11:39:05

0

手动方法是将数据格式化为XML块并将其传递给存储过程,然后在该存储过程中创建UPDATE语句,该语句连接到XML以一次性执行更新。

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

一种方法通过使用的XmlWriter和循环您的中继收获数据来创建此:

你想创建是类似于XML。在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 

上面的代码没有被测试过,但我觉得一般模式在那里。我曾多次使用这种技术进行批量插入。我喜欢它,因为它可以在单个数据库操作中完成工作。