Я хочу показать подробную информацию о состоянии пользователя при выполнении длительных операций с базой данных. В частности, при вставке/обновлении данных, которые могут быть порядка сотен КБ или МБ.Как лучше показать информацию о ходе работы при использовании ADO.NET?
В настоящее время я использую in-memory DataTables и DataRows, которые затем синхронизируются с базой данных через вызовы TableAdapter.Update. Это отлично работает и денди, но единственный вызов оставляет мало возможностей для сбора информации о ходе работы, чтобы показать пользователю. Я понятия не имею, сколько данных проходит через сеть для удаленной БД или ее прогресса. В принципе, все, что я знаю, - это когда Update возвращается и считается полным (запрет на любые ошибки или исключения). Но это означает, что все, что я могу показать, это 0%, а затем пауза, а затем 100%.
Я могу подсчитать количество строк, даже до тех пор, пока не набросано, сколько из них действительно модифицировано или добавлено, и я даже мог бы вычислить на DataRow его предполагаемый размер на основе типа данных каждого столбца, используя sizeof для типов значений как int и проверяя длину для таких вещей, как строки или байтовые массивы. При этом я мог бы, вероятно, определить, до обновления, приблизительный общий размер передачи, но я все равно застрял без какой-либо информации о ходе, как только Update вызывается в TableAdapter.
Я застрял только с помощью неопределенного индикатора хода или мыши, ожидающего курсора? Нужно ли мне радикально изменить наш уровень доступа к данным, чтобы иметь возможность подключаться к такой информации? Даже если я не могу довести его до того, что передал точный КБ (например, индикатор выполнения загрузки файла веб-браузера), могу ли я, по крайней мере, узнать, когда заканчивается каждый DataRow/DataTable или что-то в этом роде?
Как вы можете лучше всего показывать информацию о прогрессе с помощью ADO.NET?
ли SqlBulkCopy попытаться вставить все строки как новые строки? Под этим я подразумеваю, что если DataTable, переданный ему при вызове WriteToServer, имеет несколько строк, которые являются «RowState == Modified», то обновляет ли эти строки или вставляет копии с новыми PK? Что делать, если KeepIdentity включен? Если он пытается вставить, и ПК одинаковы, я полагаю, что это вызовет исключение SqlException. Возможно, это заслуживает отдельного вопроса. Документы MSDN не были конкретными ... –
Nevermind. Когда MSDN docs терпят неудачу, блоги MSDN на помощь. http://blogs.msdn.com/irenak/archive/2006/02/10/529553.aspx –
@Yadyn: 'SqlBulkCopy' завершает операцию массовой вставки, которая не обновляется, что является причиной, по которой вам необходимо использовать промежуточную Таблица. В общем, вам вряд ли удастся заставить «DataSet» и связанные с ними классы работать с любым из других классов данных в рамках - вам, вероятно, придется начать отходить от них, поскольку они основанный на концепции загрузки всего набора записей в память, а не потоковой передачи их из TDS. – Aaronaught