输入值需要拆分
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=]方法。
有用的链接
Carl Prothman - Data Type Mapping
我关于 ADO 中数据类型映射的权威“转到”指南,它从来没有误导我。
Using METADATA to Import DLL Constants
如果您遇到 adCmdText
、adDBTimeStamp
、adParamInput
和其他内置 ADO 常量的问题,您可能需要导入它们。 METADATA
是迄今为止最简洁的方法。
我找到了一个更简单有效的解决方案:)
myVariable = Request.Form("datumtid")
myArray = Split(myVariable,",")
For i = LBound(myArray) TO UBound(myArray)
Conn.Execute("Insert Into speldagar(date) Values('"& myArray(i) &"')")
Next
谢谢您的回答:)
我有一个输入文本发送多个值以存储在数据库中
输入值是这样的
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=]方法。
有用的链接
Carl Prothman - Data Type Mapping
我关于 ADO 中数据类型映射的权威“转到”指南,它从来没有误导我。Using METADATA to Import DLL Constants
如果您遇到adCmdText
、adDBTimeStamp
、adParamInput
和其他内置 ADO 常量的问题,您可能需要导入它们。METADATA
是迄今为止最简洁的方法。
我找到了一个更简单有效的解决方案:)
myVariable = Request.Form("datumtid")
myArray = Split(myVariable,",")
For i = LBound(myArray) TO UBound(myArray)
Conn.Execute("Insert Into speldagar(date) Values('"& myArray(i) &"')")
Next
谢谢您的回答:)