现在的流程是:每一步:上传Excel文件;第二步:把Excel文件导到sql的中间转换表;第三步:从转换表导入表A.Web程序服务器(Server A)和数据库(Server B)没在一台机子上,在本机测试没有问题,可以导入,程序和数据库要是在一台机子上可以实现.如果把文件上传到Server A,无法导入,从网上找了好多也没有找到类似的答案, 如果先把Excel文件上传到Server B又如何实现.
解决方案 »
- Ajax请求是出现12030的问题,高手帮忙解决一下。
- Type.GetType在这里如何使用
- gridview更新,取消按键的列宽问题
- IE8 beta2 卸载后vs2008 网站调试的问题
- Dim clsB As New sqlDLTP.business 需要加入什么控件,在VS2005 VB.NET语言.未定义类型“sqlDLTP.business”。
- 如何在iframe模拟的文本框里对选择的文本应用字体样式,取消样式?
- 窗口问题,高手请进。
- 在asp.net页面中是否可以访问asp页面中定义的session?
- 关于二进制图片读取问题
- 关于三层架构的2个问题。
- 小弟没分了,但是有一个 很紧手的Ajax问题,希望大家帮助
- ewebeditor出现安全问题“救命啊”
Select * Into ExcelTemp1 From OPENROWSET
('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE="+filepath+"',sheet1$)
insert OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.163;User ID=sa;Password=123'
).库名.dbo.表名(desnode,orgnode)
SELECT desnode,orgnode
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:11.xls";Extended properties=Excel 8.0')...sheet1$提示错误:OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 'sheet1$'。该表可能不存在,或当前用户没有使用该表的权限。
OLE DB 错误跟踪[Non-interface error: OLE DB provider does not contain the table: ProviderName='Microsoft.Jet.OLEDB.4.0', TableName='sheet1$']。
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
Select * Into ExcelTemp1 From OPENROWSET
('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE="+filepath+"',sheet1$)
____________________________________________________还有像你上面的写法,对输入数据的有效性是怎么判断的?
不过现在不需要判断,我是先把所有数据导到一张临时表,再从临时表导到表A
对数据的有效性你不是中间要有张中间转换表吗?中间转换的时候做试证不就得了。
我没用过DTS,怎么用,能详细些吗?大家给点思路,我快要急死了.
从网上看到不知是否可行,大家给点建议怎么办啊.
http://community.csdn.net/Expert/topic/3583/3583936.xml?temp=.8683283
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.表名)
1、ASP.NET通常运行在ASPNET用户上,我们无法用这个用户来登陆其他的机器(比如:DBServer),但是我们可以在web.config里配置模拟用户,比如:DataTransferUser,这个用户可以访问DBServer的某个文件夹(需要在DBServer上配置),此时在上传的时候,可以直接使用\\DBServer\Temp(必须共享FullControl)保存文件,在导入的时候使用本地路径即可。
2、或者使用同样的方法将WebServer的上传目录共享成Everyone(或者其他用户)FullControl。在导入的时候使用网络路径即可。如何模拟可以参考MSDN的帮助,也可以使用:<identity impersonate = "true"/>直接模拟匿名用户,在IIS中需要配DataTransferUser为匿名访问用户。个人意见仅供参考!
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);
}
我在Server B上做了共亨目录,给了Everyone所有权限,(Server B环境是win 2000没有aspnet用户)但上传还是提示同样的错误.
希望大家再说详细些.
可以选择任意一台有需要导入的文件和能连接目标服务器且安装有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包名"
1.机器A,B创建一个同名的windows用户,用户组设置为administrators,并设置相同的密码,做为备份文件夹文件夹的有效访问用户,操作:
我的电脑
--控制面板
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户2.在B机器器上,新建一个共享目录,做为备份文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: BAK
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
--确定
3.设置 MSSQLSERVER 及 SQLSERVERAGENT 服务的启动用户
开始--程序--管理工具--服务
--右键 MSSQLSERVER
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名
--"密码"中输入该用户的密码
--确定
--同样的方法设置 SQLSERVERAGENT4.在A机器上完成对B机器BAK目录的映射5.查询分析器中执行下面的语句,检验是否成功:
exec master..xp_cmdshell 'dir 映射的盘符'