从 VBA 代码在数据库中插入 NULL 值
Inserting NULL values in a database from VBA code
我有 3 个单选按钮("YES"、"NO"、"UNKNOWN"),它们与我数据库中的一个列匹配,具有 3 个可能的值(1、0、NULL)。
When the radioButton selected is "UNKNOWN" I want to insert a NULL value in this table (using Variant type).但是当我尝试 运行 我的 SQL 查询与我的 ADODB 连接时,它 returns 一个错误。
有什么技巧可以在我的数据库中传递 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
我首先将我希望为 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;
您希望字符串用单引号括起来,不的数值用这样的单引号括起来,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
显然这意味着处理 when/whether 时要包含单引号,而当 不 时要包含单引号。
这可能会起作用……直到它不起作用:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O'Connor'
,candidat_Prenom = 'David'
...
我知道!我将简单地将字符串值中的任何单引号加倍! 可能有效:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O''Connor'
,candidat_Prenom = 'David'
...
但是从那座山上下去,你就可以兜风了......你会不断修补 "sanitizing" 用户的输入,直到一切正常,然后它们崩溃了,然后你修补它再次...
有一种明智的方法可以做到这一点。
使用参数,让服务器处理参数。
因此,不是将参数值连接到命令字符串中,而是将其发送到服务器:
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 = ?;
..连同 参数.
您没有使用 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
要给参数一个 NULL
值,只需使用 Null
关键字:
myValue = Null
这要求您的可空值具有 Variant
数据类型,因为 Integer
或 Boolean
不能是 VBA 中的 Null
。
只是对未来的想法 - 每当你遇到像这样的大 SQL 代码的问题时:
sqlQuery = "UPDATE candidatures SET offre_ID = " & idO & ", candidat_Nom = " & more and more more SQL here";"
执行以下操作:
- 写
debug.print sqlQuery
代码后。
- 从直接 window 中获取结果并检查它。
- 复制并带入Access查询。它应该工作。如果没有 - 进一步检查和调试。
编辑:如果您有 time
& knowledge
& will to write good code
,请不要编写这样的代码。您可能会遇到 SQL injection
和其他问题。而是使用 Mat's Mug 的答案中的方法。
我有 3 个单选按钮("YES"、"NO"、"UNKNOWN"),它们与我数据库中的一个列匹配,具有 3 个可能的值(1、0、NULL)。
When the radioButton selected is "UNKNOWN" I want to insert a NULL value in this table (using Variant type).但是当我尝试 运行 我的 SQL 查询与我的 ADODB 连接时,它 returns 一个错误。
有什么技巧可以在我的数据库中传递 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
我首先将我希望为 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;
您希望字符串用单引号括起来,不的数值用这样的单引号括起来,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
显然这意味着处理 when/whether 时要包含单引号,而当 不 时要包含单引号。
这可能会起作用……直到它不起作用:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O'Connor'
,candidat_Prenom = 'David'
...
我知道!我将简单地将字符串值中的任何单引号加倍! 可能有效:
UPDATE candidatures
SET offre_ID = 42
,candidat_Nom = 'O''Connor'
,candidat_Prenom = 'David'
...
但是从那座山上下去,你就可以兜风了......你会不断修补 "sanitizing" 用户的输入,直到一切正常,然后它们崩溃了,然后你修补它再次...
有一种明智的方法可以做到这一点。
使用参数,让服务器处理参数。
因此,不是将参数值连接到命令字符串中,而是将其发送到服务器:
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 = ?;
..连同 参数.
您没有使用 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
要给参数一个 NULL
值,只需使用 Null
关键字:
myValue = Null
这要求您的可空值具有 Variant
数据类型,因为 Integer
或 Boolean
不能是 VBA 中的 Null
。
只是对未来的想法 - 每当你遇到像这样的大 SQL 代码的问题时:
sqlQuery = "UPDATE candidatures SET offre_ID = " & idO & ", candidat_Nom = " & more and more more SQL here";"
执行以下操作:
- 写
debug.print sqlQuery
代码后。 - 从直接 window 中获取结果并检查它。
- 复制并带入Access查询。它应该工作。如果没有 - 进一步检查和调试。
编辑:如果您有 time
& knowledge
& will to write good code
,请不要编写这样的代码。您可能会遇到 SQL injection
和其他问题。而是使用 Mat's Mug 的答案中的方法。