我有一个迁移工作,我需要在完成后验证目标数据.为了通知管理员验证成功/失败,我使用一个计数器来比较Database1中表Foo的行数和Database2中表Foo的行数.
Database2中的每一行都根据Database1中的相应行进行验证.为了加快这个过程,我使用了一个Parallel.ForEach循环.
我最初的问题是计数总是与我的预期不同.我后来发现+=和-=操作不是线程安全的(不是原子的).为了解决这个问题,我更新了用于Interlocked.Increment计数器变量的代码.此代码打印的计数更接近实际计数,但是,每次执行时它似乎都不同,并且它不会给出我期望的结果:
Private countObjects As Integer
Private Sub MyMainFunction()
Dim objects As List(Of MyObject)
'Query with Dapper, unrelevant to the problem.
Using connection As New System.Data.SqlClient.SqlConnection("aConnectionString")
objects = connection.Query("SELECT * FROM Foo") 'Returns around 81000 rows.
End Using
Parallel.ForEach(objects, Sub(u) MyParallelFunction(u))
Console.WriteLine(String.Format("Count : {0}", countObjects)) 'Prints "Count : 80035" or another incorrect count, which seems to differ on each execution of MyMainFunction.
End Sub
Private Sub MyParallelFunction(obj As MyObject)
Interlocked.Increment(countObjects) 'Breakpoint …Run Code Online (Sandbox Code Playgroud) 我使用a SmtpClient使用SSL通过SMTP服务器发送电子邮件.此SMTP服务器配置为使用自签名证书.
由于我无法在所有客户端计算机上安装证书,因此我添加了一个ServicePointManager.ServerCertificateValidationCallback来为我们的自签名证书实现自定义验证.
但是,我想只在我使用时执行自定义验证SmtpClient,并在其他地方执行证书验证时恢复为默认行为.
由于回调是静态属性,我还应该确保回调不是由我用来发送电子邮件的其他线程调用的.
我想出了以下代码:
Private Shared _defaultServerCertificateValidationCallback As System.Net.Security.RemoteCertificateValidationCallback
Private Shared _overrideSmtpCertificateValidation As Boolean = False
Private Shared _callbackLocker As New Object()
Private Shared Function OurCertificateValidation(s As Object, certificate As Security.Cryptography.X509Certificates.X509Certificate, chain As Security.Cryptography.X509Certificates.X509Chain, sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
SyncLock _callbackLocker
If _overrideSmtpCertificateValidation Then
_overrideSmtpCertificateValidation = False
Dim actualCertificate = Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile("selfSignedSmtp.cert")
Return certificate.Equals(actualCertificate)
Else
'Should execute the default certificate validation.
Return _defaultServerCertificateValidationCallback(s, certificate, chain, sslPolicyErrors)
End If
End SyncLock
End Function
Public Sub …Run Code Online (Sandbox Code Playgroud) 我在 Access 中有一个查询,其中一个字段包含一个子查询,该子查询返回相关表中特定字段的总和。子查询的结果用于主查询中的进一步计算。
这用于使用 ADO.Net 的 VB.Net(C# 会很好)中的自制报告应用程序。查询存储在 Access 中的一个表中,使我们可以更正小错误或添加与数据相关的临时功能,而无需再次发布我们的应用程序。
问题是子查询可能不返回任何结果(空)。此外,计算中使用的空值也将返回空值。因此,如果需要,我需要将空值替换为 0。我添加了NZ(subquery, 0),但 ADO.Net 抛出以下异常:
Undefined function 'NZ' in expression
Run Code Online (Sandbox Code Playgroud)
我了解到不可能在 ADO.Net 中使用 VBA 函数,因为它是 Access.Application 对象的一部分。
我也考虑使用IIF(subquery Is Null, 0, subquery),但这会迫使我复制子查询,并强制 Access 执行子查询两次(可能)。由于子查询相当复杂(主查询也是如此),我想避免这种情况,至少为了可读性,如果不是性能。
是否有另一种方法可以用另一个值替换空值,或者确保即使没有匹配的记录,我的子查询也将始终返回非空和?