excel数据导入access方法
小弟编写如下代码~~可无法写入数据库~~~string Con = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=d:\\1.xls;Extended Properties=Excel 8.0;";
string sql = "select * from [" + "sheet1" + "$]";
DataSet ds = new DataSet();
OleDbConnection obj = new OleDbConnection(Con);
obj.Open();
OleDbDataAdapter ada = new OleDbDataAdapter(sql, obj);
ada.Fill(ds);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
{
string cd = "insert * into Sheet1 values " + ds.Tables[0].Rows[i][j].ToString();
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\\northwind.mdb";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
OleDbDataAdapter dc = null;
dc = new OleDbDataAdapter(cd, strConn);
conn.Close();
}
}
obj.Close(); --------------------编程问答-------------------- 哪里出了问题?应该怎么改??
请指点一下 --------------------编程问答-------------------- 使用OleDbCommand执行insert sql 语句 --------------------编程问答-------------------- 还是不行,能帮忙写上代码吗?
小弟是新人 --------------------编程问答-------------------- dc = new OleDbCommand("insert * into Sheet1 values " + ds.Tables[0].Rows[i][j], conn);
改成这样还是无法写入 --------------------编程问答-------------------- OleDbConnection conn = new OleDbConnection(strConn);
Oledbcommand cmd=new Oledbcommand(cd,conn);
cmd.ExecuteNonQuery();
conn.Close();
你试试这样看看
把这些代码替换成上面的
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
OleDbDataAdapter dc = null;
dc = new OleDbDataAdapter(cd, strConn);
conn.Close();
--------------------编程问答-------------------- 谢谢楼上的,不过~~~这次轮到INSERT INTO 语句有问题~~~~T_T
继续请教 --------------------编程问答-------------------- "Insert into Sheet1(字段名) values ('"+ds.Tables[0].Rows[i][j]+"')" --------------------编程问答-------------------- 是INSERT INTO 附近有写错,还是思路错了?如果是思路错,应该如何解决? --------------------编程问答-------------------- 目标是将整个excel表的数据写入数据库文档 --------------------编程问答-------------------- 哪位可以帮忙改一下,还有请问ExecuteNonQuery作用是什么??
--------------------编程问答-------------------- Insert into 数据库表名(表里的字段名) values ( ' "+ds.Tables[0].Rows[i][j].ToString()+ " ') " --------------------编程问答-------------------- 如果这样改,那么只有一个列写入数据,我想把整个excel写入access中
请帮忙改下 --------------------编程问答-------------------- 那不写字段名看行不
--------------------编程问答-------------------- 不写字段名那Values里的值要和数据库里的字段数要一样的多。 --------------------编程问答-------------------- 明显的是SQL写错了 --------------------编程问答-------------------- 恩,已经试过了
如果加入字段名如:字段2
就会出现 "至少一个参数没有被指定值"这样的错误
如果不加字段名就说 INSERT INTO 语法错误
我已经试过很多方法了,还是不行T_T --------------------编程问答-------------------- 或许 应该使用其他方法,请指点一下 --------------------编程问答-------------------- 你应该知道来源和目的数据的字段啊 --------------------编程问答-------------------- Access里有Sheet1这个表? --------------------编程问答-------------------- "insert * into Sheet1 values (" + ds.Tables[0].Rows[i][j].ToString()+")";
还有你每一行每一列都写到数据库里去?逻辑没有问题? --------------------编程问答-------------------- 好像是语句的逻辑,有错,不过该怎么改呢? --------------------编程问答-------------------- 我把程序改为这样,各位觉得可以吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using System.Data.OleDb;
using System.Data.SqlClient;
namespace test4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string strCon="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=d:\\northwind.mdb";
string Con = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=d:\\1.xls;Extended Properties=Excel 8.0;";
string sql = "select * from [" + "sheet1" + "$]";
DataSet ds = new DataSet();
OleDbConnection obj = new OleDbConnection(Con);
obj.Open();
OleDbDataAdapter ada = new OleDbDataAdapter(sql, obj);
ada.Fill(ds);
//生成dataTable
DataTable dt = new DataTable();
dt = ds.Tables[0];
OleDbDataAdapter da=new OleDbDataAdapter();//将dt中内容一次插入数据库
OleDbCommand Cmd = new OleDbCommand("Insert Into Sheet1(订单号,货号,含量,上月结存,本月增加,本月减少,结存,工厂,存货仓库,仓位,唛头) values(@订单号,@货号,@含量,@上月结存,@本月增加,@本月减少,@结存,@工厂,@存货仓库,@仓位,@唛头)", conn);
Cmd.Parameters.("@订单号","订单号");
Cmd.Parameters["@订单号"].SourceColumn = dt.Columns["订单号"].ColumnName;
Cmd.Parameters.Add("@货号", "货号");
Cmd.Parameters["@货号"].SourceColumn = dt.Columns["货号"].ColumnName;
Cmd.Parameters.Add("@含量", "含量");
Cmd.Parameters["@含量"].SourceColumn = dt.Columns["含量"].ColumnName;
Cmd.Parameters.Add("@上月结存", "上月结存");
Cmd.Parameters["@上月结存"].SourceColumn = dt.Columns["上月结存"].ColumnName;
Cmd.Parameters.Add("@本月增加", "本月增加");
Cmd.Parameters["@本月增加"].SourceColumn = dt.Columns["本月增加"].ColumnName;
Cmd.Parameters.Add("@本月减少", "本月减少");
Cmd.Parameters["@本月减少"].SourceColumn = dt.Columns["本月减少"].ColumnName;
Cmd.Parameters.Add("@结存", "结存");
Cmd.Parameters["@结存"].SourceColumn = dt.Columns["结存"].ColumnName;
Cmd.Parameters.Add("@工厂", "工厂");
Cmd.Parameters["@工厂"].SourceColumn = dt.Columns["工厂"].ColumnName;
Cmd.Parameters.Add("@存货仓库", "存货仓库");
Cmd.Parameters["@存货仓库"].SourceColumn = dt.Columns["存货仓库"].ColumnName;
Cmd.Parameters.Add("@仓位", "仓位");
Cmd.Parameters["@仓位"].SourceColumn = dt.Columns["仓位"].ColumnName;
Cmd.Parameters.Add("@唛头", "唛头");
Cmd.Parameters["@唛头"].SourceColumn = dt.Columns["唛头"].ColumnName;
da.InsertCommand = Cmd;
da.UpdateCommand = Cmd;
da.Update(dt);
}
}
} --------------------编程问答-------------------- string sql = "select * from [sheet1$] "; --sheet1-指excel文件的sheet名
--------------------编程问答-------------------- 最近作了一个导入职位的(excel->access),仅供参考:
private DataTable GetDataFromExcel(string filepath_p,string sheetName_p)
{
System.Data.DataTable dt = new DataTable();
string strConn;
try
{
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source="+filepath_p +
";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM ["+sheetName_p+"$]", strConn);
myCommand.Fill(dt);
return dt;
}
catch(OleDbException ex)
{
throw new Exception("导入的文件为空或格式错误!"+ex.Message);
// return null;
this.Cursor = System.Windows.Forms.Cursors.Arrow;
}
}
//导入职位
private void ImportDataFromZW(string dsdm_p)
{
#region 导入职位
System.Data.DataTable dt = new DataTable();
string filepath_p="zw.xls";
string sqlstr;
OleDbCommand com;
try
{
dt = GetDataFromExcel(filepath_p,"zw");
}
catch(Exception ex)
{
throw new Exception(ex.Message);
return;
}
if(System.IO.File.Exists(filepath_p)==false)
return;
int i=0;
string zwdm,zw;
for(i=0;i<dt.Rows.Count;i++)
{
zwdm = dt.Rows[i][0].ToString();
if(zwdm.Substring(0,2) !=dsdm_p) continue;
zw = dt.Rows[i][1].ToString();
try
{
sqlstr="insert into 职位表(职位代码,职位) values('"+zwdm+"','"+zw+"')";
OleDbCommand com1=new OleDbCommand(sqlstr,this.dataio.con);
if(dataio.con.State==System.Data.ConnectionState.Closed)
dataio.con.Open();
com1.ExecuteNonQuery();
if(dataio.con.State==System.Data.ConnectionState.Open)
dataio.con.Close();
}
catch(OleDbException ex)
{
throw new Exception("职位表添加数据错误!"+ex.Message);
if(dataio.con.State==System.Data.ConnectionState.Open)
dataio.con.Close();
// return;
}
}
#endregion
}
--------------------编程问答-------------------- 以上方法太慢,且缺乏通用性,可以将excel直接作为一个表,利用sql语句直接将整个表插入到另一个数据库中,这样速度较快且通用
补充:.NET技术 , C#