Meilleure méthode pour importer des données d'un fichier texte dans MS SQL Server

performance sqlbulkcopy sql-server vb.net

Question

Besoin de vos opinions. Développe actuellement une application dans VB.NET.

J'ai un fichier texte qui contient plus de mille lignes. Chaque ligne contient les données à insérer dans la base de données. Voici un exemple de ligne:

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

À première vue, on pourrait penser que chaque colonne est séparée par un onglet mais que chaque colonne est en fait séparée par des espaces (j’ai utilisé le signe '-' pour indiquer qu’il s’agissait d'espaces vides, car il était impossible d'obtenir de l'éditeur de texte SO d'afficher les espaces).

La première colonne est définie par

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

deuxième colonne

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

la troisième colonne est

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

et la dernière colonne est

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

Ma première tâche est d’extraire les lignes du fichier texte et de les stocker sous forme de liste de chaînes, puis, en boucle, de séparer chaque élément de la liste avec la fonction SubString () et de l’insérer un par un jusqu’à ce que le fin de la liste. Mais cela prendra sans doute du temps.

Dans mon scénario, comment puis-je tirer parti de SqlBulkCopy? Ou s'il y a d'autres moyens d'aborder cela pour un insert plus rapide? Dire;

  • fichier ouvert
  • boucle de départ
    • ligne de lecture
    • séparer chaque colonne dans la ligne avec une chaîne
    • enregistrer dans un DataTable
  • boucle de fin
  • BCP (DataTable)

Réponse populaire

Cela inclut une méthode qui peut être un moyen plus efficace de lire votre fichier texte.

    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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi