#c# #sql #combobox #dataadapter
#c# #sql #поле со списком #dataadapter
Вопрос:
У меня возникла странная проблема, и я понятия не имею, происходит ли это из-за плохого соединения или причиной этого является что-то другое. Проблема: у меня есть поле со списком, и я заполняю значения, используя таблицу данных SQL в событии «Загрузка формы», и до сегодняшнего дня все работало нормально. Каждый раз, когда загружается форма, оба поля со списком пусты, одно для даты, а другое для названия компании. Код, который я использую, приведен ниже.
public DataTable getResult(string query)
{
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(query, con);
cmd.CommandTimeout = 0;
da.SelectCommand = cmd;
da.Fill(dt);
return dt;
}
private void Reports_Load(object sender, EventArgs e)
{
RevenueDate_dt = func.getResult(dateQuery);
foreach (DataRow dr in RevenueDate_dt.Rows)
{
comboBox1.Items.Add(dr["Global_Period_Month"].ToString());
}
Gpn_dt = func.getResult(GpnQuery);
foreach (DataRow dr in Gpn_dt.Rows)
{
comboBox2.Items.Add(dr["gpnname"].ToString());
}
}
Запрос показывает идеальный результат, когда я выполняю его на SQL Server.
С нетерпением жду ответов.
Комментарии:
1. Поставьте точку останова в «return dt». Как выглядит datatable.
2. В нем отображаются строки 80 и нет имени таблицы! И все равно поле со списком пустое. Запрос выполнен нормально, и соединение в порядке
Ответ №1:
Трудно сказать, что происходит, но мне интересно, не является ли datatable немного излишним для того, что вы хотите. Похоже, что у обычного DataReader было бы намного меньше накладных расходов и его было бы проще отлаживать. Что-то вроде этого:
public string[] getResult(string query, string ColumnName)
{
List<string> results = new List<string>();
SqlCommand cmd = new SqlCommand(query, con);
cmd.CommandTimeout = 0;
SqlDataReader reader = cmd.ExecuteReader();
int col = reader.GetOrdinal(ColumnName);
while (reader.Read())
{
results.Add(reader.GetString(col));
}
reader.Close();
return results.ToArray();
}
И затем, чтобы добавить элементы в ваши поля со списком, это просто выглядело бы так:
comboBox1.Items.AddRange(func.getResult(dateQuery, "Global_Period_Month"));
comboBox2.Items.AddRange(func.getResult(GpnQuery, "gpnname"));
Комментарии:
1. Спасибо @Hambone и да, это очень типичная ситуация и для меня: позавчера код работал нормально, но затем произошел сбой, но в любом случае спасибо за ответ, и код работает для меня сейчас. Ценю ваш ответ.
2. Спасибо за отзыв. Таблицы данных — это палка о двух концах. Очень полезно и справляется со многими тяжелыми задачами, но у них есть некоторые шероховатости. Я рад, что у вас это сработало.