输入值需要拆分

input value needs to split

我有一个输入文本发送多个值以存储在数据库中

输入值是这样的

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)")

我怎样才能做到最好?

如果您有一个 2015-10-26, 2015-10-27, 2015-10-28 形式的输入字符串,您需要从结果标记中 split the string at commas and trim 白色 space:

dates = Request.Form("datumtid")
For Each d In Split(dates, ",")
  Conn.Execute "INSERT INTO speldagar (date) VALUES ('" & Trim(d) & "')"
Next

理论上,您可以在不使用 trim 的情况下执行 Split(dates, ", ")(即以逗号分隔后跟 space),但这需要格式正确的输入。在定界符处拆分然后 trim 生成的数组元素更可靠。

此外,我强烈建议反对通过字符串连接构建您的SQL查询,因为那样构建查询让你容易受到 SQL injection. Use a 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 服务器。

这应该会让您知道如何去做。

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 应该是动态构建的,完成后 sql 变量输出应该如下所示;

INSERT INTO speldagar ([date])
SELECT ?
UNION ALL
SELECT ?
UNION ALL
SELECT ?

关于这段代码有几点需要指出。

  • 避免使用 date 作为变量名。如果您打算在代码中的任何位置使用 Date() 函数,您尤其需要这样做。

  • 使用ADODB.Command对象构建参数化查询,这避免了SQL注入代码的可能性;

     sql = "Insert Into speldagar(date) Values('"& date &"')"
    
  • 我们可以在构建 SQL 语句的同时构建我们的参数,这很简单,因为所有数据都是同一类型 (adDBTimeStamp).

  • 这是一个 INSERT SQL 命令,因此我们不需要结果集,我们可以通过在 [=] 中指定 adExecuteNoRecords 来提高调用效率20=]方法。


有用的链接

我找到了一个更简单有效的解决方案:)

myVariable = Request.Form("datumtid")

myArray = Split(myVariable,",")

For i = LBound(myArray) TO UBound(myArray)

Conn.Execute("Insert Into speldagar(date) Values('"& myArray(i) &"')")

Next

谢谢您的回答:)