关于EXCEL导入数据库的解决方法
2006-07-29 18:27
766 查看
从EXCEL导入数据库网上的讨论有很多,本人在实践中使用和参考了各种方法,总结如下:
一、在导入SQL SERVER时,可以采用DTS包方式,没有实际做过,对于定期导入的情况可能比较好,用于实时导入的情况可能不是很好,因为一般都是建好一个包后,调用DBMS的计划定于某个时间运行的。
二、完全的存储过程解决,将导入文件上传到服务器后,写个存储过程通过 OPENDATAROWSOURCE方法读出EXCEL内容到临时表,在通过临时表处理,导入物理表。采用这种方式会有一个问题:如果数据库登陆用户没有system Administrator角色,则会提示:“已拒绝对Microsoft OleDb"的访问,必须建立一个链接数据库。由于 system Administrator角色一般不会分配给应用系统的登陆角色,所以比较难解决。这种方法的好处是能用临时表处理,一次导入一个临时表,完全在一个存储过程处理,结构比较分明。
一个小例子:
--生成要导入的临时表
set @per = '''Data Source="'+@FileName+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
exec ('select 序号,资产条码,cast(项目名称 as varchar(100)) 项目名称,资产名,制造商,序列号,型号, 其他特征,使用时间,资产价值,cast ( 应用领域 as varchar(100)) 应用领域, cast(所属部门 as varchar(100)) 所属部门,cast(资产地点 as varchar(100)) 资产地点, 详细地点 ,使用人,责任人,合同编号,新增批次,备注,网元编号,机架信息,资产来源 ,'''+@BillID+''' as 单据编号 into ##temp2
FROM OpenDataSource(''Microsoft.Jet.OLEDB.4.0'','+@per+')...[资产导入模板$] ')
if @@Error>0
begin
select '失败' as Flg,'' as 序号,'' as 资产条码,'资产导入不成功' as ErrorInfo
return
end
三、以前用ASP的时候还用过执行 XP_CMDSHEET的方式导入,这中导入发现对于一串长数字的单元格内容它智能的采用了科学计数发。
四、现在我觉得比较的方式应该是在应用程序里完成EXCEL的打开读取操作的,因为这样可以避免数据库权限不够引起的读写EXCEL错误,在应用程序里读取也是跟读取数据库一样的,只是打开的数据库驱动不一样罢了,下面是我用C sharp读取的实现方法:
//读取EXCEL内容返回一个DATASET
public DataSet getExcelDataSet(string strxls,string strSheetName)
{
//注意连接的驱动是 Microsoft.Jet.OLEDB.4.0,附件属性还有:Extended Properties=Excel 8.0//表示是97-2000版本,HDR=YES/NO//第一行是否为标题, IMEX=1//表示以文本读取。
OleDbConnection myOleConn = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; data source="+strxls+"; Extended Properties=Excel 8.0;");
OleDbDataAdapter MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from ["+strSheetName+"$]", myOleConn);
DataSet DS = new System.Data.DataSet();
MyCommand.Fill(DS);
myOleConn.Close();
return DS;
}
//将读取的dataset内容写入表中
public bool ImportExcelToSqlTable(string strxls,string strSheetName,string TableName,string BillID)
{
try
{
DataSet XlsDs = getExcelDataSet(strxls,strSheetName);
string strInsertComm;
for(int i = 0 ; i<XlsDs.Tables[0].Rows.Count;i++)
{
strInsertComm="";
strInsertComm = "Insert T_AddTemp(序号,资产条码,项目名称,资产名,类项目节,制造商,序列号,型号,其他特征,使用时间,资产价值,应用领域,资产来源,所属部门,资产地点,详细地点,使用人,责任人,合同编号,新增批次,备注,网元编号,机架信息,新增单据编号,FileName)";
strInsertComm +=" values(";
for(int j=0;j<XlsDs.Tables[0].Columns.Count;j++)
{
if (j>0)
{
strInsertComm +=",'"+XlsDs.Tables[0].Rows[i][j].ToString()+"'";
}
else
{
strInsertComm +="'"+XlsDs.Tables[0].Rows[i][j].ToString()+"'";
}
}
strInsertComm += ",'"+BillID+"','"+strxls.Replace("'","''")+"'";
strInsertComm +=")";
ExecSql(strInsertComm);
}
ExecSql("AstImport '"+BillID+"','"+strxls+"'");
}
catch
{
return false;
}
return true;
}
一、在导入SQL SERVER时,可以采用DTS包方式,没有实际做过,对于定期导入的情况可能比较好,用于实时导入的情况可能不是很好,因为一般都是建好一个包后,调用DBMS的计划定于某个时间运行的。
二、完全的存储过程解决,将导入文件上传到服务器后,写个存储过程通过 OPENDATAROWSOURCE方法读出EXCEL内容到临时表,在通过临时表处理,导入物理表。采用这种方式会有一个问题:如果数据库登陆用户没有system Administrator角色,则会提示:“已拒绝对Microsoft OleDb"的访问,必须建立一个链接数据库。由于 system Administrator角色一般不会分配给应用系统的登陆角色,所以比较难解决。这种方法的好处是能用临时表处理,一次导入一个临时表,完全在一个存储过程处理,结构比较分明。
一个小例子:
--生成要导入的临时表
set @per = '''Data Source="'+@FileName+'";User ID=Admin;Password=;Extended properties=Excel 5.0'''
exec ('select 序号,资产条码,cast(项目名称 as varchar(100)) 项目名称,资产名,制造商,序列号,型号, 其他特征,使用时间,资产价值,cast ( 应用领域 as varchar(100)) 应用领域, cast(所属部门 as varchar(100)) 所属部门,cast(资产地点 as varchar(100)) 资产地点, 详细地点 ,使用人,责任人,合同编号,新增批次,备注,网元编号,机架信息,资产来源 ,'''+@BillID+''' as 单据编号 into ##temp2
FROM OpenDataSource(''Microsoft.Jet.OLEDB.4.0'','+@per+')...[资产导入模板$] ')
if @@Error>0
begin
select '失败' as Flg,'' as 序号,'' as 资产条码,'资产导入不成功' as ErrorInfo
return
end
三、以前用ASP的时候还用过执行 XP_CMDSHEET的方式导入,这中导入发现对于一串长数字的单元格内容它智能的采用了科学计数发。
四、现在我觉得比较的方式应该是在应用程序里完成EXCEL的打开读取操作的,因为这样可以避免数据库权限不够引起的读写EXCEL错误,在应用程序里读取也是跟读取数据库一样的,只是打开的数据库驱动不一样罢了,下面是我用C sharp读取的实现方法:
//读取EXCEL内容返回一个DATASET
public DataSet getExcelDataSet(string strxls,string strSheetName)
{
//注意连接的驱动是 Microsoft.Jet.OLEDB.4.0,附件属性还有:Extended Properties=Excel 8.0//表示是97-2000版本,HDR=YES/NO//第一行是否为标题, IMEX=1//表示以文本读取。
OleDbConnection myOleConn = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; data source="+strxls+"; Extended Properties=Excel 8.0;");
OleDbDataAdapter MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from ["+strSheetName+"$]", myOleConn);
DataSet DS = new System.Data.DataSet();
MyCommand.Fill(DS);
myOleConn.Close();
return DS;
}
//将读取的dataset内容写入表中
public bool ImportExcelToSqlTable(string strxls,string strSheetName,string TableName,string BillID)
{
try
{
DataSet XlsDs = getExcelDataSet(strxls,strSheetName);
string strInsertComm;
for(int i = 0 ; i<XlsDs.Tables[0].Rows.Count;i++)
{
strInsertComm="";
strInsertComm = "Insert T_AddTemp(序号,资产条码,项目名称,资产名,类项目节,制造商,序列号,型号,其他特征,使用时间,资产价值,应用领域,资产来源,所属部门,资产地点,详细地点,使用人,责任人,合同编号,新增批次,备注,网元编号,机架信息,新增单据编号,FileName)";
strInsertComm +=" values(";
for(int j=0;j<XlsDs.Tables[0].Columns.Count;j++)
{
if (j>0)
{
strInsertComm +=",'"+XlsDs.Tables[0].Rows[i][j].ToString()+"'";
}
else
{
strInsertComm +="'"+XlsDs.Tables[0].Rows[i][j].ToString()+"'";
}
}
strInsertComm += ",'"+BillID+"','"+strxls.Replace("'","''")+"'";
strInsertComm +=")";
ExecSql(strInsertComm);
}
ExecSql("AstImport '"+BillID+"','"+strxls+"'");
}
catch
{
return false;
}
return true;
}
相关文章推荐
- (原创)关于如何处理EXCEL( CSV)文件 导入数据库的解决方法!!
- 关于EXCEL导入数据库的解决方法
- Java 使用poi把数据库中数据导入Excel的解决方法
- 关于在C#中读取导入的Excel一些值为空的解决方法
- Excel导入数据库出现“外部表不是预期的格式”错误的解决方法
- Excel表导入数据库时带小数点的数据会变成科学计数样式的解决方法
- Excel导入数据库出现“外部表不是预期的格式”错误的解决方法
- 用数据库访问的方法解决从excel大量导入数据
- excel字段过多,导入数据库 存在截断问题的解决方法
- excel内容导入数据库数据丢失问题的分析几解决方法
- 关于项目文件导入打开报:无法识别元素 <Target> 中的属性“Returns”错误解决方法
- mysql导入数据库乱码的解决方法
- 关于解决读取导入excel某列数字过长的科学计数法格式
- 关于error C2471:无法更新程序数据库的错误的解决方法
- 利用OleDb导入Excel数据丢失问题及解决方法
- 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法
- 数据库连接方式读取不到Excel数据值的解决方法
- 关于DateTime在Pocket PC客户端不能正确存入数据库的问题及解决方法
- c#关于EXCEL导入数据库的做法
- 导入Excel遇到数字字母混合列,字母导入为空值发生数据丢失时,用以下方法解决!