SQL Server 2016/2017 – MS 70-761 Querying data with T-SQL

Подготовката за изпит MS 70-761 Querying data with Transact-SQL задължително минава през новостите в SQL Server 2016, като част от тях  са:

  • Dynamic Data Masking
  • Row Level Security
  • Always encrypted
  • Temporal data
  • JSON support
  • Polybase

Долните са по-скоро административни, но така или иначе са полезни

  • Query Store
  • Stretch Database

Проблем с ID-тата при SQL Server Compact Edition

SQL Server Compact Edition е много добра вградена база, която може лесно да се deploy-ва на клиентски машини.
Разбира се, има ограничения – някои ти бъркат в здравето, други не чак толкова. Един проблем се оказа доста изнервящ, докато не намеря в Google подходящо решение. Накратко – ако в приложението се добавят нови записи в таблица, то те са с id-та -1, -2, -3 и т.н.
Дотук съвсем нормално и в реда на нещата.
След запис на данните – новите редове се появяват физически в базата с правилните (поредни) id-та. За съжаление – в приложението те някак си остават със старите идентификатори (-1, -2 и т.н). Ефектът е доста неприятен – ако се редактира някой от току що създадените редове и се даде запис се получава Exception, тъй като не може да намери такова id в базата за update.
Още по-изнервящо е, че същия код работи съвсем добре с SQL Express или пълния SQL.
След известно чудене и лутане в Интернет намерих решение, по-точно – едно решение.В form_Load се добавя:

eventsTableAdapter.Adapter.RowUpdated += new System.Data.SqlServerCe.SqlCeRowUpdatedEventHandler(Adapter_RowUpdated);

(тук таблицата е events, като трябва да се добави по един ред за всяка таблица, в която може да се добавят нови редове)

като самия код на метода е:

void Adapter_RowUpdated(object sender, System.Data.SqlServerCe.SqlCeRowUpdatedEventArgs e)
{
if (e.StatementType == StatementType.Insert)
{
SqlCeCommand cmd = null; cmd = new SqlCeCommand(“SELECT @@IDENTITY”, e.Command.Connection, e.Command.Transaction);

int newid = Convert.ToInt32(cmd.ExecuteScalar());

DataColumn colMasterID = e.Row.Table.Columns[“ID”];
colMasterID.ReadOnly = false;
e.Row[colMasterID] = newid;
}
}

Малко “грубо” решение, тъй като прави нова заявка към базата при вседки update, но работи. Все пак си мисля, че трябва да има и по-добро решение …
(най-вероятно refresh и прочитане отново на данните също ще работи, но не ми се струва достатъчно елегантно)