Jump to content
Leodellari

Inserir/alterar dados de tabela especificando o número da linha e da coluna

Recommended Posts

Leodellari

Boa noite,

Este é o meu primeiro tópico aqui. Sou iniciante em programação. Não sei se minha dúvida é muito iniciante, mas meu conhecimento é muito pouco.

Eu queria saber se tem como inserir dados em uma tabela do SQL Server especificando o número da linha e da coluna (como no VBA com o Cells(4, 2)). 

Encontrei um link ( https://msdn.microsoft.com/pt-br/library/tat996zc.aspx?f=255&MSPPError=-2147217396 ) que apresenta algumas maneiras de alterar dados especificando o número da linha e da coluna, mas não estou conseguindo aplicar. Alguém poderia me dar um exemplo, ou me apresentar algum link da internet que contenha algum exemplo um pouco mais detalhado que do link?

Share this post


Link to post
Share on other sites
M6

Antes de mais é necessário compreenderes que a base de dados por detrás não tem nada a ver com o VB.Net nem com qualquer data grid.

A base de dados, nesse caso o SQL Server, armazena dados, guarda-os para que possam ser usados mais tarde.

O VB.Net permite-te criar aplicações que, de entre outras coisas, podem ler e escrever dados numa base de dados.

Quando fazes uma ligação da tua aplicação a uma base de dados (seja ela qual for), consegues usar os componentes do VB.Net para visualizar e manipular esses dados. Na plataforma .Net normalmente tens um dataset (conjunto de dados) onde os dados estão representados como um array e acedes à informação de forma posicional (por índice e/ou por nome). Desta forma, atualizar uma coordenada de linha/coluna no SQL Server a partir da tua aplicação é totalmente possível, uma vez que isso é uma representação de um array bidimensional.

Para te podermos ajudar mais, tens de ser mais claro e concreto no erro ou problema que estás a ter.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Leodellari

Olá M6. Eu não estou com um problema bem definido ainda. Tenho a ideia de algo que quero fazer, porém não sei como fazer. Eu vou dizer abaixo o que pretendia fazer.

Eu criei o tópico pensando mais em receber um exemplo, como o link que o Chamuanza postou. Obrigado Chamuanza!

Estou fazendo um programinha que necessita ter uma base de dados. Por enquanto, em meu projeto, o método para inserir dados declarando uma string (sql = "INSERT INTO Tabela(ColA, ColB, ColC) VALUES(@A, @B, @C)") está me sendo útil, pois eu sei o número de colunas que tenho na tabela. Porém, mais para frente terei que criar uma tabela com um número indeterminado de linhas e colunas. Terei que armazenar os valores de uma matriz n x n, onde o valor de n irá depender do número de linhas que tenho em uma outra tabela (se na tabela 1 tiver 2 linhas, n = 9, se na tabela 1 eu tiver 6 linhas, n = 21). É ai que começa o meu problema, pois, quando declaro a string sql, o número de colunas que declaro é um número fixo (não consigo, no exemplo acima, acrescentar a ColD e a ColE de forma automática). Poderia tentar adicionar um valor por vez (sql = "INSERT INTO Tabela("' & Col & '") VALUE("' & Letra & '")), colocando um loop For i = 0 To n, For j = 0 To n. Porém pensei que poderia haver um método mais simples.

Direi de uma maneira leiga o que eu entendi sobre acesso ao banco de dados: eu declaro a conexão; através da string sql eu digo as colunas da tabela que vou editar/atualizar e digo os valores que irei acrescentar; no comando command eu consigo dizer qual a conexão, e através da string dizer em qual tabela desejo inserir os dados e quais dados desejo inserir; por último eu e abro a conexão e através do command.ExecuteNonQuery() eu consigo inserir os dados (sendo que o command do command.ExecuteNonQuery traz em si os dados e a conexão). O exemplo do link que o Chamuanza postou segue a mesma ideia.

No link que postei, eu vi um exemplo que não consegui aplicar ( DataSet1.Tables(0).Rows(4).Item(0) = "Updated Company Name" ). Neste exemplo do link, até onde eu entendi, não seria necessário declarar uma string sql para realizar a alteração ou inserção dos dados na tabela, mas está dando erro. Quando insiro o nome do meu dataset ele aparece grifado de vermelho, dizendo que não referenciei o objeto. Quando referencio o meu DataSet, o grifado vermelho sai, porém o código não executa (aparece o seguinte erro: System.NullReferenceException: 'Referência de objeto não definida para uma instância de um objeto.'). Até agora não encontrei nenhum exemplo que realize a alteração dos dados na tabela dessa maneira, então estou um pouco perdido e sem saber o que fazer. Ainda não tenho nem a certeza se seria desnecessário declarar uma string sql. 

Share this post


Link to post
Share on other sites
M6

Boas.

Para resolveres o teu problema (se bem o compreendi) tens duas abordagens clássicas.

  1. Fazes uma introespeção ao modelo e vês quais os tipos de dados. Ou seja, vais ler os metadados da tabela para saberes quais as colunas que existem, o seu nome e tipo de dados.
  2. Usas uma tabela como meta-modelo, por exemplo, do tipo "Chave", "Valor".

 

  • Vote 1

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Leodellari

Boa tarde,

Eu vou tentar explicar de novo o que eu estou fazendo. Não sei se me expressei bem pois estou com muitas dúvidas. Mas uma delas eu já consegui uma solução (consegui programar para que fosse criado um número indeterminado de colunas em uma tabela). Serei mais detalhista sobre o meu projeto, talvez assim fique um pouco mais fácil de visualizar a minha dúvida.

Estou montando um programa para calcular vigas. O usuário deverá fornecer o número de barras e algumas outras informações sobre a viga, e apertar o botão calcular serão gerados os resultados. Cada barra inserida é armazenada em uma linha de uma tabela DadosViga (3 barras = 3 linhas preenchidas). O que deverá fazer o botão calcular: a cada linha preenchida na tabela DadosViga, deverá ser gerada uma matriz 6x6, em uma outra tabela (esta etapa eu consegui desenvolver); será realizada a soma de alguns valores dessas matrizes 6 x 6, e os resultados serão armazenados em uma nova matriz (em uma nova tabela) de ordem n x n; esses valores da matriz n x n deverão ser reorganizados e armazenados uma nova matriz de ordem n x n (exemplo: a linha 3, coluna 4 da matriz n x n será a linha 1, coluna 2 da nova matriz n x n); algumas outras operações são realizadas, todas sem que o usuário do programa interfira no processo, e os resultados são fornecidos ao usuário. Imaginando aqui que essa matriz n x n pode chegar a uma ordem de 50 x 50 (50 linhas e 50 colunas), e que cada valor deverá ser colocado em uma nova posição de uma matriz, então, utilizando as strings (sql = ""UPDATE Matriz2 SET ... ") eu teria que fazer 50x50 = 2500 conexões (2500 conexao.Open(), com.ExecuteNonQuery, conexao.Close()), visto que cada valor deve ser colocado em uma nova posição na nova matriz. Pensando nessas 2500 conexões que deverão ser realizadas, eu pensei em perguntar se não teria uma maneira de abrir a conexão uma única vez para reorganizar todos esses valores, sem que fosse necessário declarar 2500 strings (faria isso com um loop For i = 0 To n, claro, não escreveria essas 2500 strings). E havia pensado em fazer isso especificando o número da linha e o número da coluna (e não o nome da coluna).

Criar o número "n" de colunas eu já consegui. Eu coloquei um loop For i = 1 To n para criar as colunas e deu certo. Eu estou criando uma tabela via código com apenas uma coluna, e separadamente eu crio as outras colunas necessárias. O "n" é uma variável em função do número total de colunas. Estou criando uma coluna por vez. Vou nomear as colunas de 0 a n, e assim consigo programar para encontrar os valores mais facilmente.

 For i = 1 To n
            sqlColunas = "ALTER TABLE VetorForcas ADD [" & i & "] nvarchar(50) NULL"
            conexao = New SqlConnection(strConexao)
            com = New SqlCommand(sqlColunas, conexao)

            Try
                conexao.Open()
                com.ExecuteNonQuery()
                conexao.Close()
                conexao.Dispose()
            Catch ex As Exception
                Throw ex
            End Try

        Next i

 

Share this post


Link to post
Share on other sites
Leodellari

Utilizando o "Parameter.Add()" do link que o Chamuanza postou, eu poderia criar alguns Loops para inserir toda uma linha de uma única vez (o número de conexões cairia para 50, já seria um avanço comparado aos 2500 ou mais). Mas estou pensando se não tem uma maneira de fazer isso com uma única conexão. Reorganizar cada valor de uma tabela (matriz) de ordem n x n em uma nova tabela (matriz) de ordem também n x n. Por exemplo, o valor da linha 0, coluna 0 passaria a ser linha 6, coluna 8, o valor da linha 1, coluna 2 passaria a ser, na nova tabela (matriz) a posição linha 10, coluna 3, e assim sucessivamente para cada valor da tabela (matriz), até que todos os valores fossem recolocados em novas posições.

Share this post


Link to post
Share on other sites
Leodellari

Boa noite,

Obrigado M6 e Chamuanza. Acho que consegui a resposta para o meu problema. Eu vi que é possível inserir mais de uma linha de uma vez, basta colocar uma vírgula depois da linha com valores e fornecer novos valores. E também lembrei de algo que vi em algum tópico que me foi útil, que é a utilização do & para juntar strings. Assim eu consigo adicionar mais colunas na string sql se eu quiser. Consigo adicionar mais linhas também. Nesse código criei um banco de dados (tenho que verificar se o endereço bin/debug da pasta realmente é o correto, ou se devo criar esse banco de dados na pasta do projeto, talvez abra um novo tópico) com 8 colunas. Mas substituindo o 7 por "n" eu consigo criar um número indeterminado de colunas, e consigo adicionar um número indeterminado de linhas abrindo apenas uma conexão. Obrigado pela força!

PS: Não sei se há a necessidade de colocar aquele vbCrLf onde ele está, mas depois descubro isso.

sql = "[" & i & "] nvarchar(50) NULL"
        For i = 1 To 7
            sql = sql & ", [" & i & "] nvarchar(50) NULL"
        Next

        sqlCriaTabela = "USE [C:\USERS\AMARILIS\SOURCE\REPOS\PROGRAMA VIGAS\PROGRAMA VIGAS\BIN\DEBUG\DADOSVIGA.MDF]" & vbCrLf & "CREATE TABLE VetorForcas(" & sql & ")"

        conexao = New SqlConnection(strConexao)
        com = New SqlCommand(sqlCriaTabela, conexao)

        Try
            conexao.Open()
            com.ExecuteNonQuery()
            conexao.Close()
            conexao.Dispose()
        Catch ex As Exception
            Throw ex
        End Try

 

  • Vote 1

Share this post


Link to post
Share on other sites
Leodellari

Mas se houver outra maneira para inserir varias linhas e colunas ao mesmo tempo, abrindo uma única conexão, eu fico grato se me apresentarem.

Share this post


Link to post
Share on other sites
M6

Independentemente de já teres ultrapassado a questão que te levou a abrir o tópico, acho que tens um erro de modelagem na base de dados.

Não tens/deves criar colunas deves sim ter uma tabela com o valor de cada viga para cada coordenada.4 colunas resolvem o problema:

matrix(id da viga; coordenada x; coordenada y; valor)

Esta estrutura é a correta e contempla todas as tuas necessidade, independentemente do tamanho necessário das matrizes.

 

  • Vote 1

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Leodellari

Boa tarde M6,

Pensei ter te respondido já,as estou vendo aqui que não.

Entendi o seu posicionamento. A tabela que irá conter os dados das barras possui um número fixo de colunas, com algumas propriedades geométricas e propriedades do material. Comprimento, módulo de elasticidade, momento de inércia etc.

A tabela que terá um número indeterminado de colunas é a tabela da matriz de rigidez. Esse número de colunas depende do número de barras inseridas (cada barra ocupa uma linha da tabela).

Share this post


Link to post
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

×
×
  • 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.