После немного беспорядка я нашел что-то, что работает. Я использую класс под названием DatabaseResults держать результаты:
public class DatabaseResults
{
public List<string> ColumnNames { get; set; }
public List<List<string>> Rows { get; set; }
public DatabaseResults()
{
ColumnNames = new List<string>();
Rows = new List<List<string>>();
}
}
Способ затем идет и выполняет запрос, захватывая заголовки и положить их в объектах результатов. Затем он считывает строки, беря строки значений столбца. «query» - это строка, переданная в. Это запрос «select», при этом отсутствует бит select.
DatabaseResults results = new DatabaseResults();
string full_query = "SELECT " + query;
DbConnection connection = DB.DB().Connection;
connection.Open();
var command = connection.CreateCommand();
command.CommandText = full_query;
try
{
using (var reader = command.ExecuteReader())
{
for (int i = 0; i < reader.FieldCount; i++)
{
results.ColumnNames.Add(reader.GetName(i));
}
while (reader.Read())
{
List<string> this_res = new List<string>();
for (int i = 0; i < reader.FieldCount; ++i)
{
this_res.Add(reader[i].ToString());
}
results.Rows.Add(this_res);
}
}
}
catch (Exception ex)
{
results.ColumnNames.Add("Error");
List<string> this_error = new List<string>();
this_error.Add(ex.Message);
results.Rows.Add(this_error);
}
finally
{
connection.Close();
}
Я не могу уничтожить соединение, так как он используется в объекте системы БД, так что мне нужно, чтобы открыть и закрыть его. Попробуйте/поймать /, наконец, убедитесь, что это происходит.
как делает ваш оператор выбора выглядит !!! –
Никита, оператор выбора будет генерироваться во время выполнения, так что это может быть что угодно. Единственным ограничением является то, что он начнет с «выбрать» и иметь только одну команду (так что нет цепочки отборное с последующей вставкой) –