Мені потрібно вставити деякі дані в БД, є проблема .. це дає мені помилку:
Рядок джерела:
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
Відповіді:
3 для відповіді № 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
тут.)
Причина SET
працює при призначенні результату a Request.Form("foo")
дзвінок тому, що Form
collection - це колекція об'єктів - наступні тести проти ""
і "-1"
є дійсними лише тому, що повернуті об'єкти мають властивість або метод без параметрів за замовчуванням, які повертають сумісний з рядками варіант.
1 для відповіді № 2
Якби я здогадався, я б сказав, що твоя проблема в тому, що ти передаєш SupID
і CatID
поля у вигляді рядків, якщо вони, ймовірно, є цілими числами.Проблема з обробкою INSERT таким чином полягає в тому, що ви залишаєтесь відкритими для SQL Injection, а також стикаєтесь з проблемами типу даних, які, здається, ви відчуваєте тут.
По можливості під час взаємодії з базою даних намагайтеся використовувати параметризовані запити. У класичному ASP найкраще це зробити ADODB.Command
.
Ось приклад використання вашого коду;
ПРИМІТКА: Якщо у вас виникли проблеми з ADO, іменовані константи, такі як
adParamInput
потім перегляньте розділ посилань нижче, щоб дізнатися, як користуватисяMETADATA
тег у вашомуglobal.asa
файл для посилання на бібліотеку типів 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
Посилання
- Картографування типів даних
- Використання METADATA для імпорту констант DLL
- Відповідь із вставки SQL в базу даних з апострофом