С# как вы возвращаете набор данных из sqldatareader?
У меня это в открытом классе:
SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;");
myConnection.Open();
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand(InitializeQuery(), myConnection);
myReader = myCommand.ExecuteReader();
Мне нужен источник данных элемента управления для получения набора данных из myReader.
К сожалению, это трудно сделать, потому что элемент управления находится в форме (отдельный класс). как мне вернуть набор данных myReader
в свойство datasource
элемента управления в моей форме?
Ответы
Ответ 1
Нет. Вместо этого используйте DataAdapter:
var ds = new DataSet();
using(var conn = new SqlConnection(connString))
{
conn.Open();
var command = new SqlCommand(InitializeQuery(), conn);
var adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
}
Ответ 2
если вы можете использовать подкласс DataAdapter или использовать что-то как:
DataTable myTable = new DataTable();
myTable.Load(myCommand.ExecuteReader());
а затем верните DataTable клиенту.
Ответ 3
Вместо возврата SqlDataReader вы можете изменить свой код, чтобы он возвращал DataSet.
SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;");
DataSet dst = new DataSet();
SqlDataAdapter dap = new SqlDataAdapter(InitializeQuery(), mConnection);
dap.Fill(dst, "DataSetName");
Одна из опрятных вещей об этом подходе заключается в том, что Fill открывает и закрывает соединение с базой данных для вас.
Ответ 4
Если ваш SelectCommand хранится в процедуре, метод Fill адаптера повлечет за собой исключение.
В этих случаях вы можете использовать:
DataTable dt = new DataTable();
dt = sdr.GetSchemaTable();
dt.Constraints.Clear();
dt.BeginLoadData();
dt.Load(sdr);
//dt.EndLoadData(); // Enables constraints again
Ответ 5
IDataReader reader;
DataSet ds;
while (!reader.IsClosed)
ds.Tables.Add().Load(reader);