我有一个输入文本发送乘法值以存储在数据库中
输入值如下
2015-10-26, 2015-10-27, 2015-10-28
date = Request.Form("datumtid")
Conn.Execute("Insert Into speldagar(date) Values('"& date &"')")
但我需要将每个日期添加到单行中 为例
date = Request.Form("datumtid")
Conn.Execute("Insert Into speldagar(date) Values(2015-10-26)")
Conn.Execute("Insert Into speldagar(date) Values(2015-10-27)")
我怎样才能以最好的方式做到这一点?
答案 0 :(得分:1)
如果您有2015-10-26, 2015-10-27, 2015-10-28
形式的单个输入字符串,则需要split逗号处的字符串和trim生成的标记中的空格:
dates = Request.Form("datumtid")
For Each d In Split(dates, ",")
Conn.Execute "INSERT INTO speldagar (date) VALUES ('" & Trim(d) & "')"
Next
从理论上讲,你可以做一个Split(dates, ", ")
(即用逗号分隔后跟一个空格)而不进行修剪,但这需要正确格式化的输入。在分隔符处拆分然后修剪结果数组元素会更加健壮。
此外,我强烈建议反对通过字符串连接来构建SQL查询,因为以这种方式构建查询会使您容易受到SQL injection的攻击。使用prepared statement来避免这种情况:
qry = "INSERT INTO speldagar (date) VALUES (?)"
dates = Request.Form("datumtid")
For Each d In Split(dates, ",")
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = Conn
cmd.CommandText = qry
Set param = cmd.CreateParameter("@date" , 135, 1, 0, Trim(d))
cmd.Parameters.Append param
cmd.Execute
Next
请注意,正如@Lankymart指出的那样,这仍然是一种次优的方法,因为它会执行多次插入,但执行效果不佳。这样的事情可能会更好:
baseQry = "INSERT INTO speldagar (date) VALUES "
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = Conn
dates = Split(Request.Form("datumtid"), ",")
ReDim fields(UBound(dates))
For i = 0 To UBound(dates)
fields(i) = "(?)"
Set param = cmd.CreateParameter("@date" , 135, 1, 0, Trim(dates(i)))
cmd.Parameters.Append param
Next
cmd.CommandText = baseQry & Join(fields, ",")
cmd.Execute
无法测试它,因为我无法访问SQL Server。
答案 1 :(得分:1)
这应该会让你知道如何去做。
{ name: 'Export To Excel ', index: 'exporttoexcel', sortable: false, editable: true,title:false, search: false,formatter: AppendCheckBox ,width:30},
* 此代码完全是伪编码且未经测试
SQL应该是动态构建的,Dim datumtids, data, sql
Dim item, items
datumtids = Request.Form("datumtid") & ""
data = Split(dataumtids, ",")
sql = ""
Dim cmd, conn, affected
conn = "..." 'The database connection string
If IsArray(data) Then
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandType = adCmdText
sql = sql & "INSERT INTO speldagar ([date])" & vbCrLf
items = UBound(data)
For item = LBound(data) To items
sql = sql & "SELECT ?" & vbCrLf
Call cmd.Parameters.Append(cmd.CreateParameter("@item" & item, adDBTimeStamp, adParamInput, 8))
If item < items Then sql = sql & "UNION ALL" & vbCrLf
Next
cmd.CommandText = sql
Call cmd.Execute(affected, data, adExecuteNoRecords)
Set cmd = Nothing
End If
变量输出应该在完成后看起来像这样;
sql
有关此代码的一些事情。
INSERT INTO speldagar ([date])
SELECT ?
UNION ALL
SELECT ?
UNION ALL
SELECT ?
作为变量名称。如果您打算在代码中的任何位置使用date
函数,您尤其希望这样做。使用Date()
对象构建参数化查询,这避免了SQL注入代码的可能性;
ADODB.Command
sql = "Insert Into speldagar(date) Values('"& date &"')"
)。adDBTimeStamp
SQL命令,因此我们不期望结果集,我们可以通过在INSERT
方法中指定adExecuteNoRecords
来提高调用效率。 Carl Prothman - Data Type Mapping
我对ADO中数据类型映射的最终“转到”指南,从来没有指导过我。
Using METADATA to Import DLL Constants
如果您遇到.Execute()
,adCmdText
,adDBTimeStamp
和其他内置ADO常量问题,则可能需要导入它们。到目前为止,adParamInput
是最干净的方式。
答案 2 :(得分:-1)
我找到了一个更简单的解决方案:)
myVariable = Request.Form("datumtid")
myArray = Split(myVariable,",")
For i = LBound(myArray) TO UBound(myArray)
Conn.Execute("Insert Into speldagar(date) Values('"& myArray(i) &"')")
Next
谢谢你的回答:)