Objectivo: criar a partir de uma instrução SQL parametrizada para a actualização de dados numa tabela.
Ferramentas: SQL Server Management Objects (SMO)
Principais objectos e propriedades: Table, Table.Columns, Column, Column.InPrimaryKey
Notas:
- chave primária não composta
- mesmo que chave primária não seja um valor automatico (por exemplo ter a propriedade identity) ela nunca mais é actualizada
- a tabela inclui sempre uma coluna do tipo Timestamp que deve ser devolvido e que se chama lastUpdated
- a actualização só pode ocorrer se tiver o último timestamp
- deve ser devolvido o número de linhas afectadas pela operação de Update
- as colunas CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy existem sempre
- a função considera a existencia de um array chamado readOnly com uma lista de campos que não devem ser incluídos
Exemplo do resultado pretendido
Dim sql As String = "UPDATE {0}TM_Parametros SET description = @Description, scope = @Scope, sorting = @Sorting, visible = @Visible, lastUpdatedOn = @LastUpdatedOn, lastUpdatedBy = @LastUpdatedBy WHERE id = @Id AND lastUpdated = @lastUpdated" & ControlChars.CrLf & _
"SELECT @updatedRows = @@ROWCOUNT;SELECT @lastUpdated = lastUpdated FROM {0}TM_Parametros WHERE id = @Id ;"
Código
StringBuilder sqlUpdate = new StringBuilder(50);
sqlUpdate.AppendFormat("UPDATE {{0}}{0} SET ", table.Name);
foreach(Column c in table.Columns)
{
if (!c.InPrimaryKey &&
!readOnly.Contains(c.Name) )
sqlUpdate.AppendFormat("{0} = @{1}, ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
}
sqlUpdate.Append("lastUpdatedOn = @LastUpdatedOn, lastUpdatedBy = @LastUpdatedBy WHERE ");
foreach(Column c in table.Columns)
{
if (c.InPrimaryKey)
sqlUpdate.AppendFormat("{0} = @{1} AND ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
}
sqlUpdate.Append("lastUpdated = @lastUpdated");
StringBuilder sqlSelect = new StringBuilder(50);
bool primeiro = true;
foreach(Column c in table.Columns)
{
if (c.InPrimaryKey)
{
if (primeiro) primeiro = false; else sqlSelect.Append(" AND ");
sqlSelect.AppendFormat("{0} = @{1} ", LowerCaseFirstCharacter(c.Name), UpperCaseFirstCharacter(c.Name));
}
}
String sql = String.Format("SELECT @updatedRows = @@ROWCOUNT;SELECT @lastUpdated = lastUpdated FROM {{0}}{0} WHERE {1};", table.Name, sqlSelect.ToString());
Deixe um comentário