আমি currentDb.Execute
এবং Docmd.RunSQL
একটি সহায়ক ফাংশন দিয়ে প্রতিস্থাপন করেছি । এটি প্রাক-প্রক্রিয়াজাতকরণ এবং এসকিউএল বিবৃতি পরিবর্তন করতে পারে যদি কোনও আপডেটের বিবৃতিতে কেবল একটি সারণী থাকে। আমার কাছে ইতিমধ্যে একটি dual
(একক সারি, একক কলাম) টেবিল রয়েছে তাই আমি একটি নকল টেবিল বিকল্পটি দিয়ে গেলাম।
দ্রষ্টব্য : এটি আপনার ক্যোয়ারী অবজেক্টগুলিকে পরিবর্তন করবে না। এটি কেবলমাত্র ভিবিএর মাধ্যমে এসকিউএলকে কার্যকর করতে সহায়তা করবে।If you would like to change your query objects, use FnQueryReplaceSingleTableUpdateStatements and update your sql in each of your querydefs. Shouldn't be a problem either.
এটি কেবল একটি ধারণা (If it's a single table update modify the sql before execution)
। আপনার প্রয়োজন অনুসারে এটিকে মানিয়ে নিন। এই পদ্ধতিটি প্রতিটি টেবিলের জন্য প্রতিস্থাপন অনুসন্ধান তৈরি করে না (যা সবচেয়ে সহজ উপায় হতে পারে তবে এটির নিজস্ব ঘাটতি রয়েছে ie অর্থাত পারফরম্যান্সের সমস্যা)
+ + পয়েন্ট:
আপনি করতে পারেন অবিরত পরেও মাইক্রোসফট বাগ কিছু পরিবর্তন করবে না ফিক্সিং এই সাহায্যকারী ব্যবহার করতে। ক্ষেত্রে, ভবিষ্যতে অন্য সমস্যা নিয়ে আসে, আপনি pre-process
এক জায়গায় আপনার এসকিউএল এর জন্য প্রস্তুত । আমি আপডেটগুলি আনইনস্টল করার জন্য যাইনি কারণ এজন্য অ্যাডমিন অ্যাক্সেস প্রয়োজন + সবাইকে সঠিক সংস্করণে আনতে খুব বেশি সময় লাগবে + আপনি আনইনস্টল করলেও কিছু শেষ ব্যবহারকারীদের গোষ্ঠী নীতি সর্বশেষ আপডেটটি আবার ইনস্টল করে। আপনি আবার একই সমস্যায় ফিরে এসেছেন।
আপনার যদি সোর্স-কোডে অ্যাক্সেস থাকে use this method
এবং আপনি 100% নিশ্চিত যে কোনও অনন্তকারের সমস্যা নেই।
Public Function Execute(Query As String, Optional Options As Variant)
'Direct replacement for currentDb.Execute
If IsBlank(Query) Then Exit Function
'invalid db options remove
If Not IsMissing(Options) Then
If (Options = True) Then
'DoCmd RunSql query,True ' True should fail so transactions can be reverted
'We are only doing this so DoCmd.RunSQL query, true can be directly replaced by helper.Execute query, true.
Options = dbFailOnError
End If
End If
'Preprocessing the sql command to remove single table updates
Query = FnQueryReplaceSingleTableUpdateStatements(Query)
'Execute the command
If ((Not IsMissing(Options)) And (CLng(Options) > 0)) Then
currentDb.Execute Query, Options
Else
currentDb.Execute Query
End If
End Function
Public Function FnQueryReplaceSingleTableUpdateStatements(Query As String) As String
' ON November 2019 Microsoft released a buggy security update that affected single table updates.
'/programming/58832269/getting-error-3340-query-is-corrupt-while-executing-queries-docmd-runsql
Dim singleTableUpdate As String
Dim tableName As String
Const updateWord As String = "update"
Const setWord As String = "set"
If IsBlank(Query) Then Exit Function
'Find the update statement between UPDATE ... SET
singleTableUpdate = FnQueryContainsSingleTableUpdate(Query)
'do we have any match? if any match found, that needs to be preprocessed
If Not (IsBlank(singleTableUpdate)) Then
'Remove UPDATe keyword
If (VBA.Left(singleTableUpdate, Len(updateWord)) = updateWord) Then
tableName = VBA.Right(singleTableUpdate, Len(singleTableUpdate) - Len(updateWord))
End If
'Remove SET keyword
If (VBA.Right(tableName, Len(setWord)) = setWord) Then
tableName = VBA.Left(tableName, Len(tableName) - Len(setWord))
End If
'Decide which method you want to go for. SingleRow table or Select?
'I'm going with a fake/dual table.
'If you are going with update (select * from T) as T, make sure table aliases are correctly assigned.
tableName = gDll.sFormat("UPDATE {0},{1} SET ", tableName, ModTableNames.FakeTableName)
'replace the query with the new statement
Query = vba.Replace(Query, singleTableUpdate, tableName, compare:=vbDatabaseCompare, Count:=1)
End If
FnQueryReplaceSingleTableUpdateStatements = Query
End Function
Public Function FnQueryContainsSingleTableUpdate(Query As String) As String
'Returns the update ... SET statment if it contains only one table.
FnQueryContainsSingleTableUpdate = ""
If IsBlank(Query) Then Exit Function
Dim pattern As String
Dim firstMatch As String
'Get the pattern from your settings repository or hardcode it.
pattern = "(update)+(\w|\s(?!join))*set"
FnQueryContainsSingleTableUpdate = FN_REGEX_GET_FIRST_MATCH(Query, pattern, isGlobal:=True, isMultiline:=True, doIgnoreCase:=True)
End Function
Public Function FN_REGEX_GET_FIRST_MATCH(iText As String, iPattern As String, Optional isGlobal As Boolean = True, Optional isMultiline As Boolean = True, Optional doIgnoreCase As Boolean = True) As String
'Returns first match or ""
If IsBlank(iText) Then Exit Function
If IsBlank(iPattern) Then Exit Function
Dim objRegex As Object
Dim allMatches As Variant
Dim I As Long
FN_REGEX_GET_FIRST_MATCH = ""
On Error GoTo FN_REGEX_GET_FIRST_MATCH_Error
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Multiline = isMultiline
.Global = isGlobal
.IgnoreCase = doIgnoreCase
.pattern = iPattern
If .test(iText) Then
Set allMatches = .Execute(iText)
If allMatches.Count > 0 Then
FN_REGEX_GET_FIRST_MATCH = allMatches.item(0)
End If
End If
End With
Set objRegex = Nothing
On Error GoTo 0
Exit Function
FN_REGEX_GET_FIRST_MATCH_Error:
FN_REGEX_GET_FIRST_MATCH = ""
End Function
এখন মাত্র CTRL+F
অনুসন্ধান করুন প্রতিস্থাপন docmd.RunSQL
সঙ্গেhelper.Execute
অনুসন্ধান করুন প্রতিস্থাপন [currentdb|dbengine|or your dbobject].execute
সঙ্গেhelper.execute
আনন্দ কর!