Исключение SQLite: занятый SQLite

public void CreateCSVFile(DataTable dt, string strFilePath,string separator)
        {               
            #region Export Grid to CSV
            // Create the CSV file to which grid data will be exported.

            StreamWriter sw = new StreamWriter(strFilePath, false); 
            int iColCount = dt.Columns.Count;
            for (int i = 0; i < iColCount; i++)
            {    
                sw.Write(dt.Columns[i]);    
                if (i < iColCount - 1)
                {
                    sw.Write(separator);
                }  
            }    

            sw.Write(sw.NewLine);

            // Now write all the rows.
            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        sw.Write(dr[i].ToString());  
                    }

                    if (i < iColCount - 1)
                    {
                        sw.Write(separator);
                    }
                }
                sw.Write(sw.NewLine);
            }

            sw.Close();
            #endregion
        }
10
задан MySQL DBA 8 June 2009 в 10:14
поделиться

2 ответа

Если я правильно понял, "занято" означает, что вы не можете получить блокировку. Похоже, что какой-то другой процесс (или поток и т. Д.) Заблокировал базу данных.

Блокировка и параллелизм файлов в SQLite версии 3

8
ответ дан 3 December 2019 в 13:47
поделиться

Если вы получаете в результате при вызове функции sqlite3 код ошибки SQLITE_BUSY, это означает, что, по наблюдениям drdaeman, база данных была заблокирована тем же процессом или одним потоком в вашем процессе.

Правильный способ справиться с этой ситуацией - попробовать выполнить операцию в цикле, и, если код возврата по-прежнему SQLITE_BUSY, подождать некоторое время (вы выбираете значение тайм-аута), а затем повторить операцию в следующем цикле. итерация.

Например, следующий фрагмент кода взят из оболочки Objective C FMDB ( http://code.google.com/p/flycode/source/browse/trunk/fmdb ) показывает как подготовить оператор для запроса с учетом того, что некоторые операции могут возвращать SQLITE_BUSY:

int numberOfRetries = 0;
BOOL retry          = NO;

if (!pStmt) {
    do {
        retry   = NO;
        rc      = sqlite3_prepare(db, [sql UTF8String], -1, &pStmt, 0);

        if (SQLITE_BUSY == rc) {
            retry = YES;
            usleep(20);

            if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) {
                NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]);
                NSLog(@"Database busy");
                sqlite3_finalize(pStmt);
                [self setInUse:NO];
                return nil;
            }
        }
        else if (SQLITE_OK != rc) {


            if (logsErrors) {
                NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
                NSLog(@"DB Query: %@", sql);
                if (crashOnErrors) {

                    NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]);
                }
            }

            sqlite3_finalize(pStmt);

            [self setInUse:NO];
            return nil;
        }
    }
    while (retry);
}

Кстати, если вам нужен доступ к sqlite,

21
ответ дан 3 December 2019 в 13:47
поделиться