ডকসিএমডি.রুনএসকিউএল অনুসন্ধান চালানোর সময় ত্রুটি 3340 পাওয়া '' দুর্নীতিগ্রস্থ


83

অফিস 2010 এর জন্য উইন্ডোজ আপডেট ইনস্টল করার পরে কেবি 4484127 কে সমাধান করার জন্য আমি WHERE ধারাটিতে থাকা ক্যুরিগুলি চালানোর সময় ত্রুটি পাই।

উদাহরণস্বরূপ এই কোয়েরি কার্যকর করা:

DoCmd.RunSQL "update users set uname= 'bob' where usercode=1"

এই ত্রুটির ফলাফল:

ত্রুটি নম্বর = 3340 ক্যোয়ারী '' দূষিত

প্রশ্নে আপডেট বর্তমানে এখনও ইনস্টল করা:

মাইক্রোসফ্ট অফিস 2010 সার্ভিস প্যাক 2 আপডেট 448127 দেখাচ্ছে স্ক্রিনশট

আমি কীভাবে আমার প্রশ্নগুলি সফলভাবে চালাতে পারি? আমার কি এই আপডেটটি আনইনস্টল করা উচিত?

উত্তর:


92

সারসংক্ষেপ

এটি 12 নভেম্বর, 2019 এ প্রকাশিত অফিস আপডেটের কারণে পরিচিত একটি বাগ রয়েছে The বাগটি বর্তমানে মাইক্রোসফ্ট দ্বারা সমর্থিত অ্যাক্সেসের সমস্ত সংস্করণকে প্রভাবিত করে (অ্যাক্সেস 2010 থেকে 365)।

এই বাগ সংশোধন করা হয়েছে।

  • আপনি যদি অফিসের কোনও সি 2 আর (ক্লিক-টু-রান) সংস্করণ ব্যবহার করেন তবে "এখনই আপডেট করুন" ব্যবহার করুন :
    • অ্যাক্সেস 2010 সি 2 আর: 7243.5000 বিল্ডে স্থির
    • অ্যাক্সেস 2013 সি 2 আর: 5197.1000 বিল্ডে স্থির
    • অ্যাক্সেস 2016 সি 2 আর: 12130.20390 বিল্ডে স্থির
    • অ্যাক্সেস 2019 (v1910): 12130.20390 বিল্ডে স্থির
    • অ্যাক্সেস 2019 (ভলিউম লাইসেন্স): বিল্ড 10353.20037 এ স্থির
    • অফিস 365 মাসিক চ্যানেল: 12130.20390 বিল্ডে স্থির
    • অফিস 365 আধা-বার্ষিক: 11328.20480 বিল্ডে স্থির
    • অফিস 365 আধা-বার্ষিক প্রসারিত: 10730.20422 বিল্ডে স্থির
    • অফিস 365 আধা-বার্ষিক লক্ষ্যযুক্ত: বিল্ড 11929.20494 এ স্থির
  • আপনি যদি অফিসের একটি এমএসআই সংস্করণ ব্যবহার করেন তবে আপনার অফিস সংস্করণের সাথে মিলে আপডেটটি ইনস্টল করুন। এই সমস্ত প্যাচগুলি মাইক্রোসফ্ট আপডেটে প্রকাশ করা হয়েছে, সুতরাং সমস্ত মুলতুবি উইন্ডোজ আপডেটগুলি ইনস্টল করা যথেষ্ট হবে:

উদাহরণ

এখানে একটি ন্যূনতম নিন্দিত উদাহরণ:

  1. একটি নতুন অ্যাক্সেস ডাটাবেস তৈরি করুন।
  2. ডিফল্ট আইডি ক্ষেত্র এবং একটি দীর্ঘ পূর্ণসংখ্যার ক্ষেত্র "মিনিন্ট" সহ একটি নতুন, খালি টেবিল "টেবিল 1" তৈরি করুন।
  3. ভিবিএ সম্পাদকের তাত্ক্ষণিক উইন্ডোতে নিম্নলিখিত কোডটি কার্যকর করুন:

    CurrentDb.Execute "UPDATE Table1 SET myint = 1 WHERE myint = 1"

প্রত্যাশিত ফলাফল : বিবৃতিটি সফলভাবে শেষ হয়েছে।

বগি আপডেটগুলির মধ্যে একটি সহ প্রকৃত ফলাফল ইনস্টল: রান-টাইম ত্রুটি 3340 ঘটে ("ক্যোয়ারী '' দূষিত")।


সম্পর্কিত লিংক:


9
এই পোস্টটি 64-বিট অ্যাক্সেস রানটাইম এবং OLEDB ব্যবহার করে একই ত্রুটির সম্মুখীন হয়েছে বলে মনে হচ্ছে। ভীতিজনক স্টাফ, এটি এমন অনেকগুলি অ্যাপ্লিকেশন তৈরি করবে যা ডেটা সঞ্চয় করতে অ্যাক্সেসকে ব্যবহারযোগ্য করে তুলবে না।
এরিক এ

4
আমি কেবল অফিস ২০১৩ 32-বিট সহ একটি সিস্টেম যাচাই করেছি এবং সেই নির্দিষ্ট মেশিনে আপডেটের জন্য ইউআইডি রয়েছে 90150000-006E-0409-0000-0000000FF1CE... তা -0409-নয় -0407-
গর্ড থম্পসন

4
আমি কেবল অফিসে অন্য একটি মেশিন পরীক্ষা করেছি যেটিতে অফিস 2013 64৪-বিট রয়েছে এবং ইউআইডিও রয়েছে -006E-0409-। উভয়ই মেশিনে মাইক্রোসফ্ট অফিস 2013 (KB2850036) এর জন্য সার্ভিস প্যাক 1 রয়েছে।
গর্ড থম্পসন

4
অফিস 2010 প্রো প্লাস (এসপি 2) এর জন্য আমাদের {90140000-0011-0000-0000-0000000FF1CE}ব্যাচ স্ক্রিপ্টটি ব্যবহার করা দরকার । নোট {9014...নয়{9114..}
অ্যাডামসটিপস

2
আমি সমস্যাটি সমাধানের জন্য অফিসিয়াল আপডেটের সাথে প্যাচ করেছি তবে আমি এখনও ত্রুটিটি পাচ্ছি। অন্য কারও সমস্যা হয়েছে?
ব্যবহারকারী 218076

33

সিম্পল সলিউশন

আমার ব্যবহারকারীদের জন্য, মাইক্রোসফ্ট থেকে একটি ফিক্স রিলিজের জন্য 10 ডিসেম্বর পর্যন্ত প্রায় এক মাস অপেক্ষা করা কোনও বিকল্প নয়। কিংবা বেশ কয়েকটি সরকারী লকড ওয়ার্কস্টেশন জুড়ে আপত্তিজনক মাইক্রোসফ্ট আপডেট আনইনস্টল করছে না।

আমাকে একটি কাজের প্রয়োগ করতে হবে, তবে মাইক্রোসফ্ট যা বলেছিল তাতে ঠিক শিহরিত হচ্ছি না - প্রতিটি টেবিলের জন্য একটি অনুসন্ধান তৈরি এবং প্রতিস্থাপন করা উচিত।

সমাধানটি হ'ল টেবিলের নামটি (SELECT * FROM Table)সরাসরি UPDATEকমান্ডে একটি সাধারণ ক্যোয়ারির সাথে প্রতিস্থাপন করা । এটির জন্য এক টন অতিরিক্ত অনুসন্ধান, টেবিল বা ফাংশন তৈরি এবং সংরক্ষণের প্রয়োজন হয় না।

উদাহরণ:

আগে:

UPDATE Table1 SET Field1 = "x" WHERE (Field2=1);  

পরে:

UPDATE (SELECT * FROM Table1) SET Field1 = "x" WHERE (Field2=1);  

এটি বেশ কয়েকটি ডাটাবেস এবং অ্যাপ্লিকেশনগুলিতে (এবং পরে রোলব্যাক) জুড়ে প্রয়োগ করা আরও সহজ হওয়া উচিত।


20

এটি একটি উইন্ডোজ আপডেট সমস্যা নয়, তবে এমন একটি সমস্যা যা নভেম্বর প্যাচ মঙ্গলবার অফিসের প্রকাশের সাথে চালু হয়েছিল। সুরক্ষা দুর্বলতা ঠিক করার পরিবর্তনের ফলে কিছু বৈধ প্রশ্নকে দুর্নীতিগ্রস্থ বলে প্রতিবেদন করা হয়। পরিবর্তনটি একটি সুরক্ষা স্থিরকরণের কারণে, এটি 2010, 2013, 2016, 2019 এবং O365 সহ অফিসের সমস্ত বিল্ডকে প্রভাবিত করে।

সমস্ত চ্যানেলে বাগটি ঠিক করা হয়েছে, তবে বিতরণের সময়টি আপনি কী চ্যানেলে আছেন তার উপর নির্ভর করবে।

2010, 2013, এবং 2016 এমএসআই এবং 2019 ভলিউম লাইসেন্স তৈরি করে এবং ও 365 সেমি-বার্ষিক চ্যানেল, ডিসেম্বর 10 ডিসেম্বর প্যাচ মঙ্গলবার বিল্ডে হবে, O365, মাসিক চ্যানেল এবং অভ্যন্তরস্থদের জন্য, এটি ঠিক করা হবে যখন অক্টোবরের কাঁটাচামচ প্রকাশিত হয়, বর্তমানে 24 নভেম্বর পরিকল্পনা করা হয়েছে।

সেমি-বার্ষিক চ্যানেলের জন্য, বাগটি 12 নভেম্বর প্রকাশিত হয়েছিল, 11328.20468 এ প্রবর্তিত হয়েছিল, তবে তা একবারে সকলের কাছে আসে না। যদি আপনি পারেন তবে আপনি 10 ডিসেম্বর অবধি আপডেট করা বন্ধ রাখতে চান।

নির্দিষ্ট মানদণ্ড সহ একক টেবিলের বিপরীতে আপডেট ক্যোয়ারীর জন্য সমস্যাটি দেখা দেয় (সুতরাং অন্যান্য ধরণের প্রশ্নের উপর প্রভাব ফেলতে হবে না, এমন কোনও কোয়েরি যা টেবিলের সমস্ত সারি আপডেট করে না, বা এমন কোয়েরি যা অন্য কোয়েরির ফলাফল সেট আপডেট করে)। প্রদত্ত যে, বেশিরভাগ ক্ষেত্রে সর্বাধিক সহজ সমাধান হ'ল কোয়েরিটি সরাসরি আপডেট করার চেয়ে টেবিল থেকে সমস্ত কিছু চয়ন করে এমন অন্য কোয়েরি আপডেট করার জন্য আপডেট ক্যোয়ারী পরিবর্তন করা।

উদাহরণস্বরূপ, আপনার যদি এমন কোনও প্রশ্ন থাকে:

UPDATE Table1 SET Table1.Field1 = "x" WHERE ([Table1].[Field2]=1);

তারপরে, একটি নতুন ক্যোয়ারী তৈরি করুন (কোয়েরি 1):

Select * from Table1;

এবং আপনার মূল ক্যোয়ারী এতে আপডেট করুন:

UPDATE Query1 SET Query1.Field1 = "x" WHERE ([Query1].[Field2]=1);

অফিসিয়াল পৃষ্ঠা: অ্যাক্সেস ত্রুটি: "ক্যুরিয়ার দূষিত"


13
আপনি কি সত্যিই সরল মুখের সাথে বলছেন যে আমরা একাধিক অ্যাপ্লিকেশন জুড়ে মোতায়েন করা কয়েক হাজার লাইনের কোডের কোডগুলিতে চলে যাই এবং সমস্ত বর্গ আপডেট আপডেট করে যা সাধারণ আপডেটের তথ্য সারি করে? আমি মনে করি আপনি যদি আজ এবং নতুন মুহূর্তে একটি নতুন কোয়েরি লিখছেন তবে এই জাতীয় কাজ সম্ভব। তবে বিদ্যমান কোড এবং অ্যাপ্লিকেশনগুলির জন্য বুদ্ধিমান আপডেটগুলি পরিবর্তন করতে হবে এমন ধারণা অবশ্যই কোনও সম্ভাব্য উপায়ে প্রব্লেম সমাধানের জন্য ব্যবহারিক পদ্ধতি নয়।
অ্যালবার্ট ডি কলাল

5
@ অ্যালবার্টডি.কালালাল, আপনার এমভিপি তালিকা থেকে আপনার জানা উচিত, আমি কেবল সমস্যার উত্সটির ব্যাখ্যাটি উল্লেখ করছি। কীভাবে সমস্যাটি মোকাবেলা করা যায় তা আপনার নিজের উপর নির্ভর করে এবং এটি আপনার দৃশ্যের সাথে খাপ খায়। এখানে বর্ণিত পদ্ধতিটি বেশ কয়েকটিগুলির মধ্যে একটি।
গুস্তাভ

1
@ অ্যালবার্টডি.কাললাল কি টেবিলগুলির নাম পরিবর্তন করে পুরানো টেবিল-নাম দিয়ে কোয়েরি ডেফ তৈরি করা উচিত নয়? (আমি এটি পরীক্ষা করব এবং স্ক্রিপ্টটি যদি এটি কাজ করে তবে পোস্ট করব)
ComputerVersteher

আপনি এটি কোনও প্রোগ্রামিং ছাড়াই করতে পারেন, উদাহরণস্বরূপ, "ব্যবহারকারীদের" টেবিলটির নাম "ব্যবহারের জন্য" রাখুন এবং তারপরে কোয়েরির নাম "ব্যবহারকারীগণ" তৈরি করুন - এবং তারপরে এটি কোনও প্রোগ্রামিং ছানের সাথে কাজ করবে ....
Zvi Redler

9
@ অ্যালবার্টডি.কালাল: আমি আপনার ব্যথা ভাগ করে নিচ্ছি - এটি যদি ভিসি রানটাইম লাইব্রেরির উপর প্রভাব ফেলে এমন কোনও সমস্যা হয়ে থাকে তবে আমি মনে করি না যে এমএস এক মাসের জন্য সমাধানটি বিলম্ব করবে এবং "পুনর্লিখন, পুনর্নির্মাণ এবং পুনর্নির্মাণ" কর্মের প্রস্তাব দেবে। (সত্যি কথা বলতে কি, তারা দ্রুত আগস্টের শেষের দিকে ভিবিএ ইস্যুটি সংশোধন করে ছেড়ে দেয়)) তবে আসুন মেসেঞ্জারটিকে গুলি করব না - গুস্তাভ কোনও এমএস কর্মচারী বলে মনে হচ্ছে না। আসুন আশা করি তারা পূর্বে পুনর্বিবেচনা এবং একটি প্যাচ প্রকাশ করেছে; সর্বোপরি, এটি অন্যান্য ভাষায় লিখিত অ্যাপ্লিকেশনগুলিকেও প্রভাবিত করে যা কেবল অ্যাক্সেস ডিবি ইঞ্জিন ব্যবহার করার ক্ষেত্রে ঘটে
হেইনজি

15

এই সমস্যাটি অস্থায়ীভাবে সমাধানের জন্য ব্যবহারের অ্যাক্সেস সংস্করণটির উপর নির্ভর করে:
অ্যাক্সেস 2010 আনইনস্টল করুন KB4484127
অ্যাক্সেস 2013 আনইনস্টল করুন আপডেট KB4484119
অ্যাক্সেস 2016 আনইনস্টল করুন KB4484113
অ্যাক্সেস 2019 যদি প্রয়োজন হয় ( টিবিসি )। সংস্করণ 1808 (বিল্ড 10352.20042) থেকে সংস্করণ 1808 (বিল্ড 10351.20054)
অফিস 365 সংস্করণ 1910 (বিল্ড 12130.20344) থেকে পূর্ববর্তী বিল্ডে ডাউনগ্রেড দেখুন, https://support.microsoft.com/en-gb/help/2770432/ কিভাবে-থেকে-প্রত্যাবর্তন-টু-আন-তার আগে-সংস্করণ অফ অফিস-2013-অথবা অফিসে-2016-প্রসারিত


আমি এটি আনইনস্টল করেছিলাম, তবে পরের বার উইন্ডোজ শুরু করার পরে এটি পুনরায় ইনস্টল করা হয়েছে। আপনি কীভাবে এটি পুনরায় ইনস্টল করা থেকে প্রতিরোধ করবেন?
dsteele

5
@ ডিস্টিল যদি এমএসআই সংস্করণ হয় এবং ডাব্লুএসইউ না থাকে, সমর্থন . microsoft.com/en-us/help/3073930/… সমস্যা সমাধানের সরঞ্জামটি ব্যবহার করুন । সিটিআর-এ অফিস-অ্যাকাউন্ট-সেটিংসে আপডেটগুলি অক্ষম করা হয় ..
কম্পিউটারভার্সথের

5

আমরা এবং আমাদের ক্লায়েন্টরা গত দু'দিন ধরে এ নিয়ে লড়াই করেছি এবং শেষ পর্যন্ত কয়েকটি সমাধানের সাথে এই সমস্যাটি নিয়ে বিস্তারিত আলোচনা করার জন্য একটি কাগজ লিখেছি: http://fmsinc.com/Mic MicrosoftAccess / Erferences / query_is_corpt/

এটিতে আমাদের অনুসন্ধানগুলি অন্তর্ভুক্ত রয়েছে যে এটি স্থানীয় টেবিলগুলিতে আপডেটযুক্ত অনুসন্ধানগুলি চালিত অবস্থায়, লিঙ্কযুক্ত অ্যাক্সেস টেবিলগুলি এবং এমনকি লিঙ্কযুক্ত এসকিউএল সার্ভার টেবিলগুলিতে অ্যাক্সেস সমাধানগুলিতে প্রভাব ফেলে।

এটি ADO ব্যবহার করে অ্যাক্সেস ডেটাবেসগুলিতে সংযোগ করতে অ্যাক্সেস ডেটাবেস ইঞ্জিন (এসিই) ব্যবহার করে অ-মাইক্রোসফ্ট অ্যাক্সেস সমাধানগুলিকে প্রভাবিত করে। এর মধ্যে ভিজ্যুয়াল স্টুডিও (উইনফর্ম) অ্যাপস, ভিবি 6 অ্যাপস এবং এমন কোনও ওয়েব সাইট রয়েছে যা মেশিনগুলিতে অ্যাক্সেস ডেটাবেস আপডেট করে যেগুলিতে কখনও অ্যাক্সেস বা অফিস ইনস্টল ছিল না।

এই ক্রাশ এমনকি মাইক্রোসফ্ট অ্যাপ্লিকেশনগুলিকেও প্রভাবিত করতে পারে যা এসিই যেমন পাওয়ারবিবি, পাওয়ার কোয়েরি, এসএসএমএ ইত্যাদি ব্যবহার করে (নিশ্চিত নয়) এবং অবশ্যই এক্সেস, পাওয়ারপয়েন্ট বা ওয়ার্ডের মতো অন্যান্য প্রোগ্রামগুলি অ্যাক্সেস ডেটাবেসগুলিকে সংশোধন করতে ভিবিএ ব্যবহার করে।

আপত্তিজনক সুরক্ষা আপডেটগুলির সুস্পষ্ট আনইনস্টলশন ছাড়াও, আমরা পিসিগুলি আপনার নিয়ন্ত্রণের বাইরে থাকা বাহ্যিক গ্রাহকদের কাছে অ্যাক্সেস অ্যাপ্লিকেশনগুলির অনুমতি বা বিতরণের কারণে আনইনস্টল করা সম্ভব না হলে আমরা কিছু বিকল্প অন্তর্ভুক্ত করি। এর মধ্যে সমস্ত আপডেট ক্যোয়ারী পরিবর্তন করা এবং অ্যাক্সেস অ্যাপ্লিকেশনগুলি অ্যাক্সেস 2007 (খুচরা বা রানটাইম) ব্যবহার করে বিতরণ করা থেকে যে সংস্করণটি সুরক্ষা আপডেটগুলি দ্বারা প্রভাবিত হয় না।


4

মাইক্রোসফ্টসের প্রস্তাবিত কার্যতালিকাটি স্বয়ংক্রিয়ভাবে প্রয়োগ করতে (কোনও টেবিলের পরিবর্তে কোয়েরি ব্যবহার করে) নিম্নলিখিত মডিউলটি ব্যবহার করুন। সতর্কতা হিসাবে প্রথমে আপনার ডাটাবেসটি ব্যাকআপ করুন।

AddWorkaroundForCorruptedQueryIssue()Workaround যুক্ত করতে এবং RemoveWorkaroundForCorruptedQueryIssue()এটি যে কোনও সময় সরাতে ব্যবহার করুন ।

Option Compare Database
Option Explicit

Private Const WorkaroundTableSuffix As String = "_Table"

Public Sub AddWorkaroundForCorruptedQueryIssue()
    On Error Resume Next

    With CurrentDb
        Dim tableDef As tableDef
        For Each tableDef In .tableDefs
            Dim isSystemTable As Boolean
            isSystemTable = tableDef.Attributes And dbSystemObject

            If Not EndsWith(tableDef.Name, WorkaroundTableSuffix) And Not isSystemTable Then
                Dim originalTableName As String
                originalTableName = tableDef.Name

                tableDef.Name = tableDef.Name & WorkaroundTableSuffix

                Call .CreateQueryDef(originalTableName, "select * from [" & tableDef.Name & "]")

                Debug.Print "OldTableName/NewQueryName" & vbTab & "[" & originalTableName & "]" & vbTab & _
                            "NewTableName" & vbTab & "[" & tableDef.Name & "]"
            End If
        Next
    End With
End Sub

Public Sub RemoveWorkaroundForCorruptedQueryIssue()
    On Error Resume Next

    With CurrentDb
        Dim tableDef As tableDef
        For Each tableDef In .tableDefs
            Dim isSystemTable As Boolean
            isSystemTable = tableDef.Attributes And dbSystemObject

            If EndsWith(tableDef.Name, WorkaroundTableSuffix) And Not isSystemTable Then
                Dim originalTableName As String
                originalTableName = Left(tableDef.Name, Len(tableDef.Name) - Len(WorkaroundTableSuffix))

                Dim workaroundTableName As String
                workaroundTableName = tableDef.Name

                Call .QueryDefs.Delete(originalTableName)
                tableDef.Name = originalTableName

                Debug.Print "OldTableName" & vbTab & "[" & workaroundTableName & "]" & vbTab & _
                            "NewTableName" & vbTab & "[" & tableDef.Name & "]" & vbTab & "(Query deleted)"
            End If
        Next
    End With
End Sub

'From https://excelrevisited.blogspot.com/2012/06/endswith.html
Private Function EndsWith(str As String, ending As String) As Boolean
     Dim endingLen As Integer
     endingLen = Len(ending)
     EndsWith = (Right(Trim(UCase(str)), endingLen) = UCase(ending))
End Function

আপনি আমার গিটহাব সংগ্রহস্থলের সর্বশেষতম কোডটি সন্ধান করতে পারেন ।

AddWorkaroundForCorruptedQueryIssue()_Tableসমস্ত নন-সিস্টেমের টেবিলগুলিতে প্রত্যয় যুক্ত করবে , যেমন টেবিলটির IceCreamsনামকরণ করা হবে IceCreams_Table

এটি আসল টেবিলের নামটি ব্যবহার করে একটি নতুন ক্যোয়ারী তৈরি করবে, এটি নাম পরিবর্তিত সারণীর সমস্ত কলাম নির্বাচন করবে। আমাদের উদাহরণে, ক্যোয়ারির নাম দেওয়া IceCreamsহবে এবং এসকিউএল কার্যকর করা হবে select * from [IceCreams_Table]

RemoveWorkaroundForCorruptedQueryIssue() বিপরীত ক্রিয়া করে।

আমি এটি বহিরাগত নন-এমডিবি টেবিল (এসকিউএল সার্ভারের মতো) সহ সকল ধরণের টেবিলের সাথে পরীক্ষা করেছি। তবে সচেতন হোন যে কোনও টেবিলের পরিবর্তে কোনও ক্যোয়ারী ব্যবহার করলে নির্দিষ্ট ক্ষেত্রে ব্যাকএন্ড ডাটাবেসের বিরুদ্ধে অ-অনুকূলিত প্রশ্নগুলি কার্যকর করা যেতে পারে, বিশেষত যদি টেবিলগুলি ব্যবহার করে এমন আপনার মূল প্রশ্নগুলি হয় নিম্নমানের বা খুব জটিল।

(এবং অবশ্যই আপনার কোডিং শৈলীর উপর নির্ভর করে আপনার অ্যাপ্লিকেশনটিতে জিনিসগুলিও ভাঙ্গা সম্ভব So সারণীর নাম ব্যবহারের যে কোনও ঘটনা টেবিলের পরিবর্তে ক্যোয়ারির বিরুদ্ধে চালানো হবে তা নিশ্চিত করার জন্য ম্যাজিক)

আমার ক্ষেত্রে, এই ফিক্স কাজ করে মূলত কোন পার্শ্ব প্রতিক্রিয়া ছাড়া, আমি শুধু নিজে নামান্তর করা প্রয়োজন USysRibbons_Tableফিরে USysRibbons, আমি এটি একটি সিস্টেম টেবিল হিসাবে চিহ্নিত নি যখন আমি অতীতে এটি তৈরি করা।


আমি আপনার সিস্টেমেটেবলকে নিখুঁত TableDef.Attributesকরতে চাই এবং আমার উত্তরটিতে এটি অনুলিপি করব;) এবং একটি পূর্বাবস্থায় ফাংশন করা ভাল ধারণা (তবে পুরাতন এবং নতুন নামটি একটি নাম সারণীতে সংরক্ষণ করা উচিত নাম পরিবর্তনের সাথে প্রত্যয়যুক্ত কোনও টেবিলের উপর নির্ভর করে)। কিছু অন্যান্য অংশ ত্রুটিযুক্ত (যেমন টেবিলগুলি প্রত্যয় দিয়ে শেষ হতে পারে বা নতুন নামটি ব্যবহারে বা On Error Resume Nextপরে ত্রুটিগুলি পরিচালনা না করেই প্রস্তুত থাকে) ready আপনি কি রাবারডাডকভিবিএ জানেন ? এই অ্যাডিন আপনার কোডটি পরিদর্শন করতে পারে এবং অন্যান্য সমস্ত বৈশিষ্ট্য ছাড়াও উন্নতির জন্য সুন্দর পরামর্শ দেয়।
কম্পিউটারবার্সথের

এবং আপনার যে বাগগুলি আমাদের পদ্ধতির কারণ হতে পারে তার দিকে আপনার ইঙ্গিত করা উচিত (আমার উত্তর সম্পর্কে ইমিক মন্তব্যগুলি দেখুন)
ComputerVersteher

আহ, আমি দেখতে পেলাম না যে এখানে ইতিমধ্যে একটি অনুরূপ উত্তর ছিল, তাই পর্যালোচনার জন্য ধন্যবাদ! প্রত্যয়টিকে তার নিজস্ব ধ্রুবক হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং ইতিমধ্যে প্রত্যয় ব্যবহার করা এমন একটি পূর্বনির্ধারিত অবজেক্ট সংজ্ঞায়িত হলে সহজেই এটি পরিবর্তন করা যায়। অন্যথায় স্ক্রিপ্টটি যেমন কাজ করে তবে যে কোনও ব্যক্তিকে এটিকে তাদের নিজস্ব প্রয়োজন অনুসারে সংশোধন করতে উত্সাহিত করা উচিত। স্ক্রিপ্টটি বিভিন্ন বাহ্যিক ডাটাবেস উত্সগুলিতে বহিরাগত / সংযুক্ত টেবিল সহ মোটামুটি বড় প্রকল্পগুলিতে (400+ টেবিল) পরীক্ষা করা হয়েছে। আমি রাবারডাক্ক (কেবল এমজেড-সরঞ্জাম সম্পর্কে) জানতাম না। আমি অবশ্যই তাদের চেক আউট করব!
lauxjpn

3

খুঁজছেন তাদের জন্য স্বয়ংক্রিয় মাধ্যমে এই প্রক্রিয়া PowerShell , এখানে কয়েকটি লিঙ্ক আমি দেখেছি যে সহায়ক হতে পারে আছে:

অফেন্ডিং আপডেটগুলি সনাক্ত করুন এবং সরান

এখানে একটি পাওয়ারশেল স্ক্রিপ্ট পাওয়া যায় https://www.arcath.net/2017/09/office-update-remover যে নির্দিষ্ট অফিস আপডেটের জন্য রেজিস্ট্রি অনুসন্ধান করে (কেবি নম্বর হিসাবে পাস হয়েছে) এবং একটি কল ব্যবহার করে এটি সরিয়ে দেয় msiexec.exe। এই স্ক্রিপ্টটি যথাযথ আপডেটটি সরিয়ে ফেলার জন্য কমান্ডটি তৈরি করতে রেজিস্ট্রি কীগুলি থেকে উভয় জিইউইডি পার্স করে।

আমি যে পরিবর্তনটি প্রস্তাব করব তা হ'ল কেবি 4011626 এবং অন্যান্য অফিস আপডেটগুলি আনইনস্টল করার পদ্ধতিতে/REBOOT=REALLYSUPPRESS বর্ণিত হিসাবে ব্যবহার করা হবে (অতিরিক্ত রেফারেন্স: https://docs.microsoft.com/en-us/windows/win32/msi/uninstalling- patches )। আপনি যে কমান্ড লাইনটি তৈরি করছেন তা দেখতে এমন দেখাচ্ছে:

msiexec /i {90160000-0011-0000-0000-0000000FF1CE} MSIPATCHREMOVE={9894BF35-19C1-4C89-A683-D40E94D08C77} /qn REBOOT=REALLYSUPPRESS

স্ক্রিপ্টটি চালানোর আদেশটি এরকম কিছু দেখতে পাবে:

OfficeUpdateRemover.ps1 -kb 4484127

আপডেট থেকে আপডেটগুলি প্রতিরোধ করুন

এখানে প্রস্তাবিত পদ্ধতির আপডেটটি লুকিয়ে রয়েছে বলে মনে হচ্ছে । স্পষ্টতই এটি ম্যানুয়ালি করা যেতে পারে তবে কয়েকটি পাওয়ারশেল স্ক্রিপ্ট রয়েছে যা অটোমেশনে সহায়তা করতে পারে। এই লিঙ্ক: https://www.maketecheasier.com/hide-updates-in-windows-10/ প্রক্রিয়াটি বিস্তারিতভাবে বর্ণনা করে, তবে আমি এখানে এটি সংক্ষেপে জানাব।

  1. উইন্ডোজ আপডেট পাওয়ারশেল মডিউল ইনস্টল করুন ।
  2. কেবি নম্বর দ্বারা আপডেট লুকানোর জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

    Hide-WUUpdate -KBArticleID KB4484127

আশা করি এটি অন্য কারও জন্য সহায়ক হবে।


3

এমএস-ওয়ার্কারআউন্ডের জন্য ভিবিএ-স্ক্রিপ্ট:

কমপক্ষে এমএসআই সংস্করণগুলির জন্য, সম্ভব হলে (আমার কোডটি চেষ্টা না করে) বগী আপডেটটি সরিয়ে ফেলা বাঞ্ছনীয়। উত্তর দেখুন https://stackoverflow.com/a/58833831/9439330

সিটিআর (ক্লিক-টু-রান) সংস্করণগুলির জন্য আপনাকে সমস্ত অফিস নভেম্বর-আপডেটগুলি মুছে ফেলতে হবে, গুরুতর সুরক্ষার সমস্যাগুলির কারণ কী হতে পারে (কোনও সমালোচনামূলক সমাধানগুলি সরানো হবে কিনা তা নিশ্চিত নয়)।

@ এরিকের মন্তব্য থেকে:

  • আপনি যদি Table.Tablenameফর্মগুলি আবদ্ধ করতে ব্যবহার করেন তবে এগুলি পূর্বের সারণী-নাম হিসাবে এখন একটি ক্যোয়ার-নাম হয়ে যায়!
  • OpenRecordSet(FormerTableNowAQuery, dbOpenTable) ব্যর্থ হবে (এটি এখন একটি কোয়েরি হিসাবে, কোনও টেবিল নয়)

সতর্ক করা! অফিস 2013 নর্থউইন্ড.এসিসিডিবিয়ের বিরুদ্ধে কেবল দ্রুত পরীক্ষা করা হয়েছে এক্স x86 সিটিআর কোনও ওয়ারেন্টি নেই!

Private Sub RenameTablesAndCreateQueryDefs()
With CurrentDb
    Dim tdf As DAO.TableDef
    For Each tdf In .TableDefs

        Dim oldName As String
        oldName = tdf.Name

        If Not (tdf.Attributes And dbSystemObject) Then 'credit to @lauxjpn for better check for system-tables
            Dim AllFields As String
            AllFields = vbNullString

            Dim fld As DAO.Field

            For Each fld In tdf.Fields
                AllFields = AllFields & "[" & fld.Name & "], "
            Next fld

            AllFields = Left(AllFields, Len(AllFields) - 2)
            Dim newName As String
            newName = oldName

            On Error Resume Next
            Do
                Err.Clear
                newName = newName & "_"
                tdf.Name = newName
            Loop While Err.Number = 3012
            On Error GoTo 0

            Dim qdf As DAO.QueryDef

            Set qdf = .CreateQueryDef(oldName)
            qdf.SQL = "SELECT " & AllFields & " FROM [" & newName & "]"
        End If
    Next
    .TableDefs.Refresh

End With
End Sub

পরীক্ষার জন্য:

Private Sub TestError()
With CurrentDb
    .Execute "Update customers Set City = 'a' Where 1=1", dbFailOnError 'works

    .Execute "Update customers_ Set City = 'b' Where 1=1", dbFailOnError 'fails
End With
End Sub

4
নোট করুন যে এই কর্মক্ষেত্রটি টেবিলগুলিতে আবদ্ধ সাবফর্মগুলি (কোয়েরিতে প্রত্যাবর্তন করতে হবে) এবং একটি হার্ডকোডযুক্ত টেবিলের নাম সহ টেবিলডেফগুলির সাথে কাজ করা কোডটি নষ্ট করবে। অত্যন্ত সতর্কতার সাথে ব্যবহার করুন, প্রতিক্রিয়াগুলি হল আপনার অ্যাপ্লিকেশনটি কী করছে তার উপর নির্ভর করে কেবলমাত্র দুটি নতুন তৈরি করতে এই বাগটি ঠিক করা হয়েছে।
এরিক এ

@ এরিকা অবশ্যই একটি কর্মপরিকল্পনা, তবে আমি কোনও সমস্যা ছাড়াই ফর্মে টেবিলের সাথে আবদ্ধ Inventory to reorder Subform for Homeথাকতে পারি । এমনকি এটি কি টেবিলের পরিবর্তে ক্যোয়ারিতে ফর্মগুলি আবদ্ধ করতে পুনরায় সংযুক্ত করা হয়নি (টেবিলের মতো বাধ্য নয় ?)। InventoryHomeSelect * From table
কম্পিউটারওয়ার্সথের

2
যদি আমি কোনও টেবিলের একটি সাবফর্মটি আবদ্ধ করি, তবে আমি সাধারণত Table.TableNameস্বরলিপিটি ব্যবহার করে এটি করি । আপনি যদি SELECT * FROM TableNameপরিবর্তে এটি করেন, আপনি অবশ্যই ভাল আছেন। তবে আপনি যদি ব্যবহার করেন Table.TableNameতবে আপনি টেবিলটির নাম পরিবর্তন করে নিলে আপনার সাবফর্মটি আনবাউন্ড হয়ে যাবে।
এরিক এ

@ এরিকা: সত্য। তা করে কোন লাভ?
কম্পিউটারবার্সথের

3
আমি যতদূর জানি না, এটি আরও সংক্ষেপে বাদে। TableDefs!MyTableName.OpenRecordset(dbOpenTable)যদিও এর বেশিরভাগ সুবিধা রয়েছে (সূচকের সন্ধানের সমর্থন), যা আমিও ব্যবহার করতে চাই এবং আপনার পদ্ধতির সাথেও ত্রুটি সৃষ্টি করব
এরিক এ

2

আমি 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

আনন্দ কর!


0

ঠিক আছে আমি এখানেও ছিমছাম করব, কারণ এই বাগটি স্থির হয়ে গেলেও, এই ফিক্সটি এখনও বিভিন্ন উদ্যোগের মধ্যে পুরোপুরি পপুলেশন করতে সক্ষম হয়েছে যেখানে শেষ ব্যবহারকারীরা আপডেট করতে পারবেন না (যেমন আমার নিয়োগকর্তার মতো ...)

এখানে আমার কর্মসংস্থান DoCmd.RunSQL "UPDATE users SET uname= 'bob' WHERE usercode=1"। আপত্তিজনক জিজ্ঞাসাটি কেবল মন্তব্য করুন এবং নীচের কোডটিতে ছেড়ে দিন।

    'DoCmd.RunSQL "UPDATE users SET uname= 'bob' WHERE usercode=1"
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("users")
    rst.MoveLast
    rst.MoveFirst
    rst.FindFirst "[usercode] = 1" 'note: if field is text, use "[usercode] = '1'"
    rst.Edit
    rst![uname] = "bob"
    rst.Update
    rst.Close
    Set rst = Nothing

আমি এটি সুন্দর বলতে পারি না তবে এটি কাজটি হয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.