0

このシナリオの適切な解決策を探しています:

  • SQL Server 2008 R2 バックエンドを使用する asp.net アプリケーションがあります。
  • ユーザーがファイルをアップロードし、後で取得できるように保存できるようにする必要があります。
  • また、データベース側でクエリを実行するために、このファイルを解析する必要があります。したがって、このファイルからデータテーブルとしてのデータと、結果を結合するための sql からのデータの両方が必要です。

そこで、私が考えたのは次のとおりです。

  1. ExcelファイルをSQL Serverに保存しますvarbinary(max)。これにより、後で.netを介してファイルを簡単に取得できます。
  2. 解析: それを行う 1 つの方法は、ユーザーによるファイルのアップロード時に、openxml またはサード パーティのライブラリを使用して解析し、結果セットを返すストアド プロシージャに渡すことです。

大量のデータをデータベースに 2 回渡す必要があるため、このアプローチは好きではありません (1 回目はファイル全体を渡すとき、2 回目はデータセットを渡すとき)。

これをより効率的に行う方法について何か提案はありますか? 次のようなものを使用して varbinary max からデータを読み取ることは可能ですか:

SELECT *
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', 
                    'Data Source=D:\TestJET.xls;
                    Extended Properties=''Excel 12.0;HDR=NO;IMEX=1;ImportMixedTypes=Text''')...[Sheet1$]

実際にファイルを作成せずに?

または、ファイル全体を db に渡すのではなく、データテーブルから Excel ファイルを作成することは可能でしょうか?

それともvarbinary(max)、最善の解決策ではなく、XML のような別のデータ型を使用する方がよいでしょうか?

Excelファイルはとてもシンプルです。マクロや数式を使用しない、スタイルが設定された 1 つのテーブル。(ただしCSVへの変換はできません) ファイルサイズは200~800kbです。

4

3 に答える 3

1

DBからExcelファイルを作成するというあなたの考えは興味深いものです。これは、アップロードされたものと同じファイルを取り戻すことは重要ではなく、同じ情報を含むファイルだけを取り戻すことは重要ではないことを示唆しています。あれは正しいですか?

もしそうなら、私はサーバーへのアップロード時にファイルを解析し( C#Excelの作業にはClosedXMLが好きです)、関連するデータをクエリに適した形式でデータベースに保存してから、元のファイルを破棄します。ユーザーがファイルの返送を要求したら、適切な内容で新しいファイルを作成します。

XMLデータ型の列には注意してください。列には、使用できる操作に制限があります。

于 2012-05-13T08:44:31.293 に答える
0

FileUpload コントロールを使用してファイルをサーバーにアップロードすると、必要なときにいつでもファイルを取得できます。

そこから、取得した各レコードをリストに追加する OleDbConnection を使用して Excel ファイルを読み取り、1 つずつ反復して後でデータベースに挿入できます。

これは、次の 3 つのクラスを使用した小さな例です: CConexion (OleDbConnection プロセスを処理します)、ExcelParser (取得したレコードをデータベースに読み取って挿入し、必要に応じてクエリを実行できるようにします)、および各レジストリのデータのコンテナーを表す ExcelRecord です。あなたのExcelファイル。

これらの OleDb ライブラリは、コンピューターに MS Office Excel 2010 がある場合にインストールされます。私はコードをテストし、うまく動作します。

この例では、Excel ファイルは Hoja1.xlsx と呼ばれ、TestApp のルートにある Files というフォルダーに保存されます。それを開くと、(A1,B1)、(A2,B2) という 2 つのフィールドを持つ 3 つのレコードがあります。 ,(A3,B3) Hoja1.xlsx とも呼ばれるファイルの最初のシート

    ''CConexion Class:

    Imports System.Data.SqlClient
    Imports System.Data.OleDb
    Imports System.Data

    Public Class CConexion

    #Region "Private Variables"

        Dim sOleDbConnectionString As String = String.Empty
        Dim conexionOleDb As New OleDbConnection()

    #End Region

    #Region "Con_Ole"

        Public Interface IConexionOleDb

            Property retConexionOleDb() As OleDbConnection
            Sub retOpenOleDb()
            Sub retCloseOleDb()

        End Interface

        Public Property retConexionOleDb() As OleDbConnection

            Get
                Return conexionOleDb
            End Get
            Set(ByVal value As OleDbConnection)

            End Set

        End Property

        Public Sub retOpenOleDb()

            If Not conexionOleDb.State = System.Data.ConnectionState.Open Then
                conexionOleDb.Open()
            End If

        End Sub

        Public Sub retCloseOleDb()

            If Not conexionOleDb.State = ConnectionState.Closed Then
                conexionOleDb.Close()
            End If

        End Sub

    #End Region

    #Region "Constructors"

        Public Sub New()

        End Sub

        Public Sub New(ByVal rutaOleDb As String)

            sOleDbConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                                        & "Data Source=" & rutaOleDb _
                                                        & ";" & "Extended Properties=Excel 12.0;"
            conexionOleDb.ConnectionString = sOleDbConnectionString

        End Sub

    #End Region

    End Class

    ''ExcelRecord Class:

    Public Class ExcelRecord

        Private _RId As Short = 0
        Public Property RId() As Short
            Get
                Return _RId
            End Get
            Set(ByVal value As Short)
                _RId = value
            End Set
        End Property

        Private _RText As String = String.Empty
        Public Property RText() As String
            Get
                Return _RText
            End Get
            Set(ByVal value As String)
                _RText = value
            End Set
        End Property

        Public Sub New()

        End Sub

        Public Sub New(ByVal Rid As Short, ByVal RText As String)
            Me.RId = Rid
            Me.RText = RText
        End Sub

    End Class

    ''ExcelParser Class:

    Imports System.Data.OleDb
    Imports System.Collections.Generic

    Public Class ExcelParser

        Private Function InsertRecords(ByVal objExcelRecords As List(Of ExcelRecord)) As Boolean
        ''Your code for insertion here
            Return True
        End Function

        Public Function ReadExcel(ByVal filePath As String) As Short

            Dim cn As New CConexion(filePath)
            Dim dr As OleDbDataReader
            Dim OperationState As Boolean = False
            Dim objExcelRecords As New List(Of ExcelRecord)

            Try

                Dim cmd As New OleDbCommand("Select * from [Hoja1$]", cn.retConexionOleDb)

                cn.retOpenOleDb()
                dr = cmd.ExecuteReader

                While dr.Read    

                    Dim objExcelRecord As New ExcelRecord(CShort(dr(0)), CStr(dr(1)))
                    objExcelRecords.Add(objExcelRecord)

                End While

                OperationState = InsertRecords(objExcelRecords)
                CType(dr, IDisposable).Dispose()

            Catch ex As Exception

            Finally

                cn.retCloseOleDb()
                cn.retConexionOleDb.Dispose()

            End Try

            Return OperationState

        End Function

    End Class


''Test Page ExcelReader.aspx.vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then

            Dim filePath As String = Server.MapPath("~\Files\Hoja1.xlsx")
            Dim objExcelParser As New ExcelParser()

            If objExcelParser.ReadExcel(filePath) Then
                Response.Write("Read!")
            Else
                Response.Write("No Read!")
            End If

        End If

    End Sub

これがうまくいくかどうか教えてください。それが役に立てば幸い。

于 2012-05-13T07:18:01.540 に答える
0

ファイルをサーバーに保存するために、SQL 2008 r2 の FILESTREAM 機能を確認することをお勧めします。ここに概要と優れたブログ投稿があります。ファイルの種類やそこから何を得る必要があるのか​​ わかりませんが、一括挿入を使用するか、すでに指摘したようにOPENDATASOURCEを使用するか、後でプロセスを実行してから、FILESTREAMのIDを使用してデータをロードしてリンクするオプションがありますデータ。

于 2012-05-12T19:56:51.967 に答える