PARÂMETROS DO SQL USANDO ARRAY
Pessoal, há algum tempo atrás eu vi algo parecido com o que gostaria de fazer, porém não me recordo onde vi e não encontrei mais.
Eu tenho um método que Insere um registro na tabela. Queria que ele fosse genérico, parametrizado quando fosse acessá-lo.
Neste caso, eu indico o nome da tabela, dos campos da tabela, e dos valores que serão inseridos.
Desta maneira:
private void Inserir(string tabela, string campos, string valores).
Só que eu gostaria de saber como faço para pegar todos os campos da tabela e os valores que serão adicionados, colocando em array. Ficaria assim:
private void Inserir(string tabela, string[] campos, string[] valores)
Agora o comando que receberá esses valores:
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = [Ô]Insert Into {0} ({1}) Values ({2})[Ô];
cmd.CommandText = string.Format(cmd.CommandText, tabela, campos, valores);
Pois a minha dúvida é como fazer esse comando funcionar. Como pegar cada campo e cada valor das arrays para adicionar na tabela?
Eu tenho um método que Insere um registro na tabela. Queria que ele fosse genérico, parametrizado quando fosse acessá-lo.
Neste caso, eu indico o nome da tabela, dos campos da tabela, e dos valores que serão inseridos.
Desta maneira:
private void Inserir(string tabela, string campos, string valores).
Só que eu gostaria de saber como faço para pegar todos os campos da tabela e os valores que serão adicionados, colocando em array. Ficaria assim:
private void Inserir(string tabela, string[] campos, string[] valores)
Agora o comando que receberá esses valores:
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = [Ô]Insert Into {0} ({1}) Values ({2})[Ô];
cmd.CommandText = string.Format(cmd.CommandText, tabela, campos, valores);
Pois a minha dúvida é como fazer esse comando funcionar. Como pegar cada campo e cada valor das arrays para adicionar na tabela?
No MySql existe um comando que pega todos os campos de determinada tabela
Mas já percebi que você está utilizando o Access! rsrsrs
Em todo caso, você pode fazer isso usando a orientação a objetos. Criando classes que [Ô]mapeie[Ô] (não se se é esse o termo! rsrsrs) o banco. A famosa persistencia.
show columns from tabela
Mas já percebi que você está utilizando o Access! rsrsrs
Em todo caso, você pode fazer isso usando a orientação a objetos. Criando classes que [Ô]mapeie[Ô] (não se se é esse o termo! rsrsrs) o banco. A famosa persistencia.
Amigo, você é um caso clássico! Você quer fazer EXATAMENTE o que ensino nos meus vÃdeos sobre Reflection. São 5 vÃdeos apenas, assista-os, preste atenção e vai entender.
sera q por acaso na programação do aidioda vc quer algo assim?
ta em vb, mas acho q da pra pegar a ideia....
Public Sub Alterar()
Dim sql As String = [Ô][Ô]
Dim parametrosNomes(3) As String
parametrosNomes(0) = [Ô]@Nome[Ô]
parametrosNomes(1) = [Ô]@Situacao[Ô]
parametrosNomes(2) = [Ô]@Saida[Ô]
parametrosNomes(3) = [Ô]@id[Ô]
Dim parametrosValores(3) As String
parametrosValores(0) = mNome
parametrosValores(1) = mSituacao
parametrosValores(2) = Format(mSaida, [Ô]yyyy-MM-dd[Ô])
parametrosValores(3) = mID
sql = [Ô]Update alunos set nome=@nome,situacao=@situacao,saida=@saida where id=@id[Ô]
CRUD(sql, parametrosNomes, parametrosValores)
End Sub
Public Function CRUD(ByVal sql As String, ByVal parameterNames() As String, ByVal parameterVals() As String) As Integer
Using connection As MySqlConnection = AbreConexao()
Using command As New MySqlCommand(sql, connection)
FillParameters(command, parameterNames, parameterVals)
Return command.ExecuteNonQuery()
End Using
End Using
End Function
Private Sub FillParameters(ByVal command As MySqlCommand, ByVal parameterNames As String(), ByVal parameterVals As String())
If parameterNames IsNot Nothing Then
For i = 0 To parameterNames.Length - 1
command.Parameters.AddWithValue(parameterNames(i), parameterVals(i))
Next
End If
End Sub
ta em vb, mas acho q da pra pegar a ideia....
Consegue sim, e muito melhor, basta ver os vÃdeos que indiquei no link, eles mostram passo a passo como fazer com que a integração com banco de dados seja totalmente automática.
eu to com uma ideia sobre webapi, q quero ver se da certo.....
tudo de tanto vc (kerplunk) falar, já fiz um pré inicio, mas agora to seguindo direitinho dos vÃdeos......
tudo de tanto vc (kerplunk) falar, já fiz um pré inicio, mas agora to seguindo direitinho dos vÃdeos......
Eu falei poro Kerplunk que eu tô perdidinho igual ao Idyoda.
é isso que dá a gente aprender da maneira errada. Aà quando tem que aprender tudo de novo é complicado, ainda mais nessa idade.
Ainda junta o tempo que também é complicado..... e por aà vai.
Mas obrigado mais uma vez pelo conselho. Vou tentar estudar tudo de novo. Vamos ver se agora vai, né?
é isso que dá a gente aprender da maneira errada. Aà quando tem que aprender tudo de novo é complicado, ainda mais nessa idade.
Ainda junta o tempo que também é complicado..... e por aà vai.
Mas obrigado mais uma vez pelo conselho. Vou tentar estudar tudo de novo. Vamos ver se agora vai, né?
Então, Kerplunk, estou [Ô]brigando[Ô] um pouquinho com os métodos da classe BackWork, mais precisamente com o método Next para inclusão de novo registro.
Acontece que quando na tabela já existe algum registro, ele funciona certinho, porém quando a tabela está vazia, ocorre o erro da imagem.
Se na tabela não há registros, o dr.HasRows não era para estar false? Não era nem pra entrar nesta condição.
Onde será que estou errando?
Acontece que quando na tabela já existe algum registro, ele funciona certinho, porém quando a tabela está vazia, ocorre o erro da imagem.
Se na tabela não há registros, o dr.HasRows não era para estar false? Não era nem pra entrar nesta condição.
Onde será que estou errando?
Bom, como sempre, eu posto a dúvida e vou tentando, pesquisando.... não espero as respostas caÃrem do céu.
Consegui, alterando algumas linhas no método:
Verifico se o ExecuteScalar for DbNull é porque não retornou nenhum dado, então a tabela está vazia, senão, vai pegar o último registro.
Consegui, alterando algumas linhas no método:
public Int32? Next()
{
Int32? _return = 0;
using (OleDbConnection conexao = new OleDbConnection([Ô]Provider=Microsoft.Jet.OleDb.4.0;Data Source=[Ô] + Application.StartupPath + [Ô]\\Teste.mdb[Ô]))
{
try
{
conexao.Open();
}
catch (Exception)
{
throw;
}
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = conexao;
cmd.CommandText = [Ô]Select Max({0}) + 1 From {1}[Ô];
PropertyInfo pro = (PropertyInfo)typeof(T).GetProperties().ToList().FirstOrDefault(
p => p.GetCustomAttribute(typeof(DataObjectFieldAttribute)) != null);
cmd.CommandText = string.Format(cmd.CommandText, pro.Name, typeof(T).Name);
[txt-color=#e80000] if (IsDBNull(cmd.ExecuteScalar()))
{
_return = 1;
}
else
{
using (OleDbDataReader dr = cmd.ExecuteReader())
{
dr.Read();
_return = dr.GetInt32(0);
}
}
[/txt-color] }
}
return _return;
}
Verifico se o ExecuteScalar for DbNull é porque não retornou nenhum dado, então a tabela está vazia, senão, vai pegar o último registro.
Muito, mas muito bom mesmo! Isso aÃ, faz parte de um dos vÃdeos (bem)mais à frente, onde vamos trabalhar com TDD e essa era uma das falhas que eu esperava! Você realmente aprendeu e isso me traz um sentimento de satisfação muito grande! é para isso que estou fazendo os vÃdeos! Meus parabéns mesmo!
Você foi ainda mais além! Adaptou para utilizar objetos OleDb ao invés de nativos Sql! Nossa, estou mesmo bem contente!
Você foi ainda mais além! Adaptou para utilizar objetos OleDb ao invés de nativos Sql! Nossa, estou mesmo bem contente!
Essa classe Backwork, ainda vai sofrer várias alterações para ficar mais estável e mais precisa. Uma das coisas que serão mudadas, é a linha logo acima, onde crio a variável [Ô]pro[Ô]. Aquela linha presume que a primeira propriedade da classe é necessariamente a chave primária, o que pode não ser o caso sempre. Então isso é uma das coisas que vai ser mudada. Vamos criar um método de extensão para reflection. Um deles é o que retorna a propriedade correspondente à chave primária certinho. Também teremos atributos personalizados que farão a ligação entre cliente e contatos. Você pega uma instância de cliente e os contatos vêm junto. Isso também será melhorado, com o uso de Lazy<T>. E ainda a construção de uma aplicação web, puramente feita em HTML, como já mostrei, com o uso da JEasyUI.
Tópico encerrado , respostas não são mais permitidas