我想从一个文本文件中逐行读取数据,并在数据库中插入每一行的数据。

我现在想的是逐行读取并在每一行插入数据库。我想问的是,是否有更好的办法?比如说,我们可以做什么来一次插入数据,而不是逐行循环插入记录?我的文本文件中大约有500多行,我每天都需要存储,所以性能是我的问题所在。

请注意,我需要将每一行作为一行插入到数据库中。这些数据是用逗号分隔的,所以我需要把它们分割开来,然后插入到特定的列上。

有什么建议吗?

asp.net
vb.net
sql-server-2008
sql-insert
MohammadMMohammad
MohammadMMohammad
发布于 2013-12-06
4 个回答
Jadeja RJ
Jadeja RJ
发布于 2013-12-06
已采纳
0 人赞同
Imports System
Imports System.IO
Imports System.Collections
Module Module1
    Sub Main()
        Dim objReader As New StreamReader("c:\test.txt")
        Dim sLine As String = ""
        Dim arrText As New ArrayList()
            sLine = objReader.ReadLine()
            If Not sLine Is Nothing Then
                arrText.Add(sLine)
            End If
        Loop Until sLine Is Nothing
        objReader.Close()
       Using command As New SqlCeCommand("INSERT INTO table(col1) VALUES(@data1)", Con)
       command.Parameters.AddWithValue("@data1", "")           
  For Each sLine In arrText
                command.Parameters("@data1").Value = sLine
                command.ExecuteNonQuery()
       End Using
    End Sub
End Module
    
user3024816
user3024816
发布于 2013-12-06
0 人赞同

你可以先把文本文件带入一个数据集(带入数据集不会有任何性能问题,因为它是基于内存的,而且没有到服务器的循环行程),然后用Bulkcopy功能把它插入数据库。我猜测数据将被插入SQL Server数据库中。你可以使用SQLBulkCopy,这里是示例代码。

private void BulkInsert()
    SqlBulkCopy bulkCopy = new SqlBulkCopy("Server=ServerName;Database=test;Trusted_Connection=True;", 
    SqlBulkCopyOptions.TableLock);
    bulkCopy.DestinationTableName = "target_table";
    bulkCopy.WriteToServer(Text2Table());
private DataTable Text2Table()
    DataTable dt = new DataTable();
    StreamReader sr = new StreamReader(@"c:\test\test.txt");
    string input;
    while ((inrecord = sr.ReadLine()) != null)
        string[] values = inrecord.Split(new char[] { '|' });
        dr = dt.NewRow();
        dr["column1"] = values[0];
        dr["column2"] = values[1];
        dr["column3"] = values[2];
        dr["column4"] = values[3];
        dt.Rows.Add(dr);
    sr.Close();
    return dt;
    
Ibo
Ibo
发布于 2013-12-06
0 人赞同

我认为这并不难,很容易。

import java.io.File;
import java.io.FileNotFoundException;

import java.util.Scanner;

public class ScannerReadFile {
    public static void main(String[] args) {
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
int row =0;
int col;
while ((strLine = br.readLine()) != null)   {
       Scanner scanner = new Scanner(strLine);
       String token="";
       while(scanner.hasNext()){
        token = scanner.next();
        for(int i = 0; i<token.length();i++){
            if(token.charAt(i)!=','){
                record += token.charAt(i);
            else{
            insert into table values ( record )  
            record = "";
          row++;       
    
首先,这不是vb.net,其次,如果我想逐行读取并逐条插入记录,会出现性能问题,因为我在txt文件中有500多行数据。
Ibo
谢谢你的否定意见,第二,我没有读到你不是java程序员,第三,这并不难,我可以做得很容易,但在java中,我以前做过这个。
Rex
Rex
发布于 2013-12-06
0 人赞同

性能问题是由于正常插入到数据库中,而不是因为文件的读取。

为了解决这个问题,我建议你使用强类型的数据表格--因为你只是在做插入,只是向这个.Net数据表格添加新行,最后一次性提交到数据库(使用SqlDataAdapter)。

关于读取文件,我建议你使用现有的vb.net库。Microsoft.VisualBasic.FileIo.TextFiledParser(参考 :http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(v=vs.110).aspx)

当然,你还有另一个选择,不使用DataTable,而是生成纯文本的SQL插入查询会表现得更好,输出的查询会是这样。

INSERT INTO tblTarget(Id, Col1, Col2)
Values (1, 'Row1.Val1', 'Row1.Val2'),
       (2, 'Row2.Val1', 'Row2.Val2'),
       (3, 'Row3.Val1', 'Row3.Val2'),