2

我正在开发一个 Windows 应用程序,其中我正在上传一个文本文件。在该文本文件中有 5000 行,其中有逗号 [,] 分隔的数据。我在后端使用 oledb 连接[MS Access]。我正在从文件中获取逗号分隔的数据并将其插入数据库。

但正如我所观察到的,数据接近 15000-16000 条记录。插入时每秒需要将近 7 条记录。

我想提高这个速度。

这是否取决于我们在后端使用什么作为数据库?

sql server 2005可以代替MS Access提高速度吗?

请帮助我。

请参阅代码:

string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
while ((line = inputData.ReadLine()) != null)
{
    subLine = line.Split(',');

    /*Taking Unique ID from tradefile table*/
    int ID=0;
    try
    {
        da=new OleDbDataAdapter("select max(ID) from tradeFile",con);
        DataSet ds=new DataSet();
        da.Fill(ds);

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            if (ds.Tables[0].Rows[i][0].ToString() == "")
            {
            }
            else
            {
                ID = int.Parse(ds.Tables[0].Rows[i][0].ToString());
                ID++;
            }
        }
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }


    try
    {
        string unknown="unknown Fileld";
        con.Open();
       // int j=subLine.Length;
        //for(int i=0;i<subLine.Length;i++)
        {
            int i = 0;
           //int j=subLine.Length;
           //int index=subLine.Length-j;
           cmd=new OleDbCommand(
               "insert into tradeFile values('"+ID+"','"+
               subLine[i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               subLine[++i].ToString()+"','"+subLine[++i].ToString()+"','"+
               unknown+"')",con);
           cmd.ExecuteNonQuery();

        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        con.Close();
    }
    //counter++;
}
4

4 回答 4

3

您可以通过一次插入多行来提高速度。据我所知,sql-server 允许在一个查询中插入 1000 行,这是对 DB 的 5-6 个查询,而不是 5-6k 个查询。不确定有多少行可以处理 ms 访问。此外,插入速度当然取决于 RDBMS

更新:

奇怪的是,您执行了额外的查询来获取表的新 id。你真的应该使用自动增量字段,这是第一个。第二:您的结果插入查询应如下所示:

insert into tradeFile (field1, field2 ... fieldN) 
values (f1value1, f2value1...fNvalue1), (f1value2, f2value2...fNvalu2) etc.

第三 - 您需要记住,您不能一次插入超过 N 个(例如 SQL Server 中的 1000 个)值,因此您的代码可能如下所示:

string file = openFileDialog1.FileName;
StreamReader inputData = new StreamReader(file);
int values = 0;
const int maxValuesPerInsert = 1000;
string insertQuery = string.empty;
while ((line = inputData.ReadLine()) != null)
{
    subLine = line.Split(',');
    /*do some work to extract values (lemme call em value1, value2...)*/
    if (values < maxValuesPerInsert - 1)
    {
        insertQuery += string.format("({0}, {1}, {2}),", value1, value2, value3);
        values++;
    }
    else
    {
        insertQuery += string.format("({0}, {1}, {2})", value1, value2, value3); //just to get rid of last comma            
        var query = string.format("insert into tradeFile (field1, field2, field 3) values {0}", insertQuery);
        /*do your db query*/
        insertQuery = string.empty;
        values = 0;
    }

}
于 2013-03-01T11:14:36.300 回答
0

是的,SQL Server 比 MSACCESS 快得多且可靠得多。

当您使用具有多个连接的现代访问或当您有大量工作负载时,请避免对大型数据库使用访问(几千条记录可能对访问来说很大)。

SQL Server express 就足够了(而且它是免费的,请参阅此处的限制:http: //social.msdn.microsoft.com/Forums/en-US/sqldensetup/thread/0e781eb4-1c27-4777-9bd8-bc9e1ae3e803/

另一个“解决方法”可能是在一个查询中使用多个插入或使用 BULK 插入(我不确定是否支持访问)

于 2013-03-01T11:15:39.547 回答
0

当然,使用 MsSQL 服务器而不是 MS Access 会提高速度。同样,我认为您正在为每个第 1 行查询进行。您必须在每个查询中添加几行。这将提高速度。

您使用什么算法来拆分文本文件中的数据?

于 2013-03-01T11:15:56.193 回答
0

我想提高这个速度。

您应该查找ADO.NET 批处理

基本上,您创建一个 DataAdapter(即一个SqlDataAdapter,如果您选择 SQL Server),在其中指定更新、插入和删除命令,然后将DataAdapter.UpdateBatchSize属性设置为大于 1 的值(例如,尝试 1000 看看会发生什么)。

使用适度的硬件,您应该能够每秒插入约 10,000 行,但我会尝试几种不同的批量大小和配置文件

sql server 2005可以代替MS Access提高速度吗?

是的,如果您需要处理更大的数据集,您应该考虑切换到 SQL Server。不过,无需使用 2005 版;SQL Server 2012 Express是自 2012 年起选择的免费版本。

如果你真的有大量的行(例如 100,000 行)要一次插入,你也可以考虑使用SQLBulkCopy. SQLBulkCopy特别适合在同一台服务器的不同表之间复制数据的场景。

于 2013-03-01T11:20:51.520 回答