我有3个radioButtons("YES","NO","UNKNOWN"),它与我的数据库中的列匹配3个可能的值(1,0,NULL).
当选择的radioButton是"UNKNOWN"时,我想在此表中插入一个NULL值(使用Variant类型).但是当我尝试使用ADODB连接运行SQL查询时,它会返回错误.
有没有在我的数据库中传递NULL值的技巧?这是我的代码的副本:
Public Function setCandidature(idC As Integer, idO As Integer, nomC As String, prenomC As String, nomM As String, prenomM As String, idRegion As Integer, idUM As Integer, idDUM As Integer, nni As String, emploiC As String, repM As Integer, repA As Integer, accDisp As Integer, precAcc1 As Integer, precAcc2 As Integer)
Dim sqlQuery As String
Dim rs As ADODB.Recordset
Dim repAVar As Variant, repMVar As Variant
Set connect = New ADODB.Connection
connect.Open connString
If repA = -1 Then
repAVar = Null
Else
repAVar = repA
End If
If repM = -1 Then
repMVar = Null
Else
repMVar = repM
End If
sqlQuery = "UPDATE candidatures SET offre_ID = " & idO & ", candidat_Nom = " & nomC & ", candidat_Prenom = " & prenomC & ", manager_Nom = " & nomM & ", manager_Prenom = " & prenomM & ", reponse_Manager = " & repMVar & ", reponse_Agent = " & repAVar & ", region_Candidat = " & idRegion & _
", um_Candidat = " & idUM & ", dum_Candidat = " & idDUM & ", nni_Candidat = " & nni & ", emploi_Candidat = " & emploiC & ", accompagnement_Dispense = " & accDisp & ", accompagnement_Precision_ID = " & precAcc1 & ", accompagnement2_Precision_ID = " & precAcc2 & _
" WHERE candidature_ID = " & idC & ";"
rs.Open sqlQuery, connect
End Function
Run Code Online (Sandbox Code Playgroud)
我首先传递我想要为NULL的值作为包含-1的整数.
你想要的是你的SQL语句最终看起来像这样:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'Doe'
,candidat_Prenom = 'John'
,manager_Nom = 'Nuts'
,manager_Prenom = 'Doug'
,reponse_Manager = NULL
,reponse_Agent = NULL
,region_Candidat = 'WEST'
,um_Candidat = 72
,dum_Candidat = 72
,nni_Candidat = 24
,emploi_Candidat = 'something'
,accompagnement_Dispense = 'whatever'
,accompagnement_Precision_ID = 10
,accompagnement2_Precision_ID = 11
WHERE candidature_ID = 2345;
Run Code Online (Sandbox Code Playgroud)
您希望将字符串括在单引号中,不要将数值括在这样的单引号中,并按NULL字面指定值.
您可以保留字符串连接方法,并NULL通过将"NULL"字符串文字连接到查询中来使查询包含值:
If repA = -1 Then
repAVar = "NULL"
Else
repAVar = repA
End If
If repM = -1 Then
repMVar = "NULL"
Else
repMVar = repM
End If
Run Code Online (Sandbox Code Playgroud)
显然,这意味着处理何时/是否包含单引号,何时不包括.
这可能会奏效......直到它没有:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O'Connor'
,candidat_Prenom = 'David'
...
Run Code Online (Sandbox Code Playgroud)
我知道!我只是将字符串值中的任何单引号加倍!这可能会奏效:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O''Connor'
,candidat_Prenom = 'David'
...
Run Code Online (Sandbox Code Playgroud)
但是去那座小山然后你要去搭车......你会继续修补并"清理"用户的输入,直到事情再次起作用,然后它们就会崩溃,然后你再次修补它......
这是一种理智的方式.
使用参数,让服务器处理参数.
因此,不是将参数值连接到命令字符串中,而是将其发送到服务器:
UPDATE candidatures
SET offre_ID = ?
,candidat_Nom = ?
,candidat_Prenom = ?
,manager_Nom = ?
,manager_Prenom = ?
,reponse_Manager = ?
,reponse_Agent = ?
,region_Candidat = ?
,um_Candidat = ?
,dum_Candidat = ?
,nni_Candidat = ?
,emploi_Candidat = ?
,accompagnement_Dispense = ?
,accompagnement_Precision_ID = ?
,accompagnement2_Precision_ID = ?
WHERE candidature_ID = ?;
Run Code Online (Sandbox Code Playgroud)
..带参数.
你没有使用Recordset.你使用的是Command:
Dim connect As ADODB.Connection
Set connect = New ADODB.Connection
connect.ConnectionString = connString
connect.Open
With New ADODB.Command
.ActiveConnection = connect
.CommandType = adCmdText
.CommandText = sqlQuery
'append parameters in the same order they show up in the query
.Parameters.Append .CreateParameter(Type:=adInteger, Direction:=adParamInput, Value:=myValue)
'...
.Execute
End With
connect.Close
Run Code Online (Sandbox Code Playgroud)
要为参数NULL赋值,只需使用Null关键字:
myValue = Null
Run Code Online (Sandbox Code Playgroud)
这要求您的可空值具有Variant数据类型,因为一个Integer或Boolean不能Null在VBA中.
| 归档时间: |
|
| 查看次数: |
4564 次 |
| 最近记录: |