Array
(
)

Carregar datatable por um array

Pjava
   - 21 mai 2012

Tenho um array que recebe valores do BD. Como eu faço para carregar um DT com dados provenientes desse array?

Joel Rodrigues
   - 21 mai 2012

Você deve fazer um loop no array e, para cada elemento, criar um DataRow e adicionar à tabela. O DataTable possui uma propriedade Rows que permite a inserção de novas linhas.

Pjava
   - 21 mai 2012

html,body{padding:0;margin:0;font-family:Verdana,Geneva,sans-serif;background:#fff;}html{font-size:100%}body{font-size:.75em;line-height:1.5;padding-top:1px;margin-top:-1px;}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em}h3{font-size:1.16em}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.7em}p{margin:0 0 1em;padding:0 .2em}.t-marker{display:none;}.t-paste-container{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}ul,ol{padding-left:2.5em}a{color:#00a}code, pre{font-size:1.23em}
O que passa é que minha lista está vindo vazia. Na construção do gráfico ela é preenchida, mas depois quando vou carregar a tabela com os mesmos valores da construção do gráfico, a lista vem vazia. Abaixo os meus códigos:

protected void Page_Load(object sender, EventArgs e)
{
lblTitulo.Text = TRANSAÇÕES NEGADAS - CRÉDITO;

int codUsuario = 123;

TransacoesNegadasPorMotivoBL bl = new TransacoesNegadasPorMotivoBL();
bl.Mes = Request.QueryString[Mes].ToString();
bl.Execute(codUsuario);

.................

//Código que conastroem os gráficos

....................

//E aqui eu faço a chamada a lista. Nesse momento ela vem cheia, com dados

chartSeries1.SetValues(bl.listaTransacoes.ToArray());
chartSeries1.PlotArea.XAxis.AddRange(1, bl.listaDescricao.Count, 1);//Aqui minha lista listaDescricao possui valores(Count > 0)

for (int i = 0; i < bl.listaDescricao.Count; i++)
{
chartSeries1.PlotArea.XAxis[i].TextBlock.Text = bl.listaDescricao[i];
}

//Abaixo eu populo a tabela. A lista bl.listaDescricao vem vazia. Nesse ponto ela é chamada pela segunda vez

private void RetornoDS()
{
bl.Execute(codUsuario);//Método que carrega do BD - Nesse momento eu o chamo pelka segunda vez

DataTable dt = dsVerDados.Tables.Add(dtVerDados1);
DataColumn col1 = dt.Columns.Add(Cód., Type.GetType(System.Int32));
col1.Caption = Cód;
DataColumn col2 = dt.Columns.Add(Descrição, Type.GetType(System.String));
col2.Caption = Descrição;
col2.AllowDBNull = true;
DataColumn col3 = dt.Columns.Add(Qtde, Type.GetType(System.Int32));
col3.Caption = Qtde;
col3.AllowDBNull = true;
DataColumn col4 = dt.Columns.Add(%, Type.GetType(System.String));
col4.Caption = %;
col4.AllowDBNull = true;

for (int i = 0; i <= bl.listaDescricao.Count; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i;
dr[1] = bl.listaDescricao[i]; //Lorem Ipsum sit est dolor;
dr[2] = 1;// bl.listaTransacoes.ToArray();
Random rnd = new Random();
dr[3] = rnd.Next(0, 100);
dt.Rows.Add(dr);
}

DataRow drTotal = dt.NewRow();
drTotal[0] = DBNull.Value;
drTotal[1] = DBNull.Value;
drTotal[2] = DBNull.Value;
drTotal[3] = 100%;
dt.Rows.Add(drTotal);

dsVerDados.Tables.Clear();
dsVerDados.Tables.Add(dt);

DsRetorno = dsVerDados;

}

Aqui, minha classe de conexão ao banco. Suprimi o select para não ficar extenso essa thread. O select funciona. A lista é preenchida, mas vai vazia. Isso somente qdo é chamada pela segunda vez. Aqui ela é preenchida, mesmo pela segunda vez, mas não consegui ver onde ela é esvaziada.

OracleConnection oracleConexao = new OracleConnection();
oracleConexao.ConnectionString = ConfigurationManager.ConnectionStrings[ConexaoPortalEC].ConnectionString;

this.comando = new OracleCommand(comandoSQL.ToString(), oracleConexao);
try
{
oracleConexao.Open();
comando.ExecuteNonQuery(); OracleDataReader dr = comando.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
string descricao = dr[LEGENDA].ToString();
double soma_total = Convert.ToDouble(dr[QTD]);

listaTransacoes.Add(soma_total);
listaDescricao.Add(descricao);
}
}

}
catch (Exception excecao)
{
Erro = excecao.Message;
}
finally
{
oracleConexao.Close();
}

comando.Dispose();

Pjava
   - 21 mai 2012

Falei uma besteira e estou corrigindo. Na linha(pela segunda vez)comando.ExecuteNonQuery(); ele não vai para a linha seguinte(OracleDataReader dr = comando.ExecuteReader();) Ele pula direto para o catch, o que explica a lista não estar sendo carregada. Agora, porque ele pula para o catch, se na primeira vez(carregando o gráfico) ele faz todo o processo certinho?

Pjava
   - 21 mai 2012

Descobri o erro e agora preciso resolver. Eu tenho uma variável pública chamada mes. No page_load do gráfico, ela é carregada e é passada como parâmetro para a query. Acontece, que na chamada do grid, essa variável não é carregada, fazendo com que a query seja executada, mas com erros o que cai no catch. Bem, eu tenho duas classes que são declaradas como public partial class.... Isso não permite com que eu carregue essa variável, pois não possuo visibilidade, devido a ser uma partial class. Na classe do grá fico eu carrego ela. Ela é alimentada com valores vindos do aspx, dessa forma:

bl.Mes = Request.QueryString[Mes].Tostring();]

Onde bl é a variável que vem da classe da query do banco. Na chamada da tabela, eu preciso carregar esse Mes e não estou sabendo como. Como instanciar uma classe partial class? Ou um Go Horse bem feito, também vale,rs.