Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.(Sqlite)
Cancelling DisplayDialog because it was run from a thread that is not the main thread: Opening file failed Opening file D:/Unity/terranetools.git/Assets/TerrainTools/db/object.sqlite: Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
Возникает ошибка доступа к БД. Вполне вероятно из-за одновременного обращения к одному файлу. Как лучше обращаться к SQLite в Unity, если соединение уже открыто?
Мой файл подключение к базе:
using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;
using System.Collections.Generic;
static public class ObjectDataBase
{
static public string connectionString;
static public void GetSettings(out bool outEditModeBool, out string outPrefabForEditing, out float outmapoffsetx, out float outmapoffsetz, out string outstringObjfileURL)
{
connectionString = "URI=file:" + Application.dataPath + "/TerrainTools/db/object.sqlite";
using (IDbConnection dbConnection = new SqliteConnection(connectionString))
{
dbConnection.Open();
using (IDbCommand dbCmd = dbConnection.CreateCommand())
{
string sqlQuery = "SELECT EditModeBool,PrefabForEditing,mapoffsetx,mapoffsetz,ObjfileURL FROM Setting";
dbCmd.CommandText = sqlQuery;
using (IDataReader reader = dbCmd.ExecuteReader())
{
bool tempEditModeBool = false;
string tempPrefabForEditing = "yesnull";
float tempmapoffsetx = 0.0f;
float tempmapoffsetz = 0.0f;
string temstringObjfileURL = "yesnull";
while (reader.Read())
{
tempEditModeBool = reader.GetBoolean(0);
tempPrefabForEditing = reader.GetString(1);
tempmapoffsetx = (float)reader.GetDouble(2);
tempmapoffsetz = (float)reader.GetDouble(3);
temstringObjfileURL = reader.GetString(4);
}
outEditModeBool = tempEditModeBool;
outPrefabForEditing = tempPrefabForEditing;
outmapoffsetx = tempmapoffsetx;
outmapoffsetz = tempmapoffsetz;
outstringObjfileURL = temstringObjfileURL;
dbConnection.Close();
reader.Close();
}
}
}
}
static public void GetCreatingReliefSettings(out LoadTerrainRaw.CreatingReliefSettings outCreatingReliefSettings)
{
connectionString = "URI=file:" + Application.dataPath + "/TerrainTools/db/object.sqlite";
using (IDbConnection dbConnection = new SqliteConnection(connectionString))
{
dbConnection.Open();
using (IDbCommand dbCmd = dbConnection.CreateCommand())
{
string sqlQuery = "SELECT AmountX,AmountY,TerrainWidth,TerrainLenght,TerrainHeight,HeightmapResoltion,PrimitiveToCreate_ID,DetailResolution,DetailResolutionPerPatch,ControlTextureResolution,BaseTextureReolution,Path FROM CreatingReliefSettings";
dbCmd.CommandText = sqlQuery;
using (IDataReader reader = dbCmd.ExecuteReader())
{
outCreatingReliefSettings = new LoadTerrainRaw.CreatingReliefSettings();
outCreatingReliefSettings.tileAmount = Vector2.one;
outCreatingReliefSettings.widthTerrain = 2000f;
outCreatingReliefSettings.lenghtTerrain = 2000f;
outCreatingReliefSettings.heightTerrain = 168f;
outCreatingReliefSettings.heightmapResoltion = 65;
outCreatingReliefSettings.Depth = 1;
outCreatingReliefSettings.detailResolution = 2048;
outCreatingReliefSettings.detailResolutionPerPatch = 8;
outCreatingReliefSettings.controlTextureResolution = 2048;
outCreatingReliefSettings.baseTextureResolution = 2048;
outCreatingReliefSettings.path = string.Empty;
while (reader.Read())
{
outCreatingReliefSettings.tileAmount = new Vector2((float)reader.GetDouble(0), (float)reader.GetDouble(1));
outCreatingReliefSettings.widthTerrain = (float)reader.GetDouble(2);
outCreatingReliefSettings.lenghtTerrain = (float)reader.GetDouble(3);
outCreatingReliefSettings.heightTerrain = (float)reader.GetDouble(4);
outCreatingReliefSettings.heightmapResoltion = reader.GetInt16(5);
outCreatingReliefSettings.Depth = reader.GetInt16(6);
outCreatingReliefSettings.detailResolution = reader.GetInt16(7);
outCreatingReliefSettings.detailResolutionPerPatch = reader.GetInt16(8);
outCreatingReliefSettings.controlTextureResolution = reader.GetInt16(9);
outCreatingReliefSettings.baseTextureResolution = reader.GetInt16(10);
outCreatingReliefSettings.path = reader.GetString(11);
}
dbConnection.Close();
reader.Close();
}
}
}
}
static public Dictionary<int, string> GetAllTypeGeometry()
{
connectionString = "URI=file:" + Application.dataPath + "/TerrainTools/db/object.sqlite";
using (IDbConnection dbConnection = new SqliteConnection(connectionString))
{
dbConnection.Open();
using (IDbCommand dbCmd = dbConnection.CreateCommand())
{
string sqlQuery = "SELECT * FROM TypeGeometry";
dbCmd.CommandText = sqlQuery;
using (IDataReader reader = dbCmd.ExecuteReader())
{
Dictionary<int, string> countriesTypeG = new Dictionary<int, string>();
while (reader.Read())
{
// Debug.Log(reader.GetString(1)+" id:"+reader.GetInt16(0));
countriesTypeG.Add(reader.GetInt16(0), reader.GetString(1));
}
dbConnection.Close();
reader.Close();
return countriesTypeG;
}
}
}
}
...
}
Ответы (3 шт):
Совет один и общий - попробуйте отладить свой код. Судя по тому классу, который вы демонстрируете - одновременного обращения к файлу быть не может, так как код у вас последовательный и синхронный.
Но ошибка, которую вы ловите в коде скорее всего возникает потому, что где-то в коде вы создаете соединение с базой, а далее его просто забываете закрыть. Потом пытаетесь открыть это соединение снова, и получаете исключение.
Кроме того, у вас в каждом методе в самом конце вызывается код а ля:
dbConnection.Close();
reader.Close();
Который вызывать совершенно не нужно и возможно даже в этом часть вашей ошибки. Дело в том, что оператор using (...) можно использовать только с классами, которые реализуют интерфейс IDisposable, который содержит 1 метод - Dispose(). Тело этого метода содержит как раз закрытие всех управляемых ресурсов. Этот метод автоматически дергается у экземпляра класса, когда выполнение доходит до конца блока using(...).
Вы же в своей последовательности вызовов .Close() можете банально ошибиться в порядке вызова (особенно если эти объекты ссылаются друг на друга), что может привести к нежелательным последствиям. В вашем случае, достаточно сложно во всем этом разобраться, потому что у вас вложенность using(...) достигает 4.
Возможно, что причина вашей ошибки в том, что файл с бд читается где-то в другом классе, а не в том, что вы привели в вопросе (это нельзя с точностью утверждать, потому что неизвестен весь код проекта). В таком случае обязательно нужно вынести функционал работы с бд в отдельный класс, а не раскидывать его по разным методам и классам.
Чтобы избавиться от надобности поиска пути до бд и доступа к ней на каждый чих - вынесите взаимодействие с бд в отдельный класс, который будет такую работу инкапсулировать. Создайте такой класс в 1 экземпляре и передавайте его другим классам, которые хотят "общаться" с бд. В таком случае открытие/закрытие бд будет всегда внутри 1 класса, который сможет отслеживать уникальность попыток доступа к бд. Кроме того, что вы избавитесь от дублирования функционала, вы также улучшите соблюдение принципов SOLID в вашем коде.
Переделал подключение к БД, но ошибка осталась.
Вызываю в коде любое обращение к БД так:
DemoDTO DTOSqliteObj = new DemoDTO();
if (!DTOSqliteObj.checkStatus()) { DTOSqliteObj.openDataBase(); }
myList = DTOSqliteObj.SelectAllObjMap();
DTOSqliteObj.closeDataBase();
Три файла для подключения к БД(DTO.cs):
using System;
using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;
using System.Collections.Generic;
namespace DEMO.Common
{
/// <summary>
/// This is the base class for all DataTransferObjects.
/// </summary>
public abstract class DTO
{
public static string connectionString = "URI=file:" + Application.dataPath + "/TerrainTools/db/object.sqlite";
public IDbConnection dbConnection = new SqliteConnection(connectionString);
public IDbCommand dbCmd;
public IDataReader reader;
public DTO()
{
}
public bool openDataBase()
{
dbConnection.Open();
if (dbConnection.State.ToString() == "Open")
{
return true;
}
else
{
return false;
}
}
public bool checkStatus()
{
if (dbConnection.State.ToString() == "Open")
{
return true;
}
else if (dbConnection.State.ToString() == "Closed")
{
return false;
}
return false;
}
public bool closeDataBase()
{
dbConnection.Close();
reader.Close();
if (dbConnection.State.ToString() == "Closed")
{
return true;
}
else
{
return false;
}
}
}
}
DTOSerializerHelper.cs:
using System;
// using System.Xml.Serialization;
using System.IO;
namespace DEMO.Common
{
/// <summary>
/// Summary description for DTOSerializerHelper.
/// </summary>
public class DTOSerializerHelper
{
public DTOSerializerHelper()
{
}
/// <summary>
/// Creates xml string from given dto.
/// </summary>
/// <param name="dto">DTO</param>
/// <returns>XML</returns>
public static DTO SerializeDTO(DTO dto, string sqlQuery)
{
try
{
dto.dbCmd = dto.dbConnection.CreateCommand();
dto.dbCmd.CommandText = sqlQuery;
dto.reader = dto.dbCmd.ExecuteReader();
return dto;
}
catch (Exception ex)
{
// Propogate the exception.
throw ex;
return null;
}
}
}
}
DemoDTO.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
// using System.Xml.Serialization;
using DEMO.Common;
using System.Data;
using Mono.Data.Sqlite;
public class DemoDTO : DTO
{
public DemoDTO()
{
}
public SattingMain GetSettings(SattingMain mainSatting)
{
string sqlQuery = "SELECT EditModeBool,PrefabForEditing,mapoffsetx,mapoffsetz,ObjfileURL FROM Setting";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
while (dto.reader.Read())
{
mainSatting.EditModeBool = dto.reader.GetBoolean(0);
mainSatting.PrefabForEditing = dto.reader.GetString(1);
mainSatting.mapoffsetx = (float)dto.reader.GetDouble(2);
mainSatting.mapoffsetz = (float)dto.reader.GetDouble(3);
mainSatting.stringObjfileURL = dto.reader.GetString(4);
}
return mainSatting;
}
public bool updateSQLite(string sqlQueryStringUpdateObj)
{
if (DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQueryStringUpdateObj) != null)
{
return true;
}
else
{
return false;
}
}
public List<int> SELECT_id(int id, string str)
{
List<int> listINT = new List<int>();
string sqlQueryDelete = "";
if (str == "Prefabs")
{
sqlQueryDelete = "SELECT id_Prefabs FROM Connection_ObjMap_Prefabs WHERE id_ObjMap = " + id + "";
}
else if (str == "Textures")
{
sqlQueryDelete = "SELECT id_Textures FROM Connection_ObjMap_Textures WHERE id_ObjMap = " + id + "";
}
if (sqlQueryDelete != "")
{
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQueryDelete);
if (dto != null)
{
while (dto.reader.Read())
{
int tempint = -1;
if (str == "Prefabs")
{
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_Prefabs")))
{
tempint = dto.reader.GetInt16(0);
}
}
else if (str == "Textures")
{
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_Textures")))
{
tempint = dto.reader.GetInt16(0);
}
}
if (tempint != -1)
{
listINT.Add(tempint);
}
}
return listINT;
}
else
{
listINT = null;
return listINT;
}
}
else
{
listINT = null;
return listINT;
}
}
public bool DeleteAllid_ObjMapPrefabs(int id_ObjMap)
{
string sqlQueryDelete = "DELETE FROM Connection_ObjMap_Prefabs WHERE id_ObjMap = " + id_ObjMap + "";
if (DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQueryDelete) != null)
{
return true;
}
else
{
return false;
}
}
public bool DeleteAllid_ObjMapTextures(int id_ObjMap)
{
string sqlQueryDelete = "DELETE FROM Connection_ObjMap_Textures WHERE id_ObjMap = " + id_ObjMap + "";
if (DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQueryDelete) != null)
{
while (reader.Read())
{
int tempintone = -1;
int tempinttwo = -1;
if (!reader.IsDBNull(reader.GetOrdinal("id_ObjMap")))
{
tempintone = reader.GetInt16(0);
}
else
{
tempintone = -1;
}
}
return true;
}
else
{
return false;
}
}
public long INSERTSELECTObj(string sqlQueryINSERT)
{
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQueryINSERT);
if (dto != null)
{
using (IDbCommand dbCmdLastID = dto.dbConnection.CreateCommand())
{
dbCmdLastID.CommandText = "SELECT last_insert_rowid()";
long lastID = (long)dbCmdLastID.ExecuteScalar();
lastID.ToString();
return lastID;
}
}
else
{
return -1;
}
}
public bool CheckRecordCheckInt(int intone, int inttwo)
{
string sqlQuerySELECT = "SELECT id_ObjMap,id_Prefabs FROM Connection_ObjMap_Prefabs";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuerySELECT);
if (dto != null)
{
bool boolvalue = false;
while (dto.reader.Read())
{
int tempintone = -1;
int tempinttwo = -1;
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_ObjMap")))
{
tempintone = reader.GetInt16(0);
}
else
{
tempintone = -1;
}
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_Prefabs")))
{
tempinttwo = reader.GetInt16(1);
}
else
{
tempinttwo = -1;
}
// Debug.Log("intone="+intone+"tempintone="+tempintone+"inttwo="+inttwo+"tempinttwo="+tempinttwo);
if (tempintone == -1 || tempinttwo == -1)
{
boolvalue = false;
}
else if (tempintone == intone && tempinttwo == inttwo)
{
boolvalue = true;
break;
}
else
{
boolvalue = false;
}
}
return boolvalue;
}
else
{
return false;
}
}
public int RecordCheckUrl(string stringCheck, string table)
{
string sqlQuerySELECT = "";
if (table == "Prefabs")
{
sqlQuerySELECT = "SELECT id_pref,url FROM Prefabs";
}
else if (table == "Textures")
{
sqlQuerySELECT = "SELECT id_tex,url FROM Textures";
}
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuerySELECT);
if (dto != null && sqlQuerySELECT != "")
{
int id_pref_temp = -1;
bool checkBOOL = false;
int count = 0;
while (dto.reader.Read())
{
string url_temp = "null";
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("url")))
{
url_temp = dto.reader.GetString(1);
if (url_temp == stringCheck)
{
if (table == "Prefabs")
{
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_pref")))
{
id_pref_temp = dto.reader.GetInt16(0);
return id_pref_temp;
}
else
{
id_pref_temp = -1;
}
}
else if (table == "Textures")
{
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_tex")))
{
id_pref_temp = dto.reader.GetInt16(0);
return id_pref_temp;
}
else
{
id_pref_temp = -1;
}
}
}
// Debug.Log("url_temp="+reader.GetString(1));
}
else
{
url_temp = "null";
// Debug.Log("url_temp=null");
}
if (stringCheck == url_temp)
{
checkBOOL = true;
break;
}
else
{
checkBOOL = false;
}
count++;
}
if (count == 0) { checkBOOL = true; id_pref_temp = -2; }
if (checkBOOL == true) { } else { id_pref_temp = -1; }
return id_pref_temp;
}
else
{
return -1;
}
}
public Dictionary<int, string> GetAllTypeGeometry()
{
string sqlQuery = "SELECT gtype_id,gtype_name FROM TypeGeometry";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
Dictionary<int, string> countriesTypeG = new Dictionary<int, string>();
while (dto.reader.Read())
{
// Debug.Log(reader.GetString(1)+" id:"+reader.GetInt16(0));
countriesTypeG.Add(dto.reader.GetInt16(0), dto.reader.GetString(1));
}
return countriesTypeG;
}
else
{
return null;
}
}
public Dictionary<int, string> GetAllLayer()
{
string sqlQuery = "SELECT l_id,l_name FROM Layer";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
Dictionary<int, string> countriesTypeG = new Dictionary<int, string>();
while (dto.reader.Read())
{
// Debug.Log(reader.GetString(1)+" id:"+reader.GetInt16(0));
countriesTypeG.Add(dto.reader.GetInt16(0), dto.reader.GetString(1));
}
return countriesTypeG;
}
else
{
return null;
}
}
public Dictionary<int, string> GetAllmethod()
{
string sqlQuery = "SELECT id,name FROM method";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
Dictionary<int, string> countriesTypeG = new Dictionary<int, string>();
while (dto.reader.Read())
{
// Debug.Log(reader.GetString(1)+" id:"+reader.GetInt16(0));
countriesTypeG.Add(dto.reader.GetInt16(0), dto.reader.GetString(1));
}
return countriesTypeG;
}
else
{
return null;
}
}
public LoadTerrainRaw.CreatingReliefSettings GetCreatingReliefSettings(LoadTerrainRaw.CreatingReliefSettings outCreatingReliefSettings)
{
string sqlQuery = "SELECT AmountX,AmountY,TerrainWidth,TerrainLenght,TerrainHeight,HeightmapResoltion,PrimitiveToCreate_ID,DetailResolution,DetailResolutionPerPatch,ControlTextureResolution,BaseTextureReolution,Path FROM CreatingReliefSettings";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
outCreatingReliefSettings = new LoadTerrainRaw.CreatingReliefSettings();
outCreatingReliefSettings.tileAmount = Vector2.one;
outCreatingReliefSettings.widthTerrain = 2000f;
outCreatingReliefSettings.lenghtTerrain = 2000f;
outCreatingReliefSettings.heightTerrain = 168f;
outCreatingReliefSettings.heightmapResoltion = 65;
outCreatingReliefSettings.Depth = 1;
outCreatingReliefSettings.detailResolution = 2048;
outCreatingReliefSettings.detailResolutionPerPatch = 8;
outCreatingReliefSettings.controlTextureResolution = 2048;
outCreatingReliefSettings.baseTextureResolution = 2048;
outCreatingReliefSettings.path = string.Empty;
while (dto.reader.Read())
{
outCreatingReliefSettings.tileAmount = new Vector2((float)dto.reader.GetDouble(0), (float)dto.reader.GetDouble(1));
outCreatingReliefSettings.widthTerrain = (float)dto.reader.GetDouble(2);
outCreatingReliefSettings.lenghtTerrain = (float)dto.reader.GetDouble(3);
outCreatingReliefSettings.heightTerrain = (float)dto.reader.GetDouble(4);
outCreatingReliefSettings.heightmapResoltion = dto.reader.GetInt16(5);
outCreatingReliefSettings.Depth = dto.reader.GetInt16(6);
outCreatingReliefSettings.detailResolution = dto.reader.GetInt16(7);
outCreatingReliefSettings.detailResolutionPerPatch = dto.reader.GetInt16(8);
outCreatingReliefSettings.controlTextureResolution = dto.reader.GetInt16(9);
outCreatingReliefSettings.baseTextureResolution = dto.reader.GetInt16(10);
outCreatingReliefSettings.path = dto.reader.GetString(11);
}
return outCreatingReliefSettings;
}
else
{
return null;
}
}
public bool DeleteAllObj()
{
string sqlQuery = "DELETE FROM 'Textures'";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
if (dto.closeDataBase())
{
if (dto.openDataBase())
{
try
{
return DeleteAllObjsequence();
}
catch (Exception ex)
{
throw ex;
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
public bool DeleteAllObjsequence()
{
string sqlQuery = "DELETE FROM sqlite_sequence where name='ObjectMap'";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
return true;
}
else
{
return false;
}
}
public List<selectURLArrayTextures> SelectTextures(int intObj)
{
string sqlQuery = "SELECT id_ObjMap,id_Textures FROM Connection_ObjMap_Textures";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
List<selectURLArrayTextures> ListURLArray = new List<selectURLArrayTextures>();
while (dto.reader.Read())
{
selectURLArrayTextures tempSelectURLArray = new selectURLArrayTextures();
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_ObjMap")))
{
if (intObj == dto.reader.GetInt16(0))
{
tempSelectURLArray.selectid_ObjMap = dto.reader.GetInt16(0);
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("id_Textures")))
{
tempSelectURLArray.selectid_Textures = dto.reader.GetInt16(1);
}
else
{
tempSelectURLArray.selectid_Textures = -1;
}
ListURLArray.Add(tempSelectURLArray);
}
}
else
{
tempSelectURLArray.selectid_ObjMap = -1;
}
}
for (int i = 0; i < ListURLArray.Count; i++)
{
dto.closeDataBase();
if (!dto.checkStatus()) { dto.openDataBase(); }
ListURLArray[i].selectStringUrl = SetUrlClassSelectURLArrayTextures(ListURLArray[i].selectid_Textures);
dto.closeDataBase();
}
return ListURLArray;
}
else
{
return null;
}
}
private string SetUrlClassSelectURLArrayTextures(int id_pref_int)
{
string tempstring = "";
string sqlQuery = "SELECT url FROM Textures WHERE id_tex = '" + id_pref_int + "'";
DTO dto = DEMO.Common.DTOSerializerHelper.SerializeDTO(this, sqlQuery);
if (dto != null)
{
while (dto.reader.Read())
{
if (!dto.reader.IsDBNull(dto.reader.GetOrdinal("url")))
{
tempstring = dto.reader.GetString(0);
break;
}
else
{
tempstring = "";
}
}
return tempstring;
}
else
{
return tempstring;
}
}
}
Надо создать dbConnection один раз при запуске приложения, и один раз закрыть при выходе. А не дергать его много раз. Т.к. при этом можно запросто забыть где-то закрыть.
Например вот этот ваш код:
DemoDTO DTOSqliteObj = new DemoDTO();
if (!DTOSqliteObj.checkStatus()) { DTOSqliteObj.openDataBase(); }
myList = DTOSqliteObj.SelectAllObjMap();
DTOSqliteObj.closeDataBase();
нужно вызывать не при каждом обращении к базе, тем более, что здесь нужно примерно так (схематично):
DemoDTO DTOSqliteObj = new DemoDTO();
DTOSqliteObj.openDataBase();
try
{
myList = DTOSqliteObj.SelectAllObjMap();
}
finally
{
DTOSqliteObj.closeDataBase();
}
