100分求超难Excel导入远程sql数据库.在线等,高手快来帮忙!!!

wangwanru 2005-08-24 06:54:59
现在的流程是:每一步:上传Excel文件;第二步:把Excel文件导到sql的中间转换表;第三步:从转换表导入表A.Web程序服务器(Server A)和数据库(Server B)没在一台机子上,在本机测试没有问题,可以导入,程序和数据库要是在一台机子上可以实现.如果把文件上传到Server A,无法导入,从网上找了好多也没有找到类似的答案, 如果先把Excel文件上传到Server B又如何实现.
...全文
547 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lds85930 2005-08-27
  • 打赏
  • 举报
回复
加我QQ290982492
我发给你
zjcxc 2005-08-27
  • 打赏
  • 举报
回复
如果你希望通过设置共享来解决此问题,参考下面的设置备份文件共享目录的方法来解决问题

下面假设A服务器上的数据库备份到B服务器(限两台服务器在同一局域网内,允许目录共享访问)
1.机器A,B创建一个同名的windows用户,用户组设置为administrators,并设置相同的密码,做为备份文件夹文件夹的有效访问用户,操作:
我的电脑
--控制面板
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户

2.在B机器器上,新建一个共享目录,做为备份文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: BAK
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
--确定


3.设置 MSSQLSERVER 及 SQLSERVERAGENT 服务的启动用户
开始--程序--管理工具--服务
--右键 MSSQLSERVER
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名
--"密码"中输入该用户的密码
--确定
--同样的方法设置 SQLSERVERAGENT

4.在A机器上完成对B机器BAK目录的映射

5.查询分析器中执行下面的语句,检验是否成功:
exec master..xp_cmdshell 'dir 映射的盘符'
zjcxc 2005-08-27
  • 打赏
  • 举报
回复
关于这个问题,你可以这样解决:

创建DTS包:
可以选择任意一台有需要导入的文件和能连接目标服务器且安装有SQL Server的电脑来完成此工作.
方法一:
1. 运行SQL Server的"导入和导出数据"工具
2. 根据步骤, 设置好从文件导入数据到指定SQL Server的处理
3. 在"保存、调度和复制包"这步,选择"保存DTS包"--"结构化存储文件"
4. 在接下来的步骤中, 输入DTS包的"名称"和保存的文件名

方法二:
企业管理器--数据转换服务--本地包--新建包
在包设计器里按你的需要设置好数据导入处理(一般包含一个源数据连接(例如 excel/text),一个目标数据连接,一个转换数据任务)
设计好包,单击菜单中的"包"--"保存包", 输入"包名称", 在"位置"中选择"结构化存储文件",并且输入包文件名


在要上传数据的文件所在的电脑中, 安装DTSRUN实用工具(可以通过复制SQL Server服务器上的相关文件或者安装sql server客户端获得)
然后在命令提示符下使用DTSRUN执行你的DTS包(也可以在程序中通过shell调用外部命令来调用DTSRUN):
DTSRUN /F "DTS包文件名" /N "DTS包名"
hchxxzx 2005-08-26
  • 打赏
  • 举报
回复
仅仅提供其他机器的用户来对非本机的文件进行读取,还是会出现问题.所以,在提供模拟用户之后,你还必须先从代码中打通与他机的联系.

访问局域网资源
private void button1_Click(object sender, System.EventArgs e)
{
ConnectionOptions co = new ConnectionOptions();
co.Username = "Administrator";
co.Password = "xxxxxxxxxxxxxxxxxxxx";
System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\218.241.42.116\\root\\cimv2", co);
}


cuike519 2005-08-26
  • 打赏
  • 举报
回复
问题关键是这些服务器之间没有信任关系。
1、ASP.NET通常运行在ASPNET用户上,我们无法用这个用户来登陆其他的机器(比如:DBServer),但是我们可以在web.config里配置模拟用户,比如:DataTransferUser,这个用户可以访问DBServer的某个文件夹(需要在DBServer上配置),此时在上传的时候,可以直接使用\\DBServer\Temp(必须共享FullControl)保存文件,在导入的时候使用本地路径即可。
2、或者使用同样的方法将WebServer的上传目录共享成Everyone(或者其他用户)FullControl。在导入的时候使用网络路径即可。

如何模拟可以参考MSDN的帮助,也可以使用:<identity impersonate = "true"/>直接模拟匿名用户,在IIS中需要配DataTransferUser为匿名访问用户。

个人意见仅供参考!
孟子E章 2005-08-26
  • 打赏
  • 举报
回复
上传到ServerA,数据库链接写ServerB也可以导入,如果也导入到ServerA的数据库,执行2次数据库的打开,执行语句,关闭即可
孟子E章 2005-08-26
  • 打赏
  • 举报
回复
上传到另外的机器,必须用模拟,在另外的机器设置共享或者映射网络驱动器都可以
wangwanru 2005-08-26
  • 打赏
  • 举报
回复
谢谢net_lover(孟子E章), cuike519(marshal(Help you,Help me)) ,hchxxzx(NET?摸到一点门槛)
我在Server B上做了共亨目录,给了Everyone所有权限,(Server B环境是win 2000没有aspnet用户)但上传还是提示同样的错误.
希望大家再说详细些.
wangwanru 2005-08-25
  • 打赏
  • 举报
回复
带星星的和各位高手快来呀,smile9961再来看看.大家有什么好的方法,要是方便请联我呀,QQ:455948491
wangwanru 2005-08-25
  • 打赏
  • 举报
回复
我想到另一种方法就是把Excel的内容以二进制方法导入到数据库的某个表的字段中,但怎么再把这个数据读出来,存到另一张表里呢,以正常的显示方式?
wangwanru 2005-08-25
  • 打赏
  • 举报
回复
TOpowerllr(笨笨的招财鸡):
我没用过DTS,怎么用,能详细些吗?大家给点思路,我快要急死了.
从网上看到不知是否可行,大家给点建议怎么办啊.
http://community.csdn.net/Expert/topic/3583/3583936.xml?temp=.8683283
powerllr 2005-08-25
  • 打赏
  • 举报
回复
用DTS包导入。不会受服务器限制。
对数据的有效性你不是中间要有张中间转换表吗?中间转换的时候做试证不就得了。
wangwanru 2005-08-25
  • 打赏
  • 举报
回复
Excel文件的第一行是字段名,下面是数据,如果第一行的单元格空,就认为没有数据不导这一列.而且列名是从现有sql数据里的配置表里取出的字段.
不过现在不需要判断,我是先把所有数据导到一张临时表,再从临时表导到表A
smile9961 2005-08-25
  • 打赏
  • 举报
回复
现在的导入语句:
Select * Into ExcelTemp1 From OPENROWSET
('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE="+filepath+"',sheet1$)
____________________________________________________

还有像你上面的写法,对输入数据的有效性是怎么判断的?
smile9961 2005-08-25
  • 打赏
  • 举报
回复
哦,我做的没有这么大的数据量:一个excel中五个工作表一般总数据量不会超过1000行,像你这样要保证10万条的数据量,的确很难作到快。就是把插入数据的动作写成存储过程也作不到。在web上一次操作这么大的数据量,很难的。
wangwanru 2005-08-25
  • 打赏
  • 举报
回复
TO:smile9961(正是江南好风景,落花时节又逢君。)

如果先读Excel数据放到内存表里,再从内存表里读数据到sql的某张表,这样可以实现,但速度太慢,而且数据量大了以后占内存太大,几乎要死机,用户要保证10万条数据量,我现在直接用上面的导入语句,速度很快,但数据文件必须在sql数据库所在的某目录.如何解决.最好有代码.
bluemoon213 2005-08-25
  • 打赏
  • 举报
回复
--访问不同电脑上的数据库(远程只要联好网就一样)

--如果经常访问或数据量大,建议用链接服务器

--创建链接服务器
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','远程服务器名或ip地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用户名','密码'
go

--查询示例
select * from srv_lnk.数据库名.dbo.表名

--导入示例
select * into 表 from srv_lnk.数据库名.dbo.表名

go
--以后不再使用时删除链接服务器
exec sp_dropserver 'srv_lnk','droplogins'


--如果只是临时访问,可以直接用openrowset
--查询示例
select * from openrowset('SQLOLEDB'
,'sql服务器名';'用户名';'密码'
,数据库名.dbo.表名)


--导入示例
select * into 表 from openrowset('SQLOLEDB'
,'sql服务器名';'用户名';'密码'
,数据库名.dbo.表名)
smile9961 2005-08-24
  • 打赏
  • 举报
回复
要实现的是web程序(Server A)和sql数据库(Server B)不是一台服务器,请注意,最好是C#的代码,先上传再导入:

1.先将excel文件上传到(Server A)的某一目录;

2.读取excel并写入sql.关于你说的web程序(Server A)和sql数据库(Server B)不是一台服务器,那没什么关系啊,只不过是web程序(Server A)所连接的数据库不同而已.不会影响写入数据.

现在在家,身边没有这样的代码;所以就先给你个思路吧.
wangwanru 2005-08-24
  • 打赏
  • 举报
回复
谢谢lykemp(kemp).不知我的意思说清楚了没有,我要实现的是web程序(Server A)和sql数据库(Server B)不是一台服务器,请注意,最好是C#的代码,先上传再导入.如何解决.
lykemp 2005-08-24
  • 打赏
  • 举报
回复
Dim sFile As String
Dim i As Integer
Dim s, ss As String
Dim sAddFields, sUpdateFields, sWhereFields As String
Dim nRow, nCol As Integer
Dim sErr As String
Dim DS As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim MyConnection As System.Data.OleDb.OleDbConnection
Dim AddSQL, AddSQLfields, AddSQLvalues, UpdateSQL, WhereSQL, DeleteSQL As String
Dim sTmp() As String
'----------------------------------------]
On Error GoTo err1
If Me.ddTableList.SelectedValue = "Null" Then
Response.Write("<script language='javascript'>alert('请选择要导入数据表名!');</script>")
Exit Sub
End If

sFile = File1.PostedFile.FileName
If sFile = "" Then
Response.Write("<script language='javascript'>alert('请选择要导入数据的Excel配置文件!');</script>")
Exit Sub
End If
sFile = Server.MapPath("..") & "\ExcelData\" & Right(File1.PostedFile.FileName, Len(File1.PostedFile.FileName) - InStrRev(File1.PostedFile.FileName, "\"))
File1.PostedFile.SaveAs(sFile)
For i = 0 To Me.ltAdd.Items.Count - 1
If Me.ltAdd.Items(i).Selected Then
sAddFields = sAddFields & Left(ltAdd.Items(i).Text, InStr(ltAdd.Items(i).Text, "(") - 1) & ","
End If
Next
If Len(sAddFields) > 0 Then sAddFields = Left(sAddFields, Len(sAddFields) - 1)
For i = 0 To Me.ltUpdate.Items.Count - 1
If Me.ltUpdate.Items(i).Selected Then
sUpdateFields = sUpdateFields & Left(ltUpdate.Items(i).Text, InStr(ltUpdate.Items(i).Text, "(") - 1) & ","
End If
Next
If Len(sUpdateFields) > 0 Then sUpdateFields = Left(sUpdateFields, Len(sUpdateFields) - 1)
For i = 0 To Me.ltWhere.Items.Count - 1
If Me.ltWhere.Items(i).Selected Then
sWhereFields = sWhereFields & Left(ltWhere.Items(i).Text, InStr(ltWhere.Items(i).Text, "(") - 1) & ","
End If
Next
If Len(sWhereFields) > 0 Then
sWhereFields = Left(sWhereFields, Len(sWhereFields) - 1)
Else
Response.Write("<script language='javascript'>alert('请选择关键字条件字段!');</script>")
Exit Sub
End If

'----------------------------------------
MyConnection = New System.Data.OleDb.OleDbConnection( _
"provider=Microsoft.Jet.OLEDB.4.0; " & _
"data source=" & sFile & "; " & _
"Extended Properties=Excel 8.0;")
MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
"select * from [sheet1$]", MyConnection)
DS = New System.Data.DataSet
MyCommand.Fill(DS)
sErr = ""
For nRow = 0 To DS.Tables(0).Rows.Count - 1
AddSQLfields = ""
AddSQLvalues = ""
AddSQL = ""
UpdateSQL = ""
DeleteSQL = ""
WhereSQL = ""
'获得插入语句
If Trim(sAddFields) = "" Then
AddSQL = ""
Else
sTmp = Split(sAddFields, ",")
For i = 0 To sTmp.Length - 1
AddSQLfields = AddSQLfields & sTmp(i) & ","
AddSQLvalues = AddSQLvalues & "'" & DS.Tables(0).Rows(nRow).Item(sTmp(i)) & "',"
Next
AddSQLfields = Left(AddSQLfields, Len(AddSQLfields) - 1)
AddSQLvalues = Left(AddSQLvalues, Len(AddSQLvalues) - 1)
AddSQL = "Insert into " & Me.ddTableList.SelectedValue & " (" & AddSQLfields & ") values (" & AddSQLvalues & ")"
End If
'获得条件语句
If Trim(sWhereFields) = "" Then
WhereSQL = ""
DeleteSQL = ""
Else
sTmp = Split(sWhereFields, ",")
For i = 0 To sTmp.Length - 1
WhereSQL = WhereSQL & sTmp(i) & "='" & DS.Tables(0).Rows(nRow).Item(sTmp(i)) & "' and "
Next
WhereSQL = Left(WhereSQL, Len(WhereSQL) - 5)
DeleteSQL = "Delete " & Me.ddTableList.SelectedValue & " Where " & WhereSQL
End If
'获得更新语句
If Trim(sUpdateFields) = "" Then
UpdateSQL = ""
Else
sTmp = Split(sUpdateFields, ",")
For i = 0 To sTmp.Length - 1
UpdateSQL = UpdateSQL & sTmp(i) & "='" & DS.Tables(0).Rows(nRow).Item(sTmp(i)) & "',"
Next
UpdateSQL = Left(UpdateSQL, Len(UpdateSQL) - 1)
UpdateSQL = "update " & Me.ddTableList.SelectedValue & " set " & UpdateSQL
UpdateSQL = UpdateSQL & " Where " & WhereSQL
End If

If WhereSQL = "" Then Exit For
s = ExistData(WhereSQL) '判断Excel记录是否在SQL数据库中存在
Select Case Val(s)
Case 0 '不存在
If AddSQL = "" Or WhereSQL = "" Then
Exit Select
ElseIf (Not R1.Checked) And (Not R2.Checked) And (R3.Checked) Then
Exit Select
End If
ss = ExecSQL(AddSQL)
If ss <> "" Then
sErr = sErr & "行 " & nRow & " : " & ss & Chr(10)
End If
Case 1 '存在
If WhereSQL = "" Then
Exit For
Else
If R1.Checked And (Not R2.Checked) And (Not R3.Checked) Then '保留原来数据

ElseIf (Not R1.Checked) And (R2.Checked) And (Not R3.Checked) Then '覆盖原来数据
If UpdateSQL = "" Then Exit Select
ss = ExecSQL(UpdateSQL)
If ss <> "" Then
sErr = sErr & "行 " & nRow & " : " & ss & Chr(10)
End If
ElseIf (Not R1.Checked) And (Not R2.Checked) And (R3.Checked) Then '删除原来数据
If DeleteSQL = "" Then Exit Select
ss = ExecSQL(DeleteSQL)
If ss <> "" Then
sErr = sErr & "行 " & nRow & " : " & ss & Chr(10)
End If
Else

End If
End If
Case 2 '出错
sErr = sErr & "行 " & nRow & " : " & s & Chr(10)
End Select

Next
Me.txtLog.Text = "导入成功!" & Chr(10) & sErr & Err.Description
Exit Sub
err1:
MyConnection.Close()
MyConnection = Nothing
Me.txtLog.Text = sErr & Err.Description
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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