存储过程/*
将Excel文件数据导入数据到SQL数据库中
导出的表存在则直接插入数据,如果不存在则创建表
*/
CREATE PROCEDURE dbo.ImportExcel
--declare
@path nvarchar(1000), --文件存放目录
@fname nvarchar(250), --文件名
@sheetname varchar(250), --要导入的工作表名
@strGetFields varchar(1000) = '*', --要导入的字段名称
@strWhere varchar(1500) = '', --导入时合法条件
@strWhere2 varchar(1500) = '', --查找不符合导入数据的条件
@table varchar(250), --要导入的表名
@rowCount int, --要导入的记录集的数量
@ret int output,
@retRow int output
as
set nocount on
declare @constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000)
declare @factcount int
--select @path='C:/Documents and Settings/Administrator/桌面'
--select @table='aa'
--select @fname='stockoutimei'
--select @sheetname='Sheet1'
--参数检测
set @path=rtrim(@path)
if right(@path,1)<>'/'
begin
set @path=@path+'/'
end
set @fname=@fname+'.xls'
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE='+@path+@fname+''','+@sheetname+'$)'
--检查要导入的数据数目和Excel内能导入的数据数目是否相等
--exec('select '+ @factcount +'=count(*) from '+ @sql +' where 1>0'+ @strWhere +'')
create table #temptab (rcount int)
exec('insert into #temptab select count(*) as rcount from '+ @sql +' where 1>0'+ @strWhere +'')
select @factcount=rcount from #temptab
drop table #temptab
if @factcount<>@rowCount
begin
--导入数量和实际数量不等
--返回不符合条件的记录
set @ret=-1 --不能执行导入
--exec('select * from '+ @sql + ' where 1>0'+ @strWhere2 +'')
end
else
begin
--导入数据
--判断要接收数据的表是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].['+@table+']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
begin
--print('insert into '+@table+' select ClientName, IMEI, OutTime, ProductName, ReceiveAddr from '+@sql+' where IMEI<>''''')
exec('insert into '+@table+'('+ @strGetFields +') select '+ @strGetFields +' from '+@sql+' where 1>0'+ @strWhere +'')
--SET ANSI_NULLS ON
--SET ANSI_WARNINGS ON
set @ret=1 --执行成功
end
else
begin
set @ret=0 --没有表
end
end
set @retRow=@factcount --返回Excel文件中实际可用行数
return @factcount
GO
前台验证.aspx
//
导入时要求必须输入将导入的记录条数
function
checkCount(obj)
{
if(document.all(obj).value=='')
{
alert('请输入要导入的数据实际有效数量!');
document.all(obj).focus();
return false;
}
return true;
}
前台页面
<
asp:datagrid
id
="DgSHOW"
runat
="server"
CssClass
="DataGrid"
Width
="100%"
AutoGenerateColumns
="False"
>
<
HeaderStyle
CssClass
="DgRowTitle_C"
></
HeaderStyle
>
<
Columns
>
<
asp:BoundColumn
Visible
="False"
DataField
="SN"
ReadOnly
="True"
></
asp:BoundColumn
>
<
asp:TemplateColumn
HeaderText
="序号"
>
<
ItemStyle
HorizontalAlign
="Center"
></
ItemStyle
>
<
ItemTemplate
>
<%
# Container.ItemIndex + 1
%>
</
ItemTemplate
>
</
asp:TemplateColumn
>
<
asp:BoundColumn
DataField
="FileName"
ReadOnly
="True"
HeaderText
="文件名"
></
asp:BoundColumn
>
<
asp:BoundColumn
DataField
="FileSize"
ReadOnly
="True"
HeaderText
="文件大小"
></
asp:BoundColumn
>
<
asp:BoundColumn
DataField
="UpMan"
ReadOnly
="True"
HeaderText
="上传人"
></
asp:BoundColumn
>
<
asp:BoundColumn
DataField
="UpTime"
ReadOnly
="True"
HeaderText
="上传时间"
></
asp:BoundColumn
>
<
asp:BoundColumn
HeaderText
="状态"
></
asp:BoundColumn
>
<
asp:TemplateColumn
HeaderText
="确认导入数量"
>
<
ItemStyle
CssClass
="DgTdW"
></
ItemStyle
>
<
ItemTemplate
>
<
INPUT
class
="NoBorderW_R"
id
="txtCount"
style
="WIDTH: 100%"
onkeypress
="onlyNumeric()"
type
="text"
maxLength
="10"
runat
="server"
>
</
ItemTemplate
>
</
asp:TemplateColumn
>
<
asp:ButtonColumn
Text
="导入"
HeaderText
="导入"
CommandName
="Import"
>
<
ItemStyle
HorizontalAlign
="Center"
></
ItemStyle
>
</
asp:ButtonColumn
>
<
asp:ButtonColumn
Text
="删除"
HeaderText
="删除"
CommandName
="Delete"
>
<
ItemStyle
HorizontalAlign
="Center"
></
ItemStyle
>
</
asp:ButtonColumn
>
<
asp:TemplateColumn
>
<
HeaderStyle
Width
="50px"
></
HeaderStyle
>
<
ItemStyle
HorizontalAlign
="Center"
></
ItemStyle
>
<
HeaderTemplate
>
<
INPUT
id
="chkAll"
onclick
="return select_deselectAll(this.checked, this.id, 'chkDel')"
type
="checkbox"
>
全选
</
HeaderTemplate
>
<
ItemTemplate
>
<
asp:CheckBox
id
="chkDel"
runat
="server"
ToolTip
="选中,表示要删除该文件"
Text
="删除"
></
asp:CheckBox
>
</
ItemTemplate
>
</
asp:TemplateColumn
>
</
Columns
>
</
asp:datagrid
>
<
table
>
<
tr
>
<
td
height
="1"
></
td
>
</
tr
>
</
table
>
<
table
class
="ButtonTab"
width
="100%"
>
<
tr
>
<
td
><
uc1:submitimg
id
="SubmitImg2"
runat
="server"
></
uc1:submitimg
><
asp:button
id
="btnDel"
runat
="server"
CssClass
="SubmitButton"
Text
="确定删除"
ToolTip
="删除服务器目录中不再需要的Excel文件"
></
asp:button
>
<
uc1:resetimg
id
="ResetImg2"
runat
="server"
></
uc1:resetimg
><
input
class
="SubmitButton"
id
="btnCancel"
type
="reset"
value
=" 取 消 "
name
="btnCancel"
runat
="server"
>
</
td
>
</
tr
>
</
table
>
本文介绍了一种将Excel文件中的数据导入SQL数据库的方法,包括存储过程的实现细节及前后端交互流程,确保数据准确导入的同时处理各种异常情况。

1723

被折叠的 条评论
为什么被折叠?



