arrelialp Posted March 20, 2012 at 03:40 PM Report #444764 Posted March 20, 2012 at 03:40 PM 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á.
renafi Posted March 20, 2012 at 08:19 PM Report #444810 Posted March 20, 2012 at 08:19 PM 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
arrelialp Posted April 17, 2012 at 01:23 PM Author Report #449524 Posted April 17, 2012 at 01:23 PM 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?
Caça Posted April 17, 2012 at 01:31 PM Report #449526 Posted April 17, 2012 at 01:31 PM 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
Caça Posted April 17, 2012 at 03:54 PM Report #449554 Posted April 17, 2012 at 03:54 PM 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
arrelialp Posted May 14, 2012 at 05:54 PM Author Report #455524 Posted May 14, 2012 at 05:54 PM 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...
Tuntankamon Posted May 15, 2012 at 09:09 AM Report #455664 Posted May 15, 2012 at 09:09 AM 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.
arrelialp Posted May 15, 2012 at 10:38 AM Author Report #455686 Posted May 15, 2012 at 10:38 AM (edited) Alterado pois o post seguinte está já actualizado Edited May 17, 2012 at 12:07 PM by arrelialp GeSHi
arrelialp Posted May 17, 2012 at 11:50 AM Author Report #456365 Posted May 17, 2012 at 11:50 AM (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 at 12:59 PM by Caça GeSHi
Caça Posted May 17, 2012 at 01:01 PM Report #456376 Posted May 17, 2012 at 01:01 PM Para remover a ultima virgula de uma string S = S.Remove(S.LastIndexOf(","), 1) Pedro Martins Não respondo a duvidas por PM
arrelialp Posted May 17, 2012 at 02:28 PM Author Report #456403 Posted May 17, 2012 at 02:28 PM 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
Caça Posted May 17, 2012 at 02:46 PM Report #456413 Posted May 17, 2012 at 02:46 PM No teu caso seria assim Sb.Remove(Sb.ToString.LastIndexOf(","), 1) Pedro Martins Não respondo a duvidas por PM
arrelialp Posted May 17, 2012 at 03:19 PM Author Report #456421 Posted May 17, 2012 at 03:19 PM 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
Caça Posted May 17, 2012 at 03:20 PM Report #456424 Posted May 17, 2012 at 03:20 PM Função como? Queres criar uma função com esse código? Pedro Martins Não respondo a duvidas por PM
arrelialp Posted May 17, 2012 at 04:07 PM Author Report #456443 Posted May 17, 2012 at 04:07 PM 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."
Caça Posted May 17, 2012 at 04:10 PM Report #456445 Posted May 17, 2012 at 04:10 PM (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 at 04:10 PM by Caça Pedro Martins Não respondo a duvidas por PM
arrelialp Posted May 18, 2012 at 08:54 AM Author Report #456596 Posted May 18, 2012 at 08:54 AM (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 at 08:55 AM by arrelialp
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