У меня есть простое приложение DB, которое позволяет пользователю выполнять поиск в таблице MSSQL на определенных условиях, а затем экспортировать найденные результаты в файл журнала.
Я столкнулся с странной ошибкой, которая заставит приложение замораживаться, но только если я запускаю сборку "Release" и никогда не запускаю сборку Debug внутри визуальной студии. Я могу запускать всевозможные запросы без проблем. Однако если первый запрос, который я запускаю, возвращает 0 результатов, то самый следующий запрос, который возвращает какой-либо результат, всегда будет терпеть неудачу при попытке загрузить результаты из данных в представление datagrid.
Я почти уверен, что он рушится из-за того, что я не придерживаюсь лучшей практики на моей стороне, но я не совсем понимаю, почему.
Здесь усеченные фрагменты кода.
//Declared in the start of the class
DataTable DBResults = new DataTable();
//This is run inside of a method called by a background worker.
DBResults.Clear();
SqlDataAdapter da = new SqlDataAdapter(sqlQuery, SQLConnection);
SqlConnection SQLCon = new SqlConnection(getConnectionString());
//This is wrapped inside a try/catch/finally.
SQLCon.Open();
da.Fill(DBResults);
SQLCon.Close();
//Finally, push the data into the Datagridview inside of the form.
//This is the line that will always freeze the app when running a Final build, but not a debug build.
dataGridView_Results.DataSource = new DataView(DBResults);
this.dataGridView_Results.Refresh();
//I discovered that if I changed the crashing line to copy instead, it won't crash:
dataGridView_Results.DataSource = new DataView(DBResults.Copy());
Я предполагаю, что это потому, что у Datasource все еще есть указатель на DbResults. Но странно, что это не вызывает проблемы, если у меня есть результаты, только если первый поиск возвращает 0 результатов. Это visual studio 2012.NET 4, если это имеет значение вообще.
Etan, вы должны присвоить таблицу данных непосредственно свойству datasource объекта datagridview, не выполняя новое. Это должно быть так:
dataGridView_Results.DataSource = DBResults;
Я действительно мало знаю о свойствах копии строки ниже.