Il miglior metodo per importare dati da file di testo in MS SQL Server

performance sqlbulkcopy sql-server vb.net

Domanda

Ho bisogno delle tue opinioni. Attualmente sta sviluppando un'applicazione in VB.NET.

Ho un file di testo che contiene più di mille righe. Ogni riga contiene i dati necessari per essere inseriti nel database. Un esempio di riga è il seguente:

0001--------SCOMNET--------0.100---0.105

A prima vista, si potrebbe pensare che ogni colonna fosse separata da una tabulazione, ma in realtà ogni colonna era separata da spazi vuoti (io usavo '-' per denotare spazi vuoti perché in qualche modo non riuscivo a far sì che l'editor di testo mostrasse gli spazi vuoti).

La prima colonna è definita da

Substring(0, 12) which is the data [0001--------]

seconda colonna

Substring(12, 12) in which the data is [SCOMNET-----] 

la terza colonna è

Substring(24, 8) in which the data is [---0.100] 

e l'ultima colonna è

Substring(32, 8) in which the data is [---0.105]

Il mio primo pensiero è quello di estrarre le righe per il file di testo e memorizzarle come un elenco di stringhe, quindi mentre si fa il ciclo, eseguire la separazione di ciascuna voce di stringa nell'elenco con la funzione SubString () e inserirla una alla volta fino a quando fine della lista. Ma questo richiederà senza dubbio tempo.

Nel mio scenario, come posso sfruttare SqlBulkCopy? O se ci sono altri modi per avvicinarsi a questo per un inserto più veloce? Dire;

  • apri il file
  • inizio ciclo
    • linea di lettura
    • separare ogni colonna nella linea con sottostringa
    • salvare in un DataTable
  • ciclo finale
  • BCP (DataTable)

Risposta popolare

Questo include un metodo che potrebbe essere un modo più efficiente di leggere il tuo file di testo.

    Sub readFixWidthTextFileIntoSqlTable()

    Dim sqlConn As New SqlConnection("Connection String Goes Here")
    sqlConn.Open()
    Dim sqlComm As New SqlCommand
    sqlComm.Connection = sqlConn
    sqlComm.CommandType = CommandType.Text
    sqlComm.CommandText = "INSERT INTO YourTableNameHere VALUES(@Field1, @Field2, @Field3, @Field4)"

    sqlComm.Parameters.Add("@Field1", SqlDbType.Text)
    sqlComm.Parameters.Add("@Field2", SqlDbType.Text)
    sqlComm.Parameters.Add("@Field3", SqlDbType.Text)
    sqlComm.Parameters.Add("@Field4", SqlDbType.Text)



    Using IFReader As New FileIO.TextFieldParser(FileNameWithPath)
        IFReader.TextFieldType = FileIO.FieldType.FixedWidth
        IFReader.SetFieldWidths(12, 12, 8, 8)

        While Not IFReader.EndOfData
            Dim fields As String() = IFReader.ReadFields

            sqlComm.Parameters("@Field1").Value = fields(0)
            sqlComm.Parameters("@Field2").Value = fields(1)
            sqlComm.Parameters("@Field3").Value = fields(2)
            sqlComm.Parameters("@Field4").Value = fields(3)
            sqlComm.ExecuteNonQuery()
        End While

    End Using

    sqlConn.Close()
End Sub


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché