Funzionamento errato programma in c# che utilizza databases access

mercoledì 21 ottobre 2009 - 23.51

ANDREAR12 Profilo | Newbie

Salve.

ho problemi nell'interrogazione del database nel form 3 richiamabile tramite il pulsante visualizza del form1.
il problema consiste nel fatto che delle volte, quando vado a richiamare dei dati dal database, con un query, a volte mi restituisce i dati e a volte no.

ho anche problemi nei pulsanti di importazione ed esportazione dei dati.

perfavore datemi una mano.

Andrea.

ysdemarc Profilo | Expert

non capisco..usi access e ti interfacci con .net o usi le form di access?

per il primo caso comunque sia , a parte che le queries possono essere giuste o meno, sappi che access è di verso ad esempio di sql server anche nella sintassi sql..

ad esempio se devo fare una like in sql server di solito scrivo NOME LIKE '%GIORGIO'
in access per avere lo stesso risultato invece dovrò scrivere NOME LIKE '*GIORGIO'


invece per quando riguarda l'importazione ed esportazione di dati non ho proprio capito cosa intendi..

se intendi l'importazione dal menu file di access allora molto probabilmente il problema è relativo ai dati che stai importando, tipo chiave duplicata o valori nulli per la chiave o record differenti rispetto alla tabella di destinazione...

oppure..cosa che reputo più sicura, non ho capito un tubo di quello che hai scritto!!!

ciao
Vincenzo
Programmatore sbilenco

ANDREAR12 Profilo | Newbie

Ciao.

nel mio programma uso .Net per interfacciarmi ad un db access.
se vuoi vedere l'intero programma mandami la tua email.
questo è il codice che non mi funziona ed è posizionato nella form3.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace GestBar
{
public partial class Form3 : Form{
public static DateTime dt2 = new DateTime();

public Form3()
{
InitializeComponent();
}

private void button2_Click(object sender, EventArgs e)
{

//pulisco le listbox presenti nel form
listBox1.Items.Clear();
listBox2.Items.Clear();
listBox3.Items.Clear();
listBox4.Items.Clear();
listBox5.Items.Clear();
listBox6.Items.Clear();

string source1 = GB.geb;
DateTime dt4 = new DateTime();
dt4 = DateTime.Now;

OleDbConnection oleconn2 = new OleDbConnection(source1);
//query
string command8 = "SELECT * FROM Tbar WHERE GIORNO >= #"+dt2.Date+"# AND GIORNO <= #"+dt4.Date+"#";
OleDbCommand comm = new OleDbCommand(command8, oleconn2);


OleDbDataAdapter da = new OleDbDataAdapter(comm);
oleconn2.Open();
DataSet ds = new DataSet();

int pippo = da.Fill(ds, "Tbar");
DataRowCollection rr = ds.Tables["Tbar"].Rows;
int count12 = ds.Tables["Tbar"].Rows.Count;
if (count12 > 0)
{
for (int i = 0; i < count12; i++)
{
//tiro fuori i dati, richiamati dalla query, dal database
listBox2.Items.Add(rr[i].ItemArray[2].ToString());
string de = rr[i].ItemArray[1].ToString();
de.Replace("%"," ");
de.Replace("$","'");
listBox1.Items.Add(de);
listBox3.Items.Add(rr[i].ItemArray[3].ToString());
listBox4.Items.Add(rr[i].ItemArray[4].ToString());
listBox5.Items.Add(rr[i].ItemArray[6].ToString());
listBox6.Items.Add(rr[i].ItemArray[5].ToString());
}
}
da.Dispose();
oleconn2.Close();
}

private void Form3_Load(object sender, EventArgs e)
{

}

private void button3_Click(object sender, EventArgs e)
{
new Form4().ShowDialog();
}

private void button1_Click(object sender, EventArgs e)
{
double entrateit = 0;
double usciteit = 0;
double nettoit = 0;
double totsig = 0;
int ogg = 0;
ogg = listBox2.Items.Count;
if (ogg == 0)
{
MessageBox.Show("non hai interrogato il DataBase!!!", "Caffè del Corso");
}
else
{
string[] entr = new string[ogg];
string[] usc = new string[ogg];
string[] net = new string[ogg];
string[] tot = new string[ogg];
//copio il contenuto delle listbox nelle variabili
listBox2.Items.CopyTo(entr, 0);
listBox3.Items.CopyTo(usc, 0);
listBox4.Items.CopyTo(net, 0);
listBox5.Items.CopyTo(tot, 0);
for (int i = 0; i < ogg; i++)
{
//sommo
entrateit += double.Parse(entr[i]);
usciteit += double.Parse(usc[i]);
nettoit += double.Parse(net[i]);
totsig += double.Parse(tot[i]);
}
textBox5.Text = (entrateit + usciteit + totsig).ToString();
textBox1.Text = entrateit.ToString();
textBox2.Text = usciteit.ToString();
textBox3.Text = nettoit.ToString();
textBox4.Text = totsig.ToString();
}
}

private void button4_Click(object sender, EventArgs e)
{
//chiudo il form presente
this.Close();
}

private void textBox3_TextChanged(object sender, EventArgs e)
{

}

private void textBox4_TextChanged(object sender, EventArgs e)
{

}

private void button6_Click(object sender, EventArgs e)
{
// pulsante di eliminazione records non ancora implementato
int countdescr = listBox1.Items.Count;
int countentr = listBox2.Items.Count;
int countusc = listBox3.Items.Count;
int countnett = listBox4.Items.Count;
int counttot = listBox5.Items.Count;
int countgior = listBox6.Items.Count;
string[] descr = new string[countdescr];
string[] entr = new string[countentr];
string[] usc = new string[countusc];
string[] nett = new string[countnett];
string[] tot = new string[counttot];
string[] gior = new string[countgior];
listBox1.Items.CopyTo(descr, 0);
listBox2.Items.CopyTo(entr, 0);
listBox3.Items.CopyTo(usc, 0);
listBox4.Items.CopyTo(nett, 0);
listBox5.Items.CopyTo(tot, 0);
listBox6.Items.CopyTo(gior, 0);


}

}
}


GB è una classe che contenente soltanto la stringa di connessione al database.

ysdemarc Profilo | Expert

ciao..il codice sembra dover fare quello che deve fare in fin dei conti..
l'unica cosa che incriminerei è l'istruzione sql.

prima di tutto mi servirebbe sapere la colonna GIORNO della tua tabella TBar che tipo di dati è Numerico o Data\ora o testo?
e dentro cosa ci sta scritto? dammi un dato di esempio..

comunque suppongo che sia di tipo data\ora

tu usi in breve queste istruzioni per determinare la where:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e quindi supponendo che la query viene eseguita oggi il risultato sarebbe:

command8 = "SELECT * FROM Tbar WHERE GIORNO >= #01/01/0001 0.00.00# AND GIORNO <= #23/10/2009 0.00.00#"

non capisco perchè parti dal giorno 1 del mese 1 e anno 1

ti basterebbe scrivere

command8 = "SELECT * FROM Tbar WHERE GIORNO <= #" + dt4.Date + "#";

se invece il dt2 da qualche altra parte ti cambia va bene l'istruzione precedente ma a questo punto dt2 lo inizializzerei diversamente dal valore predefinito magari scrivendo
DateTime dt2 = new DateTime(1899,12,31);

infatti access non sa cosa sia #01/01/0001# per lui il valore minore di un data\ora è #31/12/1899#

quindi l'istruzione sql così creata, "SELECT * FROM Tbar WHERE GIORNO >= #31/12/1899 0.00.00# AND GIORNO <= #23/10/2009 0.00.00#", rispetto al precedente valore, "SELECT * FROM Tbar WHERE GIORNO >= #01/01/0001 0.00.00# AND GIORNO <= #23/10/2009 0.00.00#", ti restituirà i dati che prima non ti restituiva...

fammi sapere se è questo alla fine il problema o c'è qualcos'altro.

ciao

Vincenzo
Programmatore sbilenco

ANDREAR12 Profilo | Newbie

Ciao.

Per dargli il giorno da cui iniziare la ricerca faccio scegliere il giorno di inizio della ricerca con un form con un oggetto monthcalendar e quando vado a selezionare il giorno me lo invia direttamente nella variabile statica del form3.

nel database access il campo "Giorno" è di tipo data/ora ed il formato è "data generica".


Andrea.

ysdemarc Profilo | Expert

fai una cosa banalissima... prendi gli intevalli di data che non ti restituiscono dati e in debug verifichi l'istuzione sql prima della lettura e l'esegui in access così ti rendi conto qual'è il problema.. senza dati è impossibile verificare..cmq, il problema non è nel codice ma sicuramente nella where dell'istruzione sql
Vincenzo
Programmatore sbilenco

ANDREAR12 Profilo | Newbie

Ciao.

Ho scoperto che il problema è dovuto al fatto che access vuole la data in formato MM/DD/YYYY

come faccio ad impostare tale formato sul programmma?


Andrea.

ysdemarc Profilo | Expert

DateTime dt = DateTime.Now; //dichiaro una variabile datetime col valore di data oggi e ora

Console.Writeline(dt.ToString("MM/dd/yyyy")); //stampo la data dell'oggetto in formato MM/dd/yyyy
Vincenzo
Programmatore sbilenco

ANDREAR12 Profilo | Newbie

Ciao.

A runtime mi da un'eccezione il codice come me lo hai detto tu.

mi dice formato di data non valido.

Andrea.

ysdemarc Profilo | Expert

infatti non credo che il formato sia MM/dd/yyyy ma dd/MM/yyyy

prova nel tostring del datetime a dargli questo di formato


ho visto il tuo file access e la query interna..

alla fine lui intepreta e capisce se stai passando il formato mese /giorno /anno o giorno /mese /anno

per cui utilizza tranquillamente dd/MM/yyyy

forse il problema è che le date da te scelte non sono comprese, usi solo > e < se le date scelte le vuoi comprendere usa >= e <= oppure la parola chiave between

ad esempio

SELECT *
FROM Tbar WHERE Giorno between #16/09/2009# And #28/10/2009#

ANDREAR12 Profilo | Newbie

Ho risolto così:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //pulisco le listbox presenti nel form listBox1.Items.Clear(); listBox2.Items.Clear(); listBox3.Items.Clear(); listBox4.Items.Clear(); listBox5.Items.Clear(); listBox6.Items.Clear(); string source1 = GB.geb; DateTime dt4 = new DateTime(); dt4 = DateTime.Now.Date.AddDays(-1); string data1 = dt2.ToString("MM/dd/yyyy hh:mm:ss"); DateTime dt5 = new DateTime(); dt5 = DateTime.Parse(data1); data1 = ""; DateTime dt6 = new DateTime(); string data2 = dt4.ToString("MM/dd/yyyy hh:mm:ss"); dt6 = DateTime.Parse(data2);
Andrea
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5