System.Data.SQLite ক্লোজ () ডাটাবেস ফাইল প্রকাশ করছে না


97

আমার ফাইলটি মুছে ফেলার চেষ্টা করার আগে আমার ডাটাবেস বন্ধ করতে সমস্যা হচ্ছে। কোডটি ঠিক

 myconnection.Close();    
 File.Delete(filename);

এবং মুছুন এমন একটি ব্যতিক্রম ছুঁড়ে ফেলেছে যে ফাইলটি এখনও ব্যবহৃত হচ্ছে। আমি কয়েক মিনিটের পরে ডিবাগারে মুছে ফেলা () পুনরায় চেষ্টা করেছি, সুতরাং এটি কোনও সময়সীমা নয়।

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

প্রোকমন আমার প্রোগ্রাম এবং আমার অ্যান্টিভাইরাসটি ডেটাবেস ফাইলটিতে দেখায়। এটি আমার প্রোগ্রামটি বন্ধ () এর পরে ডিবি ফাইল প্রকাশ করছে না।

ভিজ্যুয়াল স্টুডিও 2010, সি #, সিস্টেম.ডাটা.এসকিউএল সংস্করণ 1.0.77.0, Win7

আমি ঠিক দু'বছরের পুরানো বাগটি দেখেছি তবে চেঞ্জলগটি বলেছে এটি ঠিক আছে।

আমি কি অন্য কিছু পরীক্ষা করতে পারি? কোনও উন্মুক্ত আদেশ বা লেনদেনের তালিকা পাওয়ার কোনও উপায় আছে কি?


নতুন, কার্যকারী কোড:

 db.Close();
 GC.Collect();   // yes, really release the db

 bool worked = false;
 int tries = 1;
 while ((tries < 4) && (!worked))
 {
    try
    {
       Thread.Sleep(tries * 100);
       File.Delete(filename);
       worked = true;
    }
    catch (IOException e)   // delete only throws this on locking
    {
       tries++;
    }
 }
 if (!worked)
    throw new IOException("Unable to close file" + filename);

আপনি কি চেষ্টা করেছেন: myconnection. ক্লোজ (); myconnication.Dispose (); ?
ইউজেন

4
স্ক্লাইট-নেট ব্যবহার করার সময় , আপনি ব্যবহার করতে পারেন SQLiteAsyncConnection.ResetPool(), বিশদটির জন্য এই সমস্যাটি দেখুন।
উয়ে কেইম

উত্তর:


113

সি # এর জন্য ডিবি অ্যাবস্ট্রাকশন স্তরটি লেখার সময় কিছুটা আগে একই সমস্যার মুখোমুখি হয়েছি এবং সমস্যাটি কী তা সন্ধান করার জন্য আমি কখনই আশেপাশে পাইনি। আপনি আমার লাইব্রেরিটি ব্যবহার করে কোনও এসকিউএলডি ডিবি মুছতে চেষ্টা করার সময় আমি কেবলমাত্র একটি ব্যতিক্রম ছুঁড়েছি।

যাইহোক, আজ বিকেলে আমি এটি আবারও সন্ধান করছিলাম এবং অনুভব করেছি যে আমি কেন এটি একবার এবং সর্বদা করছিলাম তা খুঁজে বের করার চেষ্টা করব, তাই আমি এ পর্যন্ত খুঁজে পেয়েছি।

আপনি যখন কল করবেন তখন যা ঘটে তা SQLiteConnection.Close()হ'ল (বেশ কয়েকটি চেক এবং অন্যান্য জিনিস সহ) SQLiteConnectionHandleযেটি এসকিউএল ডাটাবেসের উদাহরণকে নির্দেশ করে তা নিষ্পত্তি করা হয়। এটি একটি কলের মাধ্যমে করা হয় SQLiteConnectionHandle.Dispose(), তবে সিএলআর এর আবর্জনা সংগ্রাহক কিছু আবর্জনা সংগ্রহ না করা পর্যন্ত এটি আসলে পয়েন্টারটি প্রকাশ করে না। যেহেতু কল SQLiteConnectionHandleকরতে CriticalHandle.ReleaseHandle()ফাংশনটি ওভাররাইড করেsqlite3_close_interop() (অন্য ফাংশনের মাধ্যমে) এটি ডাটাবেসটি বন্ধ করে না।

আমার দৃষ্টিকোণ থেকে এটি কাজগুলি করার খুব খারাপ উপায় কারণ প্রোগ্রামার যখন ডাটাবেস বন্ধ হয়ে যায় তখন এটি সুনির্দিষ্ট হয় না তবে এটি যেভাবে করা হয়েছে তাই আমি অনুমান করি আমাদের আপাতত এটির সাথে বাঁচতে হবে, বা প্রতিশ্রুতিবদ্ধ System.Data.SQLite এ কয়েকটি পরিবর্তন। যে কোনও স্বেচ্ছাসেবকরা এটি করতে স্বাগত জানায়, দুর্ভাগ্যক্রমে আমি পরের বছরের আগে এটি করার জন্য সময় অতিক্রম করি।

টিএল; ডিআর সমাধান হ'ল আপনার কল করার SQLiteConnection.Close()আগে এবং তার আগে কল করার পরে কোনও জিসিকে জোর করা File.Delete()

নমুনা কোডটি এখানে:

string filename = "testFile.db";
SQLiteConnection connection = new SQLiteConnection("Data Source=" + filename + ";Version=3;");
connection.Close();
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(filename);

এটির জন্য শুভকামনা, এবং আমি আশা করি এটি সাহায্য করবে


4
হ্যাঁ! ধন্যবাদ! দেখে মনে হচ্ছে জিসির কাজটি শেষ করতে কিছুটা প্রয়োজন হতে পারে।
টম সেরুল

4
আপনি সি # এসকিউএলাইটটিও দেখতে চাইতে পারেন, আমি আমার সমস্ত কোডটি এটি ব্যবহার করার জন্য সরিয়ে নিয়েছি। অবশ্যই, আপনি যদি কিছু সমালোচনামূলক পারফরম্যান্স চালিয়ে যাচ্ছেন তবে সি সম্ভবত সি # এর চেয়ে দ্রুততর তবে আমি পরিচালিত কোডের ভক্ত ...
বেনজমিন প্যানেল

4
আমি জানি এটি পুরানো, তবে আমার কিছু ব্যথা বাঁচানোর জন্য ধন্যবাদ। এই বাগটি এসকিউএলাইটের উইন্ডোজ মোবাইল / কমপ্যাক্ট ফ্রেমওয়ার্ক বিল্ডকেও প্রভাবিত করে।
স্ট্রেপয়েন্টার

4
মহান কাজ! তাত্ক্ষণিকভাবে আমার সমস্যা সমাধান করুন। সি # বিকাশের 11 বছরের মধ্যে আমার কখনই জিসি ব্যবহারের দরকার পড়েনি lect সংগ্রহ: এখন এটিই প্রথম উদাহরণ যা আমি বাধ্য হয়েছি।
পিলিটর

10
জিসি.কলেক্ট (); কাজ করে তবে System.Data.SQLite.SQLiteConnection.C ClearAllPools (); লাইব্রেরির এপিআই ব্যবহার করে বিষয়টি নিয়ে কাজ করে।
অ্যারন হুডন

57

শুধু GC.Collect()আমার জন্য কাজ হয়নি।

ফাইল মুছে ফেলার প্রক্রিয়াটি চালিয়ে যাওয়ার জন্য আমাকে GC.WaitForPendingFinalizers()পরে যুক্ত করতে GC.Collect()হয়েছিল।


4
এটি আশ্চর্যজনক নয়, GC.Collect()কেবল একটি আবর্জনা সংগ্রহ শুরু করে যা সংশ্লেষপূর্ণ যাতে নিশ্চিত হয়ে যায় যে সমস্ত পরিষ্কার হয়ে গেছে আপনার স্পষ্টভাবে অপেক্ষা করতে হবে।
ক্রিসউইউ

4
আমি একই অভিজ্ঞতা পেয়েছি, জিসি.ওয়েটফোরপেন্ডিং ফিনালাইজারস () যুক্ত করতে হয়েছিল। এটি ছিল 1.0.103
ভোর্ট

18

আমার ক্ষেত্রে আমি SQLiteCommandস্পষ্টভাবে নিষ্পত্তি না করে অবজেক্ট তৈরি করছিলাম ।

var command = connection.CreateCommand();
command.CommandText = commandText;
value = command.ExecuteScalar();

আমি আমার আদেশটি একটি usingবিবৃতিতে আবৃত করেছিলাম এবং এটি আমার সমস্যাটি স্থির করেছে।

static public class SqliteExtensions
{
    public static object ExecuteScalar(this SQLiteConnection connection, string commandText)
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = commandText;
            return command.ExecuteScalar();
        }
    }
}

usingবিবৃতি নিষ্পত্তি বলা হয় যে একটি ব্যতিক্রম ঘটে এমনকি যদি নিশ্চিত করে।

তারপরে কমান্ডগুলি কার্যকর করাও অনেক সহজ।

value = connection.ExecuteScalar(commandText)
// Command object created and disposed

6
আমি এই জাতীয় ব্যতিক্রমগুলি গিলে
ফেলার

17

অনুরূপ সমস্যা ছিল, যদিও আবর্জনা সংগ্রহকারী সমাধান এটি ঠিক করে নি।

ব্যবহারের পরে ডিসপোজিং SQLiteCommandএবং SQLiteDataReaderঅবজেক্টগুলি পাওয়া যায় আমাকে আবর্জনা সংগ্রহকারীকে আদৌ ব্যবহার করে সংরক্ষণ করে।

SQLiteCommand command = new SQLiteCommand(sql, db);
command.ExecuteNonQuery();
command.Dispose();

4
হুবহু আপনি পরবর্তীতে SQLiteCommandকোনও SQLiteCommandভেরিয়েবলটিকে পুনর্ব্যক্ত করলেও আপনি সকলের নিষ্পত্তি নিশ্চিত করুন।
ব্রুনো বিয়েরি

এটি আমার পক্ষে কাজ করেছে। আমি কোনও লেনদেন নিষ্পত্তি করার বিষয়টিও নিশ্চিত করেছিলাম।
জে-নিকোলাস হ্যাকলম্যান

4
দুর্দান্ত! আপনি আমাকে বেশ কিছুটা সময় বাঁচিয়েছিলেন। আমি কার্যকর command.Dispose();করা প্রত্যেকটিতে যুক্ত করলে এটি ত্রুটিটি স্থির করে SQLiteCommand
ইভান বি

এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি .Dispose()এসকিউএলাইট ট্রান্সজেকশন এর মতো অন্যান্য অবজেক্টগুলি প্রকাশ করেছেন ( যদি) আপনার কোনও থাকে।
ইভান বি

14

নিম্নলিখিত আমার জন্য কাজ করেছে:

MySQLiteConnection.Close();
SQLite.SQLiteConnection.ClearAllPools()

আরও তথ্য : পারফরম্যান্সের উন্নতির জন্য সংযোগগুলি এসকিউএলাইট দ্বারা পুল করা হয় means এর অর্থ আপনি যখন কোনও সংযোগের অবজেক্টে ক্লোজ মেথড কল করবেন তখন ডাটাবেসের সাথে সংযোগটি এখনও বেঁচে থাকতে পারে (পটভূমিতে) যাতে পরবর্তী ওপেন পদ্ধতিটি দ্রুত হয়ে যায় hen আপনি যখন জানতেন যে আপনি আর নতুন সংযোগ চান না, ক্লিয়ারআলপুলসকে কল করে ডিগ্রী ফাইলে হ্যান্ডল (গুলি?) -এর পটভূমিতে জীবিত সমস্ত সংযোগ বন্ধ হয়ে যায় .তখন ডিবি ফাইল অপসারণের মাধ্যমে মুছে ফেলা বা ব্যবহার করা যেতে পারে another


4
আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এটি সমস্যার ভাল সমাধান।
মাতাস ভাইটকেভিসিয়াস

আপনি ব্যবহার করতে পারেন SQLiteConnectionPool.Shared.Reset()। এটি সমস্ত সংযোগগুলি বন্ধ করে দেবে। বিশেষত, এটি একটি সমাধান যদি আপনি ব্যবহার করেন SQLiteAsyncConnectionযে কোনও Close()পদ্ধতি নেই।
লরেঞ্জো পলিডোরি

9

আমারও একই সমস্যা ছিল, আমি এর সাথে সমাধানটি চেষ্টা করেছি GC.Collect তবে যেমনটি উল্লেখ করা হয়েছে, ফাইলটি লক না হওয়ার আগে এটি অনেক সময় নিতে পারে।

আমি একটি বিকল্প সমাধান পেয়েছি যা অন্তর্নিহিত এর নিষ্পত্তি জড়িত SQLiteCommand যা টেবিলএডাপ্টারগুলিতে রয়েছে, অতিরিক্ত তথ্যের জন্য এই উত্তরটি দেখুন ।


তুমি ঠিক বলেছ! কিছু ক্ষেত্রে সহজ 'জিসি.কলেক্ট' আমার পক্ষে কাজ করেছিল, অন্যথায় আমাকে জিসি.কলেক্ট কল করার আগে সংযোগের সাথে সম্পর্কিত যে কোনও স্ক্লাইট কম্যান্ডগুলি নিষ্পত্তি করতে হয়েছিল অথবা অন্যথায় এটি কাজ করবে না!
ইটান এইচএস

4
এসকিউএলকম্যান্ডে ডিসপোজ কল করা আমার পক্ষে কাজ করেছিল। একটি সরকারী মন্তব্য হিসাবে - আপনি যদি জিসি.কলেক্ট কল করছেন আপনি কিছু ভুল করছেন।
নাটালি অ্যাডামস

@ নাথান অ্যাডামস অ্যান্টিটি ফ্রেমওয়ার্কের সাথে কাজ করার সময় এমন কোনও কমান্ডের অবজেক্ট নেই যা আপনি নিষ্পত্তি করতে পারেন। সুতরাং হয় নিজেই এন্টিফ্রেমওয়ার্ক বা EF মোড়কের জন্য এসকিউএলাইট কিছুটা ভুল করে চলেছে।
বসন্তের 76

আপনার উত্তরটি সঠিক হওয়া উচিত। অনেক ধন্যবাদ.
আহমেদ শামেল

6

ইএফ এবং এর সাথে আমারও একই সমস্যা হচ্ছে System.Data.Sqlite

আমার জন্য আমি খুঁজে পেয়েছি SQLiteConnection.ClearAllPools()এবংGC.Collect() ফাইল লক হওয়ার কত ঘন ঘন হ্রাস হত তবে এটি মাঝে মাঝে ঘটবে (প্রায় 1% সময়)।

আমি তদন্ত করে চলেছি এবং দেখে মনে হচ্ছে SQLiteCommandযে EF তৈরি করেছে এমন কিছু গুলি নিষ্পত্তি হয়নি এবং এখনও তাদের সংযোগ সম্পত্তি বন্ধ সংযোগে সেট করা আছে। আমি এগুলি নিষ্পত্তি করার চেষ্টা করেছি কিন্তু সত্তা ফ্রেমওয়ার্কটি পরবর্তী সময়ে একটি ব্যতিক্রম ছুঁড়ে ফেলবেDbContext পড়ার - মনে হয় EF কখনও কখনও সংযোগ বন্ধ হওয়ার পরেও সেগুলি ব্যবহার করে।

আমার সমাধান নিশ্চিত করার কানেকশন সম্পত্তি হিসাবে সেট করা ছিল Nullযখন এই সংযোগ প্রচেষ্টা SQLiteCommandগুলি। ফাইল লক প্রকাশের জন্য এটি যথেষ্ট বলে মনে হচ্ছে। আমি নীচের কোডটি পরীক্ষা করেছি এবং কয়েক হাজার পরীক্ষার পরে কোনও ফাইল লক সমস্যা দেখিনি:

public static class ClearSQLiteCommandConnectionHelper
{
    private static readonly List<SQLiteCommand> OpenCommands = new List<SQLiteCommand>();

    public static void Initialise()
    {
        SQLiteConnection.Changed += SqLiteConnectionOnChanged;
    }

    private static void SqLiteConnectionOnChanged(object sender, ConnectionEventArgs connectionEventArgs)
    {
        if (connectionEventArgs.EventType == SQLiteConnectionEventType.NewCommand && connectionEventArgs.Command is SQLiteCommand)
        {
            OpenCommands.Add((SQLiteCommand)connectionEventArgs.Command);
        }
        else if (connectionEventArgs.EventType == SQLiteConnectionEventType.DisposingCommand && connectionEventArgs.Command is SQLiteCommand)
        {
            OpenCommands.Remove((SQLiteCommand)connectionEventArgs.Command);
        }

        if (connectionEventArgs.EventType == SQLiteConnectionEventType.Closed)
        {
            var commands = OpenCommands.ToList();
            foreach (var cmd in commands)
            {
                if (cmd.Connection == null)
                {
                    OpenCommands.Remove(cmd);
                }
                else if (cmd.Connection.State == ConnectionState.Closed)
                {
                    cmd.Connection = null;
                    OpenCommands.Remove(cmd);
                }
            }
        }
    }
}

ClearSQLiteCommandConnectionHelper.Initialise();অ্যাপ্লিকেশন লোডের শুরুতে কেবল কল করতে ব্যবহার করুন । এটি তখন সক্রিয় কমান্ডগুলির একটি তালিকা রাখবে এবং Nullযখন তারা বন্ধ থাকা কোনও সংযোগের দিকে নির্দেশ করবে তখন তাদের সংযোগটি সেট করবে ।


আমাকে এর ডিসপোজিংকম্যান্ড অংশেও সংযোগটি বাতিল করতে হয়েছিল, বা আমি মাঝে মাঝে অবজেক্টডিসপোজড এক্সসেপশন পেয়ে যাতাম।
এলিয়ট

এটি আমার মতে একটি আন্ডাররেটেড উত্তর। এটি আমার ক্লিনআপ সমস্যার সমাধান করেছে যা EF স্তরের কারণে আমি নিজেই করতে পারি না। এই কুৎসিত জিসি হ্যাক ব্যবহার করে খুব খুশি। ধন্যবাদ!
জেসন টাইলার

আপনি যদি এই সমাধানটি একটি বহুবিধ পরিবেশে ব্যবহার করেন তবে ওপেনকম্যান্ডস তালিকাটি [থ্রেডস্ট্যাটিক] হওয়া উচিত।
বেরো

5

এটি চেষ্টা করুন ... এটি উপরের সমস্ত কোড চেষ্টা করে ... আমার জন্য কাজ করে

    Reader.Close()
    connection.Close()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    command.Dispose()
    SQLite.SQLiteConnection.ClearAllPools()

আশা করি এইটি কাজ করবে


4
ওয়েটফরপেন্ডিংফাইনালাইজার্স আমার জন্য সমস্ত পার্থক্য তৈরি করেছে
টড

4

ব্যবহার GC.WaitForPendingFinalizers()

উদাহরণ:

Con.Close();  
GC.Collect();`
GC.WaitForPendingFinalizers();
File.Delete(Environment.CurrentDirectory + "\\DATABASENAME.DB");

3

একই সমস্যা ছিল। আবর্জনা সংগ্রাহককে কল করা আমার কোনও কাজে আসেনি। আমি সমস্যা সমাধানের একটি উপায় খুঁজে পেয়েছি

লেখক আরও লিখেছেন যে তিনি মুছে ফেলার চেষ্টা করার আগে সেই ডাটাবেসটিতে অনুসন্ধানগুলি বেছে নিয়েছিলেন qu আমি একই পরিস্থিতি আছে।

আমার কাছে নিম্নলিখিত কোড রয়েছে:

SQLiteConnection bc;
string sql;
var cmd = new SQLiteCommand(sql, bc);
SQLiteDataReader reader = cmd.ExecuteReader();
reader.Read();
reader.Close(); // when I added that string, the problem became solved.

এছাড়াও, আমার ডাটাবেস সংযোগ বন্ধ করতে এবং আবর্জনা সংগ্রাহককে কল করার দরকার নেই। আমাকে যা করতে হয়েছিল তা হ'ল পাঠককে বন্ধ করা যা সেলেক্ট কোয়েরি চালানোর সময় তৈরি করা হয়েছিল


2

আমি বিশ্বাস করি যে কলটি SQLite.SQLiteConnection.ClearAllPools()হ'ল পরিষ্কার সমাধান। আমি যতদূর জানি GC.Collect()ডাব্লুপিএফ পরিবেশে ম্যানুয়ালি কল করা ঠিক নয় । যদিও, আমি 3/ System.Data.SQLite2016- তে 1.0.99.0 এ আপগ্রেড না করা পর্যন্ত আমি সমস্যাটি লক্ষ্য করিনি


2

হয়তো আপনার জিসির সাথে একেবারেই ডিল করার দরকার নেই। দয়া করে সব sqlite3_prepareচূড়ান্ত হয়েছে কিনা তা পরীক্ষা করে দেখুন ।

প্রতিটি জন্য sqlite3_prepare, আপনার একটি সংবাদদাতা প্রয়োজন sqlite3_finalize

আপনি যদি সঠিকভাবে চূড়ান্ত sqlite3_closeনা করেন তবে সংযোগটি বন্ধ করবেন না।


1

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

static void Main(string[] args)
{
    try
    {
        var dbPath = "myTestDb.db";
        ExecuteTestCommand(dbPath);
        File.Delete(dbPath);
        Console.WriteLine("DB removed");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
    Console.Read();
}

private static void ExecuteTestCommand(string dbPath)
{
    using (var connection = new SQLiteConnection("Data Source=" + dbPath + ";"))
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "PRAGMA integrity_check";
            connection.Open();
            var reader = command.ExecuteReader();
            if (reader.Read())
                Console.WriteLine(reader.GetString(0));

            //without next line database file will remain locked
            reader.Close();
        }
    }   
}

0

আমি EF6 এর সাথে এসকিউলাইট 1.0.101.0 ব্যবহার করছি এবং সমস্ত সংযোগ এবং সত্তা নিষ্পত্তি হওয়ার পরে ফাইলটি লক হওয়ার ক্ষেত্রে সমস্যা হচ্ছে।

EF এর ডেটাবেসগুলি সম্পূর্ণ হওয়ার পরে লক করে রাখার আপডেটের সাথে এটি আরও খারাপ হয়েছে। জিসি.কোলেকট () কেবলমাত্র একমাত্র কাজ যা সাহায্য করেছিল এবং আমি হতাশ হতে শুরু করেছিলাম।

হতাশায় আমি অলিভার উইকেনডেনের ক্লিয়ার এসকিউএলাইটকম্যান্ডসেকশন হেল্পার (8 জুলাইয়ের উত্তর দেখুন) চেষ্টা করেছিলাম। কল্পনাপ্রসূত। সমস্ত লক সমস্যা শেষ! ধন্যবাদ অলিভার


আমি মনে করি এটি একটি উত্তরের পরিবর্তে একটি মন্তব্য হওয়া উচিত
কেভিন ওয়ালিস

4
কেভিন, আমি একমত, তবে আমার মন্তব্য করার অনুমতি দেওয়া হয়নি কারণ আমার 50 টি খ্যাতি (স্পষ্টতই) প্রয়োজন।
টনি সুলিভান

0

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

SQLiteCommand insertCommand = connection.CreateCommand();
try {
    // some insert parameters
    insertCommand.ExecuteNonQuery();
} catch (SQLiteException exception) {
    insertCommand.Cancel();
    insertCommand.Dispose();
}

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


0

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


0

আমার পক্ষে কাজ করেছে সেরা উত্তর।

dbConnection.Close();
System.Data.SQLite.SQLiteConnection.ClearAllPools();

GC.Collect();
GC.WaitForPendingFinalizers();

File.Delete(Environment.CurrentDirectory + "\\DATABASENAME.DB");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.