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