Я читаю db, который содержит некоторые таблицы, используя команду ExecuteReader(). Основываясь на результате первого результата Read(), я читаю в двух разных таблицах, так как мне нужен идентификатор, возвращенный в первом запросе, для запуска второго.Использование нескольких ExecuteReader в то же время
Проблема заключается в том, что поиск осуществляется очень медленно.
tuCommand.CommandText = "SELECT * FROM tblTranslationUnit WHERE DocumentId = " + doc.DocumentId;
var tuReader = tuCommand.ExecuteReader();
while (tuReader.Read())
{
var tu = new TranslationUnit
{
TranslationUnitId = tuReader.GetInt64(0),
DocumentId = tuReader.GetInt64(1),
Raw = tuReader.GetString(2),
IsSegmented = tuReader.GetBoolean(3),
Reader = this, // Ryan: Fixed so that it sets the reader to itself
};
using (var propCommand = _dbConn.CreateCommand())
{
propCommand.CommandText = "SELECT * FROM tblTranslationUnitProperties WHERE TranslationUnitId = " + tu.TranslationUnitId;
var propReader = propCommand.ExecuteReader();
while (propReader.Read()) tu.Properties.Add(GetProperty(propReader));
}
yield return tu;
}
Если удалить второй ExecuteReader() запрос очень быстро
Я также попытался поставить вторую ExecuteReader(), используя новое соединение и новую транзакцию, но результат почти такой же
Любая идея или подсказка? Как я могу выполнить такой поиск? Есть ли лучший подход? (Я полагаю, да).
Подробнее Структура дб:
- Document
- properties
- errors
-TranslationUnits
- properties
- errors
- Segments
- properties
- errors
Таким образом, в некоторых частях кода мы будем иметь такую структуру
foreach (document in db)
foreach (property in document)
foreach (error in document)
foreach (translationunit in document)
foreach (property in translationunit)
foreach (error in translationunit)
foreach (segment in translationunit)
foreach (property in segment)
foreach (error in segment)
Основываясь на том, что использование объединения вернуть все это не очень хорошая идея Я думал, если проблема была просто проблемой конфигурации SQLite. Я имею в виду, если это возможно, чтобы добавить любой параметр или аналогичный, чтобы сообщить системе, что мы будем использовать несколько указателей
Теперь мы переходим к DataTable решения:
- открывает соединение
- чтения 1000 записей из таблицы
- закрыть соединение
- открыть новое соединение
- чтения 1000 записей дочерней таблицы
- закрыть новое соединение
- ...
Я не знаю, разрешит ли он проблему, но вы должны приложить оба вызова ExecuteReader() в инструкции «using», чтобы убедиться, что читатель правильно закрыт. –
Чтобы быть уверенным, какую библиотеку и версию sqlite вы используете? –