PARÂMETROS DO SQL USANDO ARRAY

PERCIFILHO 03/03/2016 15:29:05
#458581
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?


ACCIOLLY 03/03/2016 16:33:30
#458589
No MySql existe um comando que pega todos os campos de determinada tabela

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.
KERPLUNK 03/03/2016 18:49:45
#458601
Resposta escolhida
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.
NICKOSOFT 03/03/2016 19:44:58
#458606
sera q por acaso na programação do aidioda vc quer algo assim?
  
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....
KERPLUNK 03/03/2016 20:30:46
#458608
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.
NICKOSOFT 04/03/2016 07:21:38
#458621
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......
PERCIFILHO 04/03/2016 07:27:13
#458622
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é?
PERCIFILHO 04/03/2016 10:33:16
#458626
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?
PERCIFILHO 04/03/2016 12:58:24
#458641
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:

        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.

KERPLUNK 04/03/2016 21:18:12
#458670
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!
KERPLUNK 04/03/2016 21:28:37
#458671
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.
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas