Objectivo: criar a partir de uma instrução SQL parametrizada para a inserção de dados numa tabela.
Ferramentas: SQL Server Management Objects (SMO)
Principais objectos e propriedades: Table, Table.Columns, Column, Column.Identity, Column.InPrimaryKey
Notas:
- chave primária não composta
- chave primária pode não ser um valor automatico (por exemplo ter a propriedade identity)
- a tabela inclui sempre uma coluna do tipo Timestamp que deve ser devolvido e que se chama lastUpdated
- a chave primária deve também ser devolvida
- 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 = "INSERT INTO {0}TM_Parametros (Description, Scope, Sorting, Visible, CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy) VALUES ( @Description, @Scope, @Sorting, @Visible, @CreatedOn, @CreatedBy, @lastUpdatedOn, @lastUpdatedBy)" & ControlChars.CrLf & _
"SET @id = SCOPE_IDENTITY(); " & ControlChars.CrLf & _
"SELECT @lastUpdated = lastUpdated FROM {0}TM_Parametros WHERE id = @Id ;"
Código
StringBuilder sqlInsert = new StringBuilder(50);
sqlInsert.AppendFormat("INSERT INTO {{0}}{0} (", table.Name);
foreach(Column c in table.Columns)
{
if ((c.Identity == false) &&
!readOnly.Contains(c.Name) )
sqlInsert.AppendFormat("{0}, ", UpperCaseFirstCharacter(c.Name));
}
sqlInsert.Append(" CreatedOn, CreatedBy, lastUpdatedOn, lastUpdatedBy) VALUES ( ");
foreach(Column c in table.Columns)
{
if ((c.Identity == false) &&
!readOnly.Contains(c.Name) )
sqlInsert.AppendFormat("@{0}, ", UpperCaseFirstCharacter(c.Name));
}
sqlInsert.Append(" @CreatedOn, @CreatedBy, @lastUpdatedOn, @lastUpdatedBy)");
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 @lastUpdated = lastUpdated FROM {{0}}{0} WHERE {1};", table.Name, sqlSelect.ToString());
String sqlIdentity = "";
foreach(Column c in table.Columns)
{
if ((c.InPrimaryKey) &&
(c.Identity))
sqlIdentity = String.Format(" \"SET @{0} = SCOPE_IDENTITY(); \" & ControlChars.CrLf & _",LowerCaseFirstCharacter(c.Name));
}
sb.AppendLine("");
sb.AppendFormat(" Dim sql As String = \"{0}\" & ControlChars.CrLf & _\n", sqlInsert.ToString());
if (sqlIdentity != "") sb.AppendLine(sqlIdentity);
sb.AppendFormat(" \"{0}\"\n", sql);
Deixe um comentário