Как определить, находится ли запись в таблице SQL - возможно, с помощью linq? - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть база данных SQL, которая является таблицей "фидер". Я помещаю записи в указанную таблицу, сторонний пакет потребляет (и удаляет) их. Все чертовски дорого - пока сторонний пакет не запущен. Размышляя о том, как это обнаружить, я подумал про себя: «ну ... что если я прочитаю все ключи в таблице (не очень большой - максимум несколько десятков записей) , и сохранил их, а потом, скажем, через 5 минут, я проверил, были ли еще какие-либо в таблице? "

Возможно, это не блестящее решение, но это заставило меня задуматься о Linq и о том, можете ли вы сделать такую ​​вещь (я раньше не пользовался Linq) .

Итак, если я прочитал все ключи записи в объект DataTable, а затем, через пять минут, прочитал все записи в другой объект DataTable, я могу сделать выбор Linq, соединив два объекта DataTable в ключевом столбце, и затем посмотрите на результаты «Подсчета», и, если один или несколько, скорее всего, данные в таблице не используются.

Или ... есть ли "более умный" способ, чем этот?

Ответы [ 4 ]

0 голосов
/ 18 ноября 2011

Но это больше того, что я имел в виду:

DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... your lamp is getting dim
DataTable t2 = GetData();

// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();

EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();

// how many rows from r1 are still in r2
int n = (from r1 in rows1
        join r2 in rows2 on (Int16)r1["Id"] equals (Int16)r2["Id"]
        select r1).Count();

... это метод "linq / join", на который я ссылался в исходном вопросе.

0 голосов
/ 20 апреля 2010

Вы можете вернуть значение столбца идентификаторов (при условии, что оно есть) после вставки и записать его в отдельную таблицу вместе с датой фиксации, когда они просто извлекают непогашенные записи;

SELECT * FROM feeder_table F
  INNER JOIN other_table T ON (F.id = T.id)
WHERE DATEDIFF(MINUTE, T.commitdate, GETDATE()) > 5

Таким образом вы не сохраняете данные в памяти, поэтому они будут работать между перезапусками приложения / на разных машинах.

(Если это только для обнаружения неисправности, вам нужно только сохранить последний вставленный идентификатор.)

0 голосов
/ 18 ноября 2011

Это один из способов:

DataTable t1 = GetData(); // returns a datatable with an Int16 "Id" column
// time passes... a shabby man enters and steals your lamp
DataTable t2 = GetData();

// some data changes have occurred
t2.Rows.Add(null, DateTime.Now.AddSeconds(10), "Some more");
t2.Rows[1].Delete();

EnumerableRowCollection<DataRow> rows1 = t1.AsEnumerable();
EnumerableRowCollection<DataRow> rows2 = t2.AsEnumerable();

var keys1 = rows1.Select(row => (Int16)row["Id"]).ToList();
var keys2 = rows2.Select(row => (Int16)row["Id"]).ToList();

// how many keys from t1 are still in t2
Console.WriteLine("{0} rows still there", keys1.Count(id => keys2.Contains(id)));
0 голосов
/ 20 апреля 2010

Создать триггер DELETE, который записывает в отдельной таблице метку времени последнего удаления. Дополнительный триггер INSERT записывает метку времени последнего оператора вставки.

Сравните две метки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...