c#操作Access数据库,插入数据时超慢。

哨子 2010-11-22 09:58:31

string[] TemLine = File.ReadAllLines(TxtDirectoryPath + "\\" + name, Encoding.GetEncoding("GB2312"));//读出数据有1万4千多条左右

foreach (string item in TemLine)
{

try
{
string[] Item = item.Split('\t');
//Item示例:邵小小 24,河南,未婚.
string[,] Values ={
{ "vName", Item[0] },
{"vInfo",Item[1]}
};
Add("UserInfo", Values);//执行数据插入操作
}
catch
{
;
}
}
//----------------------------------------------------------------------
//向数据库插入内容
/// <summary>
/// 向数据库添加内容
/// </summary>
/// <param name="TableName">表名</param>
/// <param name="ColumnsAndValues">由列名和值组成的二维数组</param>
public void Add(string TableName, string[,] ColumnsAndValues)
{
string Columns = null;
string Values = null;
for (int i = 0; i < ColumnsAndValues.GetLength(0); i++)
{
Columns = Columns + ColumnsAndValues[i, 0] + ",";
Values = "\"" + Values + ColumnsAndValues[i, 1] + "\",";
}
Columns = Columns.Substring(0, Columns.Length - 1);
Values = Values.Substring(0, Values.Length - 1);
string insertStr = "insert into " + TableName + "(" + Columns + ") values(" + Values + ")";
//创建Connection对象
OleDbConnection conn = CreateConnection();
conn.Open();
OleDbCommand cmd = new OleDbCommand(insertStr, conn);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
conn.Dispose();
}

关键代码如上,我在插入数据库时,用时3分多,请帮忙看一下代码出现了什么问题。
...全文
972 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
whrspsoft3723 2010-11-23
  • 打赏
  • 举报
回复
问题相当大,
连接时没有try,
执行时没有try,
插入出错时,事务就会一直挂在哪里。
建议把db封装一下,这样要写多少 new dbcommand, connecton哪,又容易出错,又不好定位错误。
机器人 2010-11-23
  • 打赏
  • 举报
回复
没看到 Rollback 。。。加上Try,Catch吧。
w4bjx 2010-11-23
  • 打赏
  • 举报
回复
li5527938 2010-11-23
  • 打赏
  • 举报
回复
我则呢么没有感觉到啊 呵呵
哨子 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fangxinggood 的回复:]
C# code

string fileName = TxtDirectoryPath + "\\" + name;
string insertStr = "insert into UserInfo (vName, vInfo) values ('{0}','{1}')";
using (FileStream fs = new FileStream("", FileMode.Open……
[/Quote]
早上起来测试了一下,速度没有提升。用了14秒
哨子 2010-11-23
  • 打赏
  • 举报
回复
改用了数据库事务,现在用时10S左右,不知道下面的代码有问题没有,麻烦对数据库事务精通的哥们看看
        private void Add(string FileName)
{
DateTime d = DateTime.Now;
csData cs = new csData();
string insertStr = "insert into userInfo (vName,vInfo) values('{0}','{1}')";
string[] Lines = File.ReadAllLines(FileName, Encoding.GetEncoding("GB2312"));
OleDbConnection conn = cs.CreateConnection(csData.GetDataPath);
conn.Open();
OleDbTransaction transaction = null;

OleDbCommand cmd = new OleDbCommand();
transaction = conn.BeginTransaction();
cmd.Transaction = transaction;
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
foreach (string line in Lines)
{
string[] item = line.Split('\t');
cmd.CommandText = string.Format(insertStr, item[0], item[1]);
cmd.ExecuteNonQuery();
}
transaction.Commit();
conn.Close();
conn.Dispose();
MessageBox.Show("己经导入所有的搜索结果,共用时" + (DateTime.Now - d));
}
机器人 2010-11-22
  • 打赏
  • 举报
回复
using (FileStream fs = new FileStream("", FileMode.Open))

写错了,应该是:

using (FileStream fs = new FileStream(fileName, FileMode.Open))
机器人 2010-11-22
  • 打赏
  • 举报
回复

string fileName = TxtDirectoryPath + "\\" + name;
string insertStr = "insert into UserInfo (vName, vInfo) values ('{0}','{1}')";
using (FileStream fs = new FileStream("", FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding("GB2312")))
{
OleDbConnection conn = CreateConnection();
OleDbCommand cmd = new OleDbCommand(conn);
conn.Open();
string line = null;
while ((line = sr.ReadLine()) != null)
{
string item = line.Split('\t');
cmd.CommandText = string.Format(insertStr, item[0], item[1]);
cmd.ExecuteNonQuery();
}
conn.Close();
conn.Dispose();
}
}

sweet_dogltx 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shaochengtian 的回复:]
引用 3 楼 fangxinggood 的回复:
厄,还是很慢哪。。。

文件多大?

也不是很大,657K。关键是它有1万4千多行,这就需要进行相应的1万多次写入,这是个麻烦事。。
[/Quote]
嗯 应该可以提高不少效率
就用 readline(循环)->处理此行 得到 Columns Values ->插入数据库中
可以减少一次循环
哨子 2010-11-22
  • 打赏
  • 举报
回复
查找出原因了:
Values = "\"" + Values + ColumnsAndValues[i, 1] + "\",";
应该改为
 Values =  Values + "'" + ColumnsAndValues[i, 1] + "',";

在数据插入时,它一直异常中
郁闷啊。这个try也另人挺郁闷的。。。
耗时13秒,写完了,虽然还是不是很能接受。
kkbac 2010-11-22
  • 打赏
  • 举报
回复
string sql="";
for 循环
{
sql += "插入的sql语句 ";
}

Open
Insert( sql);
Close
机器人 2010-11-22
  • 打赏
  • 举报
回复
你现在有两次循环,可以减少一次。

一次是读全部的行组成ColumnsAndValues,一次是循环这个二维数组插入。

可以改为读一行查入一行。
哨子 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fangxinggood 的回复:]
厄,还是很慢哪。。。

文件多大?
[/Quote]
也不是很大,657K。关键是它有1万4千多行,这就需要进行相应的1万多次写入,这是个麻烦事。。
机器人 2010-11-22
  • 打赏
  • 举报
回复
厄,还是很慢哪。。。

文件多大?
哨子 2010-11-22
  • 打赏
  • 举报
回复
谢谢fangxinggood兄,现在快多了,用时2分8秒。不过感觉还是太慢了。除了数据查询时它有优势,我以为它甚至不如直接存文本。不知道有没有直接一次性将多条数据写进数据库的方法,而不是一次次的循环。
机器人 2010-11-22
  • 打赏
  • 举报
回复
Add里不断的打开/关闭 Connection,是影响性能的主要地方。

你现在是

for 循环
{
Open
Insert
Close
}

改造一下程序,把Open和Close拿到外面来。

Open
for 循环
{
Insert
}
Close

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧