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;
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