0

CSV ファイルからレコードを読み取り、データベース テーブルに格納する単純な Web アプリケーションがあります。次にSqlBulkCopy、バッチを使用してレコードを SQL データベースにコピーしています。すべてが挿入で問題ありません。OnSqlRowsCopiedと を使用してユーザーにフィードバックを提供しようとしていますNotifyAfter。目標は、に含まれるラベルを更新して、現在の間隔UpdatePanelでコピーされたレコード数を表示することです。NotifyAfterただし、ラベルSqlBulkCopyは完了するまで更新されません。s_OnSqlRowsCopiedを使用してイベントが発火していることがわかりますDebug.WriteLine。ラベルが更新されない理由と、これを解決するにはどうすればよいですか?

コードビハインド

Imports System.Data.SqlClient

Public Class WebForm1
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

Dim filePath As String
Dim rowsCopied As String

Public Sub btnGetCSV_Click(sender As Object, e As EventArgs) Handles btnGetCSV.Click



    filePath = System.IO.Path.GetFullPath(fileUpload1.PostedFile.FileName)
    lblInfo.Text = filePath



End Sub

Protected Sub btnToSQL_Click(sender As Object, e As EventArgs) Handles btnToSQL.Click

    Dim cs As String = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("csMediaPortal").ConnectionString
    CopyData(CSVtoDataTable(lblInfo.Text.ToString()), cs)

End Sub

Private Function CSVtoDataTable(filePath As String) As DataTable

    Dim dt As DataTable = Nothing
    Dim sourcePath As String = String.Empty
    Dim csvFile As String = String.Empty
    Dim conString As String = String.Empty
    Dim conn As OleDb.OleDbConnection = Nothing
    Dim adapter As OleDb.OleDbDataAdapter = Nothing
    Dim selString As String = String.Empty

    Try
        sourcePath = System.IO.Path.GetDirectoryName(filePath)
        csvFile = System.IO.Path.GetFileName(filePath)
        conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sourcePath & ";Extended Properties=""text;HDR=No;FMT=FixedLength"""
        conn = New OleDb.OleDbConnection(conString)
        selString = "Select * From " & csvFile
        adapter = New OleDb.OleDbDataAdapter(selString, conn)
        dt = New DataTable(System.IO.Path.GetFileNameWithoutExtension(filePath))
        conn.Open()
        adapter.Fill(dt)
        conn.Close()
    Catch ex As Exception
        lblInfo.Text = ex.Message
    Finally
        adapter.Dispose()
        conn.Dispose()
    End Try

    Return dt

End Function

Protected Sub CopyData(sourceTable As DataTable, cs As String)

    Using s As SqlBulkCopy = New SqlBulkCopy(cs, SqlBulkCopyOptions.UseInternalTransaction)

        s.DestinationTableName = "test"
        s.BatchSize = 1000


        Try
            AddHandler s.SqlRowsCopied, AddressOf s_OnSqlRowsCopied

            s.NotifyAfter = 900
            s.WriteToServer(sourceTable)


        Catch ex As Exception

            DirectCast(DirectCast(HttpContext.Current.Handler, Page).FindControl("lblInfo"), Label).Text = "Commit Error: " & ex.Message

        End Try

        s.Close()

    End Using
End Sub


Protected Sub s_OnSqlRowsCopied(sender As Object, e As SqlRowsCopiedEventArgs)

    Me.lblProgress.Value = e.RowsCopied.ToString()
    Me.UpdatePanel1.Update()
    Debug.WriteLine(e.RowsCopied)

End Sub



End Class

ウェブフォーム

    <%@ Page Language="vb" CodeBehind="WebForm1.aspx.vb" Inherits="CSVUpload.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <div>
            <asp:FileUpload ID="fileUpload1" runat="server" />
            <asp:Button ID="btnGetCSV" runat="server" Text="Post" OnClick="btnGetCSV_Click" />
            <asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>
        </div>

        &nbsp;<asp:Button ID="btnToSQL" runat="server" Text="Insert To SQL" OnClick="btnToSQL_Click" />
        <div>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <input runat="server" type="text" id="lblProgress" value="0" />

                </ContentTemplate>
            </asp:UpdatePanel>

        </div>
    </form>
</body>
</html>
4

0 に答える 0