现在的流程是:每一步:上传Excel文件;第二步:把Excel文件导到sql的中间转换表;第三步:从转换表导入表A.Web程序服务器(Server A)和数据库(Server B)没在一台机子上,在本机测试没有问题,可以导入,程序和数据库要是在一台机子上可以实现.如果把文件上传到Server A,无法导入,从网上找了好多也没有找到类似的答案, 如果先把Excel文件上传到Server B又如何实现.

解决方案 »

  1.   

    现在的导入语句:
    Select * Into ExcelTemp1 From OPENROWSET
    ('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE="+filepath+"',sheet1$)
      

  2.   

    从网上找到Excel导入远程sql语句:
    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$']。
      

  3.   

    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
      

  4.   

    谢谢lykemp(kemp).不知我的意思说清楚了没有,我要实现的是web程序(Server A)和sql数据库(Server B)不是一台服务器,请注意,最好是C#的代码,先上传再导入.如何解决.
      

  5.   

    要实现的是web程序(Server A)和sql数据库(Server B)不是一台服务器,请注意,最好是C#的代码,先上传再导入:1.先将excel文件上传到(Server A)的某一目录;2.读取excel并写入sql.关于你说的web程序(Server A)和sql数据库(Server B)不是一台服务器,那没什么关系啊,只不过是web程序(Server A)所连接的数据库不同而已.不会影响写入数据.现在在家,身边没有这样的代码;所以就先给你个思路吧.
      

  6.   

    TO:smile9961(正是江南好风景,落花时节又逢君。) 如果先读Excel数据放到内存表里,再从内存表里读数据到sql的某张表,这样可以实现,但速度太慢,而且数据量大了以后占内存太大,几乎要死机,用户要保证10万条数据量,我现在直接用上面的导入语句,速度很快,但数据文件必须在sql数据库所在的某目录.如何解决.最好有代码.
      

  7.   

    哦,我做的没有这么大的数据量:一个excel中五个工作表一般总数据量不会超过1000行,像你这样要保证10万条的数据量,的确很难作到快。就是把插入数据的动作写成存储过程也作不到。在web上一次操作这么大的数据量,很难的。
      

  8.   

    现在的导入语句:
    Select * Into ExcelTemp1 From OPENROWSET
    ('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;IMEX=1;HDR=YES;DATABASE="+filepath+"',sheet1$)
    ____________________________________________________还有像你上面的写法,对输入数据的有效性是怎么判断的?
      

  9.   

    Excel文件的第一行是字段名,下面是数据,如果第一行的单元格空,就认为没有数据不导这一列.而且列名是从现有sql数据里的配置表里取出的字段.
    不过现在不需要判断,我是先把所有数据导到一张临时表,再从临时表导到表A
      

  10.   

    用DTS包导入。不会受服务器限制。
    对数据的有效性你不是中间要有张中间转换表吗?中间转换的时候做试证不就得了。
      

  11.   

    TOpowerllr(笨笨的招财鸡):
    我没用过DTS,怎么用,能详细些吗?大家给点思路,我快要急死了.
    从网上看到不知是否可行,大家给点建议怎么办啊.
    http://community.csdn.net/Expert/topic/3583/3583936.xml?temp=.8683283
      

  12.   

    我想到另一种方法就是把Excel的内容以二进制方法导入到数据库的某个表的字段中,但怎么再把这个数据读出来,存到另一张表里呢,以正常的显示方式?
      

  13.   

    --访问不同电脑上的数据库(远程只要联好网就一样)--如果经常访问或数据量大,建议用链接服务器--创建链接服务器
    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.表名)
      

  14.   

    上传到ServerA,数据库链接写ServerB也可以导入,如果也导入到ServerA的数据库,执行2次数据库的打开,执行语句,关闭即可
      

  15.   

    问题关键是这些服务器之间没有信任关系。
    1、ASP.NET通常运行在ASPNET用户上,我们无法用这个用户来登陆其他的机器(比如:DBServer),但是我们可以在web.config里配置模拟用户,比如:DataTransferUser,这个用户可以访问DBServer的某个文件夹(需要在DBServer上配置),此时在上传的时候,可以直接使用\\DBServer\Temp(必须共享FullControl)保存文件,在导入的时候使用本地路径即可。
    2、或者使用同样的方法将WebServer的上传目录共享成Everyone(或者其他用户)FullControl。在导入的时候使用网络路径即可。如何模拟可以参考MSDN的帮助,也可以使用:<identity impersonate = "true"/>直接模拟匿名用户,在IIS中需要配DataTransferUser为匿名访问用户。个人意见仅供参考!
      

  16.   

    仅仅提供其他机器的用户来对非本机的文件进行读取,还是会出现问题.所以,在提供模拟用户之后,你还必须先从代码中打通与他机的联系.访问局域网资源 
    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);
    }
      

  17.   

    谢谢net_lover(孟子E章), cuike519(marshal(Help you,Help me)) ,hchxxzx(NET?摸到一点门槛)
    我在Server B上做了共亨目录,给了Everyone所有权限,(Server B环境是win 2000没有aspnet用户)但上传还是提示同样的错误.
    希望大家再说详细些.
      

  18.   

    关于这个问题,你可以这样解决:创建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包名"
      

  19.   

    如果你希望通过设置共享来解决此问题,参考下面的设置备份文件共享目录的方法来解决问题下面假设A服务器上的数据库备份到B服务器(限两台服务器在同一局域网内,允许目录共享访问)
    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 映射的盘符'