【问题标题】:Inserting data into an db table from another db table – (Classic ASP) [closed]将数据从另一个 db 表插入到一个 db 表中——(经典 ASP)[关闭]
【发布时间】:2017-06-11 01:05:20
【问题描述】:

项目详情:带有 SQL 2012 的经典 ASP。

我有一个只有两列(“F1”和“F2”)的 Excel 文件,其中包含大约 3000 条记录。

我还有一个名为“BACKUPP”的 SQL2012 表,它有 3 列(“ID”“KODIKOS”“APOTHEMA”)。

我想将 Excel 中的所有数据插入“BACKUPP”表。 我已经通过以下方式成功连接到 Excel 和 sql db:

为了卓越:

Dim RS_EXCEL
Dim RS_EXCEL_cmd
Dim RS_EXCEL_numRows
Set RS_EXCEL_cmd = Server.CreateObject ("ADODB.Command")
RS_EXCEL_cmd.ActiveConnection = MM_connnectt_STRING
RS_EXCEL_cmd.CommandText = "SELECT * FROM ['Website stock$']" RS_EXCEL_cmd.Prepared = true
Set RS_EXCEL = RS_EXCEL_cmd.Execute
RS_EXCEL_numRows = 0

使用以下连接字符串:

MM_connnectt_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\OLA\SITES\SuperCleanerWINHOST\BACK\file.xls;Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"";"

对于 SQL 数据库:

Dim RS_SQL
Dim RS_SQL_cmd
Dim RS_SQL_numRows
Set RS_SQL_cmd = Server.CreateObject ("ADODB.Command")
RS_SQL_cmd.ActiveConnection = MM_syndesi_STRING
RS_SQL_cmd.CommandText = "SELECT * FROM dbo.BACKUPP" 
RS_SQL_cmd.Prepared = true
Set RS_SQL = RS_SQL_cmd.Execute
RS_SQL_numRows = 0

使用以下连接字符串:

MM_syndesi_STRING = "dsn=DSN_supercle_dsn;uid=DB_107185_cleanerdb_user;pwd=XXXXX;"

我的两个连接都可以在本地完美运行。我也在线测试过它们,并且没有任何问题。

所以我可以轻松地从 Excel 和 SQL db 检索数据而没有任何问题。 我的问题是我不知道如何将Excel db中的所有数据插入到sql db中。

我希望将 Excel db 的“F1”列插入“KODIKOS”列 和 要插入“APOTHEMA”列的 Excel db 的“F2”列。

我的编程知识不好。我主要是设计师。 任何帮助将不胜感激

【问题讨论】:

    标签: sql-server excel asp-classic


    【解决方案1】:

    丢弃您的 Dreamweaver 生成的代码。如果要插入数据,那么最好使用插入查询而不是打开另一个记录集。我会这样做:

    <%
    Dim conn1, conn2, rs, rssql, insertsql
    
    Set conn1 = Server.Createobject("ADODB.Connection")
    Set conn2 = Server.Createobject("ADODB.Connection")
    
    conn1.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\OLA\SITES\SuperCleanerWINHOST\BACK\file.xls;Extended Properties=""Excel 8.0;HDR=NO;IMEX=1"";"
    
    conn2.open "dsn=DSN_supercle_dsn;uid=DB_107185_cleanerdb_user;pwd=XXXXX;"
    
    set rs = Server.CreateObject("ADODB.Recordset")
    rssql = "SELECT * FROM ['Website stock$']"
    rs.open rssql,conn1,0,1 
    
    Do While Not rs.eof
    
    insertsql = "INSERT into dbo.BACKUPP (KODIKOS, APOTHEMA) values ('" & rs("F1") & "', '" & rs("F2") & "')"
    
    'Response.write insertsql
    conn2.execute(insertsql)
    
    rs.movenext
    Loop
    
    rs.close
    conn1.close
    conn2.close
    
    Set rs = Nothing
    Set conn1 = Nothing
    Set conn2 = Nothing
    %>
    

    基本上发生的事情是,我们正在循环遍历记录集,将 excel 文档中的每一行插入 SQL 数据库。

    我添加了注释掉的 response.write insertsql 语句,因为在将记录集变量插入 SQL 字符串时很容易出错,并且在尝试之前阅读脚本输出的实际 SQL 是个好主意执行它。为此,您取消注释 response.write 语句并注释 conn2.execute 语句。

    我假设这是一个“幕后”页面。如果它是面向公众的,那么你需要看看如何防止 SQL 注入攻击

    【讨论】:

    • 我看到它的那一刻是经典的 DW MM_ 代码我走开了......对不起。
    • 另外,如果他们有 SQL Server,他们could just do all that inside T-SQL,根本不需要经典 ASP。
    • 非常感谢您的帮助,约翰。我会用你的方法试试。再次感谢!
    • @user2986570 在不需要外部脚本的情况下在 SQL Server 中执行所有操作不会吸引人?
    • @user2986570 - 将逗号作为小数点问题,VBScript 有一个简单的替换功能。你可以使用replace(rs("F2"),",",".") 代替rs("F2") 它看起来很混乱,因为VBS 使用逗号作为分隔符。如果你用“£”替换“$”,那么它看起来像replace(rs("F2"),"$","£")
    【解决方案2】:

    对于这样的任务,您最好直接利用 SQL Server 的强大功能进行数据导入,这就是 OPENROWSET 的设计目的。

    INSERT INTO dbo.BACKUPP
    SELECT * 
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;Database=D:\OLA\SITES\SuperCleanerWINHOST\BACK\file.xls','SELECT * FROM [Website stock$]')
    

    这种方法的绝妙之处在于,您仍然可以从经典 ASP 中调用它,只需将其包装在存储过程中并通过 ADODB.Command 对象调用,例如;

    Dim cmd, conn_string
    conn_string = "dsn=DSN_supercle_dsn;uid=DB_107185_cleanerdb_user;pwd=XXXXX;"
    
    Set cmd = Server.CreateObject("ADODB.Command")
    With cmd
      .ActiveConnection = conn_string
      .CommandType = adCmdStoredProc
      .CommandText = "dbo.YourStoredProc"
      Call .Execute()
    End With
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多