Sql 插入数据库,对象必需字符串

Sql 插入数据库,对象必需字符串,sql,database,ms-access,asp-classic,Sql,Database,Ms Access,Asp Classic,我需要在数据库中插入一些数据,出现问题..它给了我一个错误: 源行: SET sql=“插入到产品(ProductName、SupID、CatID、Price、Pic、Description)值(“&pName&”、“&pbId&”、“&pcId&”、“&Price&“、”&Pic&“、”&desc&“)” 描述:需要对象:'[string:“插入产品”]' 我不明白他想要什么 这是我的代码: dimsql 暗淡的价格 暗描述 暗pName 暗淡pcId 暗淡pbId 模糊图片 设置pic=R

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

源行:

SET sql=“插入到产品(ProductName、SupID、CatID、Price、Pic、Description)值(“&pName&”、“&pbId&”、“&pcId&”、“&Price&“、”&Pic&“、”&desc&“)”
描述:需要对象:'[string:“插入产品”]'

我不明白他想要什么

这是我的代码:

dimsql
暗淡的价格
暗描述
暗pName
暗淡pcId
暗淡pbId
模糊图片
设置pic=Request.Form(“picUpload”)
set desc=Request.Form(“tbDescProduct”)
设置价格=申请表(“tbPriceProduct”)
set pcId=Request.Form(“ddlCategoryForProd”)
set pbId=Request.Form(“ddlBrandForProd”)
设置pName=Request.Form(“tbProductName”)
如果((bName“”)和(desc“”)和(price“”)和(pcId“-1”)和(pbId“-1”)和(pic“”),则
set con=Server.CreateObject(“ADODB.Connection”)
con.open“DRIVER={Microsoft Access驱动程序(*.mdb)};DBQ=“&Server.MapPath(“WebData/DB.mdb”)&”
设置rs=con.Execute(“从产品中选择*,其中ProductName='”&pName&“和mode=true”)
如果rs.EOF=真,则
设置sql=“在产品(ProductName、SupID、CatID、Price、Pic、Description)中插入值(‘“&pName&’、‘&pbId&’、‘&pcId&’、‘&Price&’、‘&Pic&’、‘&desc&’)”
设置rs=con.Execute(sql)
response.write(“警报('Product added successfully!');”)
其他的
response.write(“警报('产品已存在!');”)
如果结束
"完"

如果我猜的话,我会说您的问题是将
SupID
CatID
字段作为字符串传递,而它们可能是整数。以这种方式处理INSERT的问题是,您将自己置于SQL注入的环境中,并且会遇到类似于您在这里遇到的数据类型问题

在与数据库交互时,应尽可能使用参数化查询。在经典ASP中,最好的对象是
ADODB.Command

下面是一个使用您的代码的示例

注意:如果您对ADO命名常量(如
adParamInput
)有问题,请查看下面的链接部分,了解如何在
global.asa
文件中使用
METADATA
标记在整个应用程序中引用ADO类型库

Dim cmd、sql、连接字符串、rs、数据
不建议将数据库存储在网站根目录中
'将其存储在外部的另一个文件夹中,并在包含文件中设置一个变量
'以存储位置。那样的话,它不是每个人都可以访问的。
conn_string=“DRIVER={Microsoft Access DRIVER(*.mdb)};DBQ=“&Server.MapPath(“WebData/DB.mdb”)&”
Set cmd=Server.CreateObject(“ADODB.Command”)
sql=“从ProductName=?”的产品中选择*”
使用cmd
.ActiveConnection=conn\u字符串
.CommandType=adCmdText
.CommandText=sql
Call.Parameters.Append(.CreateParameter(@ProductName),adVarWChar,adParamInput,50))
设置rs=.Execute(,数组(pName))
如果不是rs.EOF,则data=rs.GetRows()
呼叫rs.Close()
设置rs=无
以
如果是数组(数据),则
sql=“”
sql=sql&“插入产品(产品名称、SupID、CatID、价格、图片、说明)”&vbCrLf
sql=sql&“值(?,,,,,,,,?)”
Set cmd=Server.CreateObject(“ADODB.Command”)
使用cmd
.ActiveConnection=conn\u字符串
.CommandType=adCmdText
.CommandText=sql
'定义参数
'对您的数据类型做出一些假设,但您可以根据需要修改这些假设
“这方面的好指南是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))
'在设置参数值之前,某些变量可能需要转换。
.Parameters(“@ProductName”).Value=pName
.Parameters(“@SupID”).Value=CLng(pbId)
.Parameters(“@CatID”).Value=CLng(pcId)
.Parameters(“@Price”)。值=价格
.Parameters(“@Pic”).Value=Pic
.Parameters(“@Description”).Value=desc
'执行命令
.Execute()
以
Set cmd=Nothing
Call Response.write(“警报('Product added successfully!');”)
其他的
Call Response.Write(“警报('产品已存在!');”)
如果结束
链接


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

sql = "Insert Into Products (ProductName,SupID,CatID,Price,Pic,Description) Values( '"&pName&"','"&pbId&"','"&pcId&"','"&price&"','"&pic&"','"&desc&"')" 
(在VBA和VB5/6中,您也可以在此处使用
LET
。)


当分配
请求的结果时,设置
的原因起作用。表单(“foo”)
调用是因为
表单
集合是对象的集合-针对
”的后续测试-1”
仅当返回的对象具有默认的无参数属性或方法,返回与字符串兼容的变量时才有效。

如果这解决了您的问题,您能将其标记为正确答案吗?没有注意到表单集合上的
+1但是代码还有其他问题,特别是当您将外键存储为字符串时,更不用说SQL注入攻击的漏洞了。