TXT或者EXCEL事务批量导入Access

这里写的是基本的操作,扩展可以看着修改,注释的很详细了
EXCEL导入ACCESS
在导入按钮事件里写
OleDbConnection conn = new OleDbConnection("数据库连接地址");
OleDbConnection conn_Excel = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=;Extended properties=Excel 5.0;Data Source=" + "这里填你的EXCEL的路径");//一般来说是用OpenFileDialog来获取EXCEL文件的路径,这个我就不写了。
conn.Open()//打开要插入的ACCESS的连接地址
OleDbTransaction tran = null;//先定义一个事务
try
{
//查出EXCEL放入DataTable

conn_Excel.Open();//打开EXCEL
string sql = "select * from [Sheet1$]";//查找EXCEL的名字为Sheet1的表格
DataTable dt = new DataTable();
OleDbDataAdapter sda = new OleDbDataAdapter(sql, conn_Excel);
sda.Fill(dt);//这边就把EXCEL成功的读成DataTable了

if (dt == null)
{
MessageBox.Show("您导入的文档名字有误!请去掉空格或特殊字符!");
return;
}

//去掉空行
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i][0].ToString().Trim() == string.Empty)
{
dt.Rows.Remove(dt.Rows[i--]);
}
}

//开始事务
tran = conn.BeginTransaction();
OleDbCommand cmd = conn.CreateCommand();
cmd.Transaction = tran;

for (int i = 0; i < dt.Rows.Count; i++)
{
string sql_insert = @"insert into " + "你要插入的表名" + @" (字段1,字段2...) values (dt.Rows[i][0].ToString(),dt.Rows[i][0].ToString()...)";//具体的哪一列插入ACCESS的哪一列,这个就不废话了
https://www.360docs.net/doc/f13293832.html,mandText = sql_insert;
cmd.ExecuteNonQuery();
}
https://www.360docs.net/doc/f13293832.html,mit();//提交事务
MessageBox.Show("导入成功!");
this.Close();
}
catch
{
MessageBox.Show("导入失败!");
tran.Rollback();
}
finally
{
conn.Dispose();
conn_Excel.Dispose();
}

TXT导入ACCESS其实格式差不了多少,只是读取的方式不同
OleDbConnection conn = new OleDbConnection("数据库连接地址");
conn.Open();
OleDbTransaction tran = null;
try
{
//把TXT文本转换为datatable
string sql = string.Format("select * from [Text;Database={0}].{1}"

, "txt文本的路径(不包括名字)","txt文本的名字");
DataTable dt = new DataTable();
OleDbDataAdapter sda = new OleDbDataAdapter(sql,conn);
sda.Fill(dt);//这边txt就读成datatable了(注意的是,这个是把txt的每行当成一个字段了,如果想多个,自己设置格式,如:第一行为 a b c,那么就把读出来的字段通过空格切割插入ACCESS就行了)

if (dt == null)
{
MessageBox.Show("您导入的文档名字有误!请去掉空格或特殊字符!");
return;
}

//去掉空行
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i][0].ToString().Trim() == string.Empty)
{
dt.Rows.Remove(dt.Rows[i--]);
}
}
//

//txt的第一行默认为表头所有要先插入,不然是不会插入ACCESS是的
tran = conn.BeginTransaction();
OleDbCommand cmd_one = conn.CreateCommand();
cmd_one.Transaction = tran;
string frist_name=dt.Columns[0].ColumnName;
cmd_https://www.360docs.net/doc/f13293832.html,mandText = string.Format("insert into 表名(字段一...) values ('{0}'...)", frist_name);
cmd_one.ExecuteNonQuery();
https://www.360docs.net/doc/f13293832.html,mit();

int length = dt.Rows.Count % 1500 == 0 ? dt.Rows.Count / 1500 : dt.Rows.Count / 1500 + 1;
progressBar1.Maximum = length;//这边有加入进度条progressBar控件
progressBar1.Minimum = 0;
//当导入数据大于1500时,分批导入
if (dt.Rows.Count > 1500)
{
progressBar1.Visible = true;
for (int j = 0; j < length; j++)
{
tran = conn.BeginTransaction();
OleDbCommand cmd = conn.CreateCommand();
cmd.Transaction = tran;
int m = 1500 * (j + 1);
if (m > dt.Rows.Count)//当循环到最后一次,数据没有1500时
{
m = dt.Rows.Count;
}
for (int i = j * 1500; i < m; i++)
{
string sql_insert = string.Format("insert into 表名 (字段1...) values ('{0}'...)",dt.Rows[i][0].ToString()...);
https://www.360docs.net/doc/f13293832.html,mandText = sql_insert;
cmd.ExecuteNonQuery();
}
https://www.360docs.net/doc/f13293832.html,mit();
progressBar1.Value = j + 1;//成功一轮进度条+1
}
}
else
{

progressBar1.Visible = false;
tran = conn.BeginTransaction();
OleDbCommand cmd = conn.CreateCommand();
cmd.Transaction = tran;
for (int i = 0; i < dt.Rows.Count; i++)
{
string sql_insert = string.Format("insert into 表名 (字段1...) values ('{0}'...)", dt.Rows[i][0].ToString());
https://www.360docs.net/doc/f13293832.html,mandText = sql_insert;
cmd.ExecuteNonQuery();
}
https://www.360docs.net/doc/f13293832.html,mit();
}
MessageBox.Show("导入成功!");
this.Close();
}
catch
{
MessageBox.Show("导入失败!");
tran.Rollback();
}
finally
{
conn.Dispose();
}

后记:一般来说,ACCESS本身就不是用来处理大批量数据的,上面的方法如下面那个TXT导入ACCESS的,2W条数据要花8,9秒左右,而sql server就算不用事务也用不到8,9秒,更何况如果sql server用事务处理2W条数据,不会超过2秒。由此可见,ACCESS本身造就了它只适合小型的系统或网站,它不能写存储过程,不能建视图,不能写触发器等等。但是ACCESS确有个很好的优点就是不用安装,只要是用ACCESS写的程序,一般的WINDOW系统都可以运行,但是sql server就要安装了个人版或企业版了。

相关文档
最新文档