arrelialp Posted March 20, 2012 Report Share Posted March 20, 2012 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 More sharing options...
renafi Posted March 20, 2012 Report Share Posted March 20, 2012 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 More sharing options...
arrelialp Posted April 17, 2012 Author Report Share Posted April 17, 2012 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 More sharing options...
Caça Posted April 17, 2012 Report Share Posted April 17, 2012 Sim, só tens de criar uma função que te gere o script a partir do que está na Grid. Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
Caça Posted April 17, 2012 Report Share Posted April 17, 2012 Isso são coisas que tens de verificar com um simples if no momento em que estás a adicionar o campo, tipo If M.Cells(2).Value = True 'Nulo Else 'Não nulo End If 1 Report Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
arrelialp Posted May 14, 2012 Author Report Share Posted May 14, 2012 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 More sharing options...
Tuntankamon Posted May 15, 2012 Report Share Posted May 15, 2012 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 More sharing options...
arrelialp Posted May 15, 2012 Author Report Share Posted May 15, 2012 (edited) Alterado pois o post seguinte está já actualizado Edited May 17, 2012 by arrelialp GeSHi Link to comment Share on other sites More sharing options...
arrelialp Posted May 17, 2012 Author Report Share Posted May 17, 2012 (edited) 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 May 17, 2012 by Caça GeSHi Link to comment Share on other sites More sharing options...
Caça Posted May 17, 2012 Report Share Posted May 17, 2012 Para remover a ultima virgula de uma string S = S.Remove(S.LastIndexOf(","), 1) Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
arrelialp Posted May 17, 2012 Author Report Share Posted May 17, 2012 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 More sharing options...
Caça Posted May 17, 2012 Report Share Posted May 17, 2012 No teu caso seria assim Sb.Remove(Sb.ToString.LastIndexOf(","), 1) Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
arrelialp Posted May 17, 2012 Author Report Share Posted May 17, 2012 Deu! 👍 Obrigado. Podias-me dizer como é que eu poderia utilizar uma função, no código que apresento para a criação da script e chamá-la depois no procedimento ok_Button.Click Link to comment Share on other sites More sharing options...
Caça Posted May 17, 2012 Report Share Posted May 17, 2012 Função como? Queres criar uma função com esse código? Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
arrelialp Posted May 17, 2012 Author Report Share Posted May 17, 2012 Sim, em vez de o colocar dentro do procedimento. Chamaria a função no procedimento. Citando-te: "Sim, só tens de criar uma função que te gere o script a partir do que está na Grid." Link to comment Share on other sites More sharing options...
Caça Posted May 17, 2012 Report Share Posted May 17, 2012 (edited) 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 May 17, 2012 by Caça Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
arrelialp Posted May 18, 2012 Author Report Share Posted May 18, 2012 (edited) 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 May 18, 2012 by arrelialp Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now