Я столкнулся с той же проблемой с SqlDataAdapter
. Я смог решить проблему, изменив свой код, чтобы вместо этого использовать SqlDataReader
.
Если вам вообще не нужно изменять схему
Следующие сегменты кода будут работать нормально, если вам не нужно манипулировать схемой вашего объекта DataTable
и вы также планируете использовать данные, возвращаемые хранимой процедурой.
var command = new SqlCommand("stored procedure name")
{
CommandType = CommandType.StoredProcedure
};
var adapter = new SqlDataAdapter(command);
var dt = new DataTable();
adapter.Fill(dt);
var command = new SqlCommand("stored procedure name")
{
CommandType = CommandType.StoredProcedure
};
var reader = command.ExecuteReader();
var dt = new DataTable();
dt.Load(reader);
Оба метода заполняют таблицу данных именами и типами столбцов, которые соответствуют именам и типам, возвращенным из вызова хранимой процедуры. Если вам нужна информация о схеме, вы можете получить к ней доступ через DataTable.Columns
собственность.
Если вам нужно изменить схему
Если вам нужна только информация о схеме или если вам нужно манипулировать схемой в объекте DataTable
перед заполнением его данными, следующий метод будет работать, даже если SqlDataAdapter.FillSchema
не работает.
var command = new SqlCommand("stored procedure name")
{
CommandType = CommandType.StoredProcedure
};
var reader = command.ExecuteReader();
var schemaTable = reader.GetSchemaTable();
SqlDataReader.GetSchemaTable()
вернет объект DataTable
со столбцом метаданные заполняются в виде строк.
Вы можете перечислить результаты для создания и/или управления столбцами в объекте DataTable
, который будет содержать записи, возвращаемые SqlDataReader
.
В моем случае мне нужно было, чтобы каждый столбец был строкой, чтобы избежать какой-либо «помощи» форматирования из Microsoft Excel при экспорте данных в электронную таблицу. Например, мой код выглядит так:
var dt = new DataTable();
foreach(DataRow row in schemaTable.Rows)
{
dt.Columns.Add((string)row["ColumnName"], typeof(string));
}
dt.Load(reader);
person
Bobby
schedule
19.06.2018