Criar instrução SQL de Insert usando SMO

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

O seu endereço de email não será publicado. Campos obrigatórios marcados com *