Jump to content

[Resolvido] Criar uma tabela dinâmicamente


arrelialp
 Share

Recommended Posts

Viva,

Gostaria de criar uma tabela dinamicamente numa base de dados SQL Server (2005 ou 2008, é indiferente) já préviamente criada. Estive a ver se encontrava alguma coisa já feita, mas como não encontrei, recorro à vossa ajuda.

A minha ideia é a seguinte:

1.º) Pergunto quantas colunas a tabela tem. Após o utilizador colocar um número (supondo 2)

2.º) Apresentaria um DataGridView com 2 linhas e 3 colunas, partindo do exemplo que o utilizador escolheu 2 colunas, em que as linhas corresponderiam às duas colunas e as 3 colunas às definições da tabela, nomeadamente Column Name, DataType e Allow Nulls(?). Column Name, onde o utilizador escrevia o nome das colunas, o DataType poderia ser do tipo ComboBox, já com alguns dos tipos possíveis e o Allow Null do tipo CheckBox

3.º) Depois de concluído o preenchimento do DataGridView seria criada a tabela.

Isto é possível? Agradeço desde já.

Link to comment
Share on other sites

Mas sabes fazer ligações à BD?

É só construires a instrução numa string baseada nas escolhas do utilizador, e executar essa instrução com um SqlCommand, e chamar o método

ExecuteNonquery...

ex:

SqlConnection conn = new SqlConnection(connectionString);

SqlCommand comando = new SqlCommand("create teste (id int)",conn);

conn.Open();

comando.ExecuteNonQuery();

Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist

Link to comment
Share on other sites

Esta questão que aqui coloquei já evoluiu e, neste momento, tenho já a datagridview criada, também com a ajuda dos moderadores deste fórum:

http://img252.imageshack.us/img252/6297/imagetable2.jpg

Gostaria, agora, de ler a datagridview (não sei quantas linhas irá ter pois depende do design do utilizador na construção da sua tabela) e, após estar preenchida, colocar numa instrução SQL do tipo CREATE TABLE (....);

O campo que é chave terá que ser encontrado na linha correspondente e tratado de uma forma diferente dentro da instrução SQL, por exemplo:

CREATE TABLE exemplo (

        ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

        Nome VARCHAR(50)

      );

É possível?

Link to comment
Share on other sites

Viva, estive a analisar a DataGridView e tenho apenas 3 hipóteses, na leitura das diferentes linhas (rows), que são as seguintes:

1.ª) Se na linha que estou a ler o campo, seja, M.Cells(2).Value = True então terei que ler M.Cells(0).Value e M.Cells(1).Value;

2.ª) Se na linha que estou a ler o campo M.Cells(3).Value = "É Chave!" então terei que ler M.Cells(0).Value e acrescentar "int" "Not Null" "AUTO_INCREMENT" "PRIMARY KEY";

Finalmente,

3.ª) Ler as céluas, da linha, M.Cells(0).Value, M.Cells(1).Value e acrescentar "Not Null".

Penso que isto corresponde a um If - ElseIf - Else - End If, só que eu gostava de implementar com uma função e não sei como o fazer.

Também não sei como, depois de obter o sql final, como o vou guardar para o executar...

Link to comment
Share on other sites

Isso é relativamente simples para tabelas simples, agora por exemplo se meteres uma primary key composta, o AUTO_INCREMENT já não faz sentido... mas isto é outra história.

Como tens isso, basta um ciclo for ou melhor for each, em que corres todas as linhas, pegas no valor da primeira celula (nome) e adicionas à string, pegas no valor da segunda (tipo e adicionas à string), depois então metes um IF, se for chave, por defeito tens logo de adicionar NOT NULL e PRIMARY KEY, senão for chave e for NOT NULL (ELSE IF), tens de meter NOT NULL.... e por ai adiante, adicionado "," e para auxiliar na leitura line breaks até ao fim do ciclo for.

Link to comment
Share on other sites

Viva,

Consegui gerar o script só que no fim da última linha do script não sei como retirar a virgula que é inserida.

Sei que existe a string bulder replace, sb.replace("......", "......"), mas no meu código não sei como poderei tratar isto.

http://img802.imageshack.us/img802/3667/scriptp.jpg

O código que tenho é o seguinte:

Private Sub okButton_Clik(ByVal sender As Object, _
ByVal e As EventArgs) Handles okButton.Click
Dim mensagem, titulo, valorDefeito As String
Dim meuValor As Object
Dim contagemLinhas As Integer = tabelaDataGridView.RowCount - 1 'Dá-me o numero de linhas
Dim sb As New StringBuilder
Dim var1 As String = "int"
Dim var2 As String = "Null"
Dim var3 As String = "Not Null"
Dim var4 As String = "Auto_Increment"
Dim var5 As String = "Primary Key"
' Envio prompt.
mensagem = "Entre um nome para a tabela:"
' Define titulo.
titulo = "Nome da Tabela:"
valorDefeito = "Teste" ' Define valor por defeito
' Mostra mensagem, titulo, e valor por defeito.
meuValor = InputBox(mensagem, titulo, valorDefeito)
' Se o utilizador clica em Cancel, atribui o valor por defeito à variável myValue
If meuValor Is "" Then meuValor = valorDefeito
sb.AppendFormat("CREATE TABLE {0}", meuValor)
sb.AppendLine()
sb.Append("(")
For Each M As DataGridViewRow In tabelaDataGridView.Rows
 If M.IsNewRow Then Exit For
 If M.Cells(2).Value = True Then
sb.Append(M.Cells(0).Value.ToString)
sb.Append(" ")
sb.Append(M.Cells(1).Value.ToString)
sb.Append(" ") sb.AppendFormat("{0}, ", var2)
sb.AppendLine()
 ElseIf M.Cells(3).Value = "É Chave!" Then
sb.Append(M.Cells(0).Value.ToString)
sb.Append(" ")
sb.AppendFormat("{0} ", var1)
sb.AppendFormat("{0} ", var3)
sb.AppendFormat("{0} ", var4)
sb.AppendFormat("{0}, ", var5)
sb.AppendLine()
 ElseIf M.Cells(2).Value = False Then
sb.Append(M.Cells(0).Value.ToString)
sb.Append(" ")
sb.Append(M.Cells(1).Value.ToString)
sb.Append(" ")
sb.AppendFormat("{0}, ", var3)
sb.AppendLine()
 End If
 Me.Label1.Text = sb.ToString
Next
sb.Append(")")
Me.Label1.Text = sb.ToString
End Sub

Alguém me pode ajudar?

Edited by Caça
GeSHi
Link to comment
Share on other sites

Não deu 😞 ou não consegui. Talvez possas concretizar tendo em conta o código que apresento.

Para já resolvi da seguinte forma:

sb.Append(")")

sb.Replace(",)", ")")

Ou seja, insiro o parentesis junto à última virgula e procuro a string ",)" e substituo por ")". No entanto preferia a tua solução...

Abraço e obrigado

Link to comment
Share on other sites

Tipo isto

Private Sub okButton_Clik(ByVal sender As Object, _
ByVal e As EventArgs) Handles okButton.Click
GeraScript()
End Sub


Private Sub GeraScript()
Dim mensagem, titulo, valorDefeito As String
Dim meuValor As Object
Dim contagemLinhas As Integer = tabelaDataGridView.RowCount - 1 'Dá-me o numero de linhas
Dim sb As New StringBuilder
Dim var1 As String = "int"
Dim var2 As String = "Null"
Dim var3 As String = "Not Null"
Dim var4 As String = "Auto_Increment"
Dim var5 As String = "Primary Key"
' Envio prompt.
mensagem = "Entre um nome para a tabela:"
' Define titulo.
titulo = "Nome da Tabela:"
valorDefeito = "Teste" ' Define valor por defeito
' Mostra mensagem, titulo, e valor por defeito.
meuValor = InputBox(mensagem, titulo, valorDefeito)
' Se o utilizador clica em Cancel, atribui o valor por defeito à variável myValue
If meuValor Is "" Then meuValor = valorDefeito
sb.AppendFormat("CREATE TABLE {0}", meuValor)
sb.AppendLine()
sb.Append("(")
For Each M As DataGridViewRow In tabelaDataGridView.Rows
  If M.IsNewRow Then Exit For
  If M.Cells(2).Value = True Then
  sb.Append(M.Cells(0).Value.ToString)
  sb.Append(" ")
  sb.Append(M.Cells(1).Value.ToString)
  sb.Append(" ") sb.AppendFormat("{0}, ", var2)
  sb.AppendLine()
  ElseIf M.Cells(3).Value = "É Chave!" Then
  sb.Append(M.Cells(0).Value.ToString)
  sb.Append(" ")
  sb.AppendFormat("{0} ", var1)
  sb.AppendFormat("{0} ", var3)
  sb.AppendFormat("{0} ", var4)
  sb.AppendFormat("{0}, ", var5)
  sb.AppendLine()
  ElseIf M.Cells(2).Value = False Then
  sb.Append(M.Cells(0).Value.ToString)
  sb.Append(" ")
  sb.Append(M.Cells(1).Value.ToString)
  sb.Append(" ")
  sb.AppendFormat("{0}, ", var3)
  sb.AppendLine()
  End If
  Me.Label1.Text = sb.ToString
Next
sb.Append(")")
Me.Label1.Text = sb.ToString
End Sub
Edited by Caça

Pedro Martins

Não respondo a duvidas por PM

Link to comment
Share on other sites

Pensei que te referias a algo mais rebuscado 🙂

Bem, está feito o que pretendia. Vou continuar a fazer o resto da aplicação.

Agradeço-te muito. Muito obrigado 👍

P. S.: Não sei como colocar este tópico como resolvido.

Edited by arrelialp
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.