Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    problema c# e ms access

    salve.
    Sto realizzando un software in c# per gestire alcune note, e avrei un piccolo problema...

    il database, ha una tabella 8scadenza) nel quale ho memorizzato un campo data di tipo data generica.
    quando vado a selezionare la data, la prendo da tue oggetti di tipo dateTimePicker.

    la query che vado a costruire, è la seguente


    string sqlCartelle = "SELECT * FROM scad WHERE data Between #"+data1+"# And #"+data2+"#";


    che, provata su access, funziona, in c# me genera il seguente errore "Tipi di dati non corrispondenti".
    Ho provato pure ad utilizzare i dateTime nel seguente modo

    DateTime d1 = new DateTime(int.Parse(data1.Substring(0,2)), int.Parse(data1.Substring(3,2)), int.Parse(data1.Substring(6,4)));
    DateTime d2 = new DateTime(int.Parse(data2.Substring(0, 2)), int.Parse(data2.Substring(3, 2)), int.Parse(data2.Substring(6, 4)));
    string sqlCartelle = "SELECT * FROM scad WHERE data Between #"+d1.getDate()+"# And #"+d2.Date()+"#";

    ma il risultato è sempre lo stesso... come posso fare per risolvere questo problema?

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Se non erro la data nella query deve essere nel formato mese/giorno/anno.
    Non ne sono sicuro, ma probabilmte risolveresti usando i parametri nella query anzichè inserire una variabile.
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Confermo Pirelli72.

    Il fatto che in MS Access funzioni non significa niente, la questione è nota da anni.
    MS Access è un'ambiente di progettazione che usa funzionalità interne che puoi trovare o meno nei linguaggi di programmazione.
    Che una query creata in MS Access funzioni anche esternamente è un puro caso e dipende dalla semplicità della query, ma non esiste alcuna compatibilità tra MS Access ed i linguaggi di programmazione.
    MSAccess usa internamente DAO quindi se si usa DAO nel linguaggio di programmazione la query funzionerà, ma se si usa ADO nella maggior parte dei casi non funzionerà, ed è così anche per ADO.NET.

    Così com'è noto (per gli altrettanti noti problemi sulla sicurezza, sql injection, ...) che le query non vanno più scritte così , ma si devono usare sempre i Command con parametri, che oltretutto semplificano enormemente la vita. Sono fatti apposta.
    Vedi la mia firma l'esempio in OleDB2008 e ADO.NET.

    Una piaga chiamata SQL Injection
    http://msdn.microsoft.com/it-it/library/cc185099.aspx

    Query parametriche (Command)
    http://en.wikipedia.org/wiki/SQL_inj...zed_statements

    SQL Injection
    http://it.wikipedia.org/wiki/SQL_injection

    Tecniche: SQL Injection
    http://sicurezza.html.it/articoli/le...sql-injection/


  4. #4
    allora...tenendo conto che so la differenza tra una query normale e una parametrica, e che il suddretto software, per quanto riguarda, non dovrebbe essere soggetto ad attacchi sql injection dato che, punto primo, non si trova in rete, punto secondo, serve solo a me per gestire una sorta di diario personale, e che quindi, se la gente vede quel che ho scritto, nonmene pò fregà de meno :-D

    detto questo, non riesco a vedere una soluzione aciò che mi proponi... anche se ho scritto la query in formati parametrico non fnziona ugualmente...conosci una soluzione er la compatibilià

  5. #5
    ps. per Pirelli... ci ho provato, manon funziona

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da ulisseodisseo
    ps. per Pirelli... ci ho provato, manon funziona
    Ma se non mostri il NUOVO codice, come possiamo aiutarti?
    - mostra il codice usato per query normale
    - mostra il codice usato per il command + parametri

  7. #7
    hai ragione... chiedo venia...

    Allora, questo è il codice parametrico

    public static DataSet eseguiSelectDataParametrica(string query, String data1, String data2)
    {

    string con = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\\prova.mdb;";
    OleDbConnection connessione = new OleDbConnection(con);
    connessione.Open();
    OleDbDataAdapter myCommand = new OleDbDataAdapter(query, connessione);
    myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data1", 1));
    myCommand.SelectCommand.Parameters["@data1"].Value = data1;
    myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data2", 2));
    myCommand.SelectCommand.Parameters["@data2"].Value = data2;
    DataSet ds = new DataSet();

    myCommand.Fill(ds, "scad");

    connessione.Close();

    return ds;
    }

    e la query che viene passata è la seguente

    "select * from scad where data >= @data1 and data <= @data2 order by data ASC"

    mentre invece, questo è il codice non parametrico

    public static DataSet eseguiSelect(string query)
    {

    string con = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\\prova.mdb;";
    OleDbConnection connessione = new OleDbConnection(con);
    connessione.Open();

    OleDbCommand mycommand = new OleDbCommand(query,connessione);
    mycommand.CommandText = query;

    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = mycommand;
    DataSet ds = new DataSet();

    adapter.Fill(ds);




    connessione.Close();

    return ds;
    }

    e la query che viene passata è

    "select * from scad where data >= data1 and data <= data2 order by data ASC"

    ovviamente, in enrambi i casi, data1 e data2 sono due stringhe del tipo gg/mm/aaaa

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Ho provato con successo il codice che hai postato, ovviamente mi sono fatto un Database con Access, una Tabella Anagrafica con tre campi Nome,Cognome,Data.

    Questo il codice che ho utilizzato, chiaramente adattato alla mia prova, ma il succo non cambia:

    codice:
    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
    	eseguiSelectDataParametrica("SELECT Nome FROM Anagrafica WHERE Data BETWEEN @data1 AND @data2", DateTime.Now, DateTime.Now.AddDays(-365));
    }
    
    public void eseguiSelectDataParametrica(string query, string data1, string data2)
    {
    	string con = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\\prova.mdb;";
    	DataTable obj = null;
    	OleDbConnection connessione = new OleDbConnection(con);
    	connessione.Open();
    	OleDbDataAdapter myCommand = new OleDbDataAdapter(query, connessione);
    	myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data1", 1));
    	myCommand.SelectCommand.Parameters("@data1").Value = data1;
    	myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data2", 2));
    	myCommand.SelectCommand.Parameters("@data2").Value = data2;
    	DataSet ds = new DataSet();
    
    	myCommand.Fill(ds, "scad");
    
    	connessione.Close();
    
    	obj = ds.Tables[0];
    
    	for (int n = 0; n <= obj.Rows.Count - 1; n++) {
    		ListBox1.Items.Add(obj.Rows[n][0]);
    	}
    }
    Scusa in C#

    codice:
      public void eseguiSelectDataParametrica(string query, string data1, string data2)
            {
                string con = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\\prova.mdb;";
                DataTable obj = null;
                OleDbConnection connessione = new OleDbConnection(con);
                connessione.Open();
                OleDbDataAdapter myCommand = new OleDbDataAdapter(query, connessione);
                myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data1", data1));
                myCommand.SelectCommand.Parameters.Add(new OleDbParameter("@data2", data2));
                DataSet ds = new DataSet();
    
                myCommand.Fill(ds, "scad");
    
                connessione.Close();
    
                obj = ds.Tables[0];
    
                for (int n = 0; n <= obj.Rows.Count - 1; n++)
                {
                    listBox1.Items.Add(obj.Rows[n][0]);
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                eseguiSelectDataParametrica("SELECT Nome FROM Anagrafica WHERE Data BETWEEN @data1 AND @data2", DateTime.Now.ToString (), DateTime.Now.AddDays(-365).ToString());
            }
    Funziona regolarmente.
    Sbagliare è umano, perseverare è diabolico.

  9. #9
    niente
    mi da semnpre lo stesso errore... tipo di dati non corrispondenti nella tabella criterio...
    curiosità: Il campo data, come l'hai impsotato? Generico o altro?
    punto due... i gli passo data1 e data2 (che sono due stringhe)... vanno bene ugualmente? sono nel formato dd/mm/yyyy

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Mmmmm... Strana questa domanda...

    I campi data vanno impostati di tipo data, parlando di Access: DataTime .

    Ma mi pare più che ovvio e scontato , altrimenti nei database per cosa l'hanno creato il tipo data?


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.