【问题标题】:Insert into db, Object Required String插入数据库,对象必需字符串
【发布时间】:2014-03-29 09:44:48
【问题描述】:

我需要在数据库中插入一些数据,有问题..它给了我一个错误:

来源行:

SET sql ="Insert Into Products (ProductName,SupID,CatID,Price,Pic,Description) Values( '"&pName&"','"&pbId&"','"&pcId&"','"&price&"','"&pic&"','"&desc&"')" 

描述:所需对象:'[string: "Insert Into Products"]'

我不明白他想要什么..

这是我的代码:

dim sql
dim price
dim desc
dim pName
dim pcId
dim pbId
dim pic
set pic = Request.Form("picUpload")
set desc = Request.Form("tbDescProduct")
set price= Request.Form("tbPriceProduct")
set pcId =Request.Form("ddlCategoryForProd")
set pbId =Request.Form("ddlBrandForProd")
set pName=Request.Form("tbProductName")
IF((bName<>"")AND(desc<>"")AND(price<>"")AND(pcId<>"-1")AND(pbId<>"-1")AND (pic<>"")) THEN

set con = Server.CreateObject("ADODB.Connection")
con.open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("WebData/DB.mdb") & ";"  
set rs = con.Execute("Select * FROM Products WHERE ProductName = '"&pName&"' and mode= true")
IF rs.EOF = true then           
  SET sql ="Insert Into Products (ProductName,SupID,CatID,Price,Pic,Description) Values( '"&pName&"','"&pbId&"','"&pcId&"','"&price&"','"&pic&"','"&desc&"')"
  SET rs =con.Execute(sql)
  response.write("<script language=""javascript"">alert('Product added succesfully!');</script>") 
ELSE
  response.write("<script language=""javascript"">alert('Product already exist!');</script>") 
END IF

'END IF

【问题讨论】:

    标签: sql database ms-access asp-classic


    【解决方案1】:

    在 VBScript、VBA 和 VB5/6 中,需要SET 来分配对象引用;要分配任何其他类型的数据(包括字符串),只需将其删除:

    sql = "Insert Into Products (ProductName,SupID,CatID,Price,Pic,Description) Values( '"&pName&"','"&pbId&"','"&pcId&"','"&price&"','"&pic&"','"&desc&"')" 
    

    (在 VBA 和 VB5/6 中,您也可以在此处使用 LET。)

    在分配Request.Form("foo") 调用的结果时SET 起作用的原因是因为Form 集合是对象的集合 - 对"" 和"-1" 的后续测试仅因为返回的对象才有效具有返回字符串兼容变体的默认无参数属性或方法。

    【讨论】:

    • 如果这解决了你的问题,你能把它标记为正确答案吗?
    • 没有注意到表单集合上的Set 很好。 +1 虽然代码还有其他问题,特别是如果您将外键存储为字符串,更不用说 SQL 注入攻击的漏洞了。
    【解决方案2】:

    如果我猜我会说你的问题是你将SupID 和CatID 字段作为字符串传递,而它们可能是整数。以这种方式处理 INSERT 的问题是您让自己对 SQL 注入持开放态度,而且您会遇到像您在这里遇到的数据类型问题。

    在与数据库交互时,应尽可能尝试使用参数化查询。在经典 ASP 中,执行此操作的最佳对象是 ADODB.Command。

    这是一个使用您的代码的示例;

    注意:如果您对 adParamInput 等 ADO 命名常量有疑问,请查看下面的链接部分,了解如何在您的 global.asa 文件中使用 METADATA 标记以供参考应用程序中的 ADO 类型库。

    Dim cmd, sql, conn_string, rs, data
    
    'Wouldn't recommend storing your database inside your website root, instead
    'store it outside in another folder and set up a variable in an include file
    'to store the location. That way it is not accessible to everyone.
    conn_string = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("WebData/DB.mdb") & ";"
    
    Set cmd = Server.CreateObject("ADODB.Command")
    
    sql = "SELECT * FROM Products WHERE ProductName = ?"
    With cmd
      .ActiveConnection = conn_string
      .CommandType = adCmdText
      .CommandText = sql
      Call .Parameters.Append(.CreateParameter("@ProductName", adVarWChar, adParamInput, 50))
      Set rs = .Execute(, Array(pName))
      If Not rs.EOF Then data = rs.GetRows()
      Call rs.Close()
      Set rs = Nothing
    End With
    
    If IsArray(data) Then
      sql = ""
      sql = sql & "INSERT INTO Products (ProductName, SupID, CatID, Price, Pic, Description) " & vbCrLf
      sql = sql & "VALUES (?, ?, ?, ?, ?, ?)"
    
      Set cmd = Server.CreateObject("ADODB.Command")
      With cmd
        .ActiveConnection = conn_string
        .CommandType = adCmdText
        .CommandText = sql
        'Define Parameters
        'Making some assumptions about your data types, but you can modify these to fit
        'good guide for this is http://www.carlprothman.net/Technology/DataTypeMapping/tabid/97/Default.aspx
        Call .Parameters.Append(.CreateParameter("@ProductName", adVarWChar, adParamInput, 50))
        Call .Parameters.Append(.CreateParameter("@SupID", adInteger, adParamInput, 4))
        Call .Parameters.Append(.CreateParameter("@CatID", adInteger, adParamInput, 4))
        Call .Parameters.Append(.CreateParameter("@Price", adCurrency, adParamInput, 4))
        Call .Parameters.Append(.CreateParameter("@Pic", adVarWChar, adParamInput, 255))
        Call .Parameters.Append(.CreateParameter("@Description", adLongVarWChar, adParamInput, 1000))
        'Some of your variables may require conversion before setting the parameter values.
        .Parameters("@ProductName").Value = pName
        .Parameters("@SupID").Value = CLng(pbId)
        .Parameters("@CatID").Value = CLng(pcId)
        .Parameters("@Price").Value = price
        .Parameters("@Pic").Value = pic
        .Parameters("@Description").Value = desc
    
        'Execute Command
        .Execute()
      End With
      Set cmd = Nothing
      Call Response.write("<script language=""javascript"">alert('Product added succesfully!');</script>")
    Else
      Call Response.Write("<script language=""javascript"">alert('Product already exist!');</script>") 
    End If
    

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多