输入值需要拆分

时间:2015-10-26 02:15:42

标签: sql vbscript asp-classic

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

输入值如下

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

我怎样才能以最好的方式做到这一点?

3 个答案:

答案 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语句的同时构建参数,这很简单,因为所有数据都是相同的类型sql = "Insert Into speldagar(date) Values('"& date &"')"
  • 这是adDBTimeStamp SQL命令,因此我们不期望结果集,我们可以通过在INSERT方法中指定adExecuteNoRecords来提高调用效率。

有用的链接

答案 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

谢谢你的回答:)