Erore Ricerca Di una data nel database

mercoledì 11 gennaio 2012 - 11.29
Tag Elenco Tags  VB.NET  |  Windows Vista  |  Visual Studio 2008  |  Access (.mdb)  |  Office 2003

Feroxis Profilo | Junior Member

Di solito il codice mi funziona ma con le date proprio non ne ha voglia.
Cos'è che non va?
VB 2008 / Access / OLEDB

Dim myconn1 As New OleDb.OleDbConnection
Dim mycomm1 As New OleDb.OleDbCommand
Dim mydata1 As New OleDb.OleDbDataAdapter
Dim mydataset1 As New DataSet
Dim mydata As Date
mydata = SelectDate.MonthCalendar1.SelectionStart.Date

'my data restituisce la data nel formato gg/mm/aaaa come impostato anche nel database

myconn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Indirizzo1 & " "
mycomm1.Connection = myconn1

mycomm1.CommandText = "SELECT IdUscita,Nome,Cognome,IdSocio,Descrizione,Euro,Riferimento,[Data] " & _
"FROM " & tabella1 & " " & _
"WHERE [Data] = " & mydata & " "

mycomm1.Parameters.Add("[Data]", OleDb.OleDbType.DBDate, 10).Value = mydata

mydata1.SelectCommand = mycomm1

myconn1.Open()
mydata1.Fill(mydataset1, tabella1)
myconn1.Close()
Risultati.Visible = True
Risultati.DataGridView1.AutoGenerateColumns = True
Risultati.DataGridView1.DataSource = mydataset1
Risultati.DataGridView1.DataMember = tabella1
Risultati.DataGridView1.AutoResizeColumns()

Apre il form crea le colonne nel Datagrid ma non inserisce i valori.

Mie Deduzioni:
Dim mydata As Date
mydata = SelectDate.MonthCalendar1.SelectionStart.Date
Se nel MonthCalendar seleziono per esempio il 03/01/2012
alla richiesta
msgbox("mydata,okonly)
ricevo:
03/01/2012
Quindi va bene così.

Se elimino WHERE DATA = mydata e parameters.add mi restituisce tutti i valori e funziona.
Quindi posso escludere la connessione al database e errori di scrittura.

Se inserisco però:
"WHERE [Data] = " & mydata & " "

mycomm1.Parameters.Add("[Data]", OleDb.OleDbType.DBDate, 10).Value = mydata
Non mi viene restituito niente e non credo si vada a confrontare due variabili di carattere diverso.

Penso quindi che possa essere solo il formato della data che non coincide.
mycomm1.Parameters.Add("[Data]", OleDb.OleDbType.DBDate, 10).Value = mydata
in questo caso Oledb.oledbtype.dbdate,10

Nel database il formato della data è gg/mm/aaaa
Il formato restituito da mydata è gg/mm/aaaa

Cos'altro può essere?

lbenaglia Profilo | Guru

>mycomm1.CommandText = "SELECT IdUscita,Nome,Cognome,IdSocio,Descrizione,Euro,Riferimento,[Data]
>" & _
>"FROM " & tabella1 & " " & _
>"WHERE [Data] = " & mydata & " "
....
>Nel database il formato della data è gg/mm/aaaa
>Il formato restituito da mydata è gg/mm/aaaa
>
>Cos'altro può essere?

Ciao,

Se componi dinamicamente un comando Jet SQL devi specificare la data nel formato #mm/dd/yyyy#.
Una soluzione più efficiente e che ti mette al riparo da attacchi di SQL injection consiste nel definire una query parametrica come nell'esempio proposto in questo thread:
http://usenet.it.rooar.com/showthread.php?t=6531326

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

Feroxis Profilo | Junior Member

Scusatemi ma ho ancora qualche dubbio anche se il programma funziona correttamente.
In questo caso non ho mai specificato il formato della data se non nel database in access 2003 (in cifre ovvero gg/mm/aaaa) e ho sempre fatto in modo da avere le mie variabili data nel formato previsto dd/mm/yyyy dato che le date non vengono mai scritte ma sempre selezionate da MonthCalendar con .SelectStart.Date che sarebbe uguale a mydata = #dd/mm/yyyy# quindi dovrebbe essere la stessa cosa no? solo che non mi è mai capitato di lavorare o di trovare un valore restituito con formato #mm/dd/aaaa#.
Visual Studio Professional 2008 ITA ottenuto con DreamsPark Gratuitamente per le "convenzioni" con le Università "Politecnica delle Marche". https://www.dreamspark.com/default.aspx

Attacchi SQL inj??
http://it.wikipedia.org/wiki/SQL_injection
Ovvero che qualcuno cerca di entrare nei database? Fortunatamente è un programma semplice che girerà,per ora stagione agonistica 2011/2012 e 2012/2013, in un NetBook comprato usato a 75 euro dopo 2 giorno dal suo acquisto a 150 in offerta, dove ho rimosso 2 schede - wireless e ethernet, resta solo il caso delle chiavette internet ma che escludo a priori il suo futuro utilizzo e per la sicurezza dei dati il "contratto" conterrà una clausola che obbliga l'utente a non connettere mai il NetBook a internet.

Comunque ora funziona perfettamente.

Per l'esempio di Benaglia, ti ringrazio perchè mi sarà utile la funzione Between anche se l'ora non la utilizzerò mai e sarà sempre eliminata dal formato della data che non sarà mai DateTime.

Grazie Ancora Poto Il Codice Definitivo che utilizzerò previo ulteriori modifiche Future:

'Dichiarazione Connessioni
Dim myconn1 As New OleDb.OleDbConnection
Dim mycomm1 As New OleDb.OleDbCommand
Dim mydata1 As New OleDb.OleDbDataAdapter
Dim mydataset1 As New DataSet
Dim mydata As Date

'Selezione della data
mydata = SelectDate.MonthCalendar1.SelectionStart.Date

'Elimina i parametri selezionati in una ricerca non presente in questa parte di codice

mycomm1.Parameters.Clear()
'dichiarazione della posizione del database, del suo nome e della tabella, (gestisco in questo modo perchè devo avere modo di modificare questi valori durante l'uso del programma)

Dim tabella1 As String
tabella1 = PosizioneDatabase.TextBox9.Text
Dim database1 As String
database1 = PosizioneDatabase.TextBox7.Text
Dim cartella1 As String
cartella1 = PosizioneDatabase.TextBox8.Text
Dim Indirizzo1 As String
Indirizzo1 = cartella1 + database1

'connessione al database

myconn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Indirizzo1 & " "
mycomm1.Connection = myconn1

' Query
mycomm1.CommandText = "SELECT IdEntrata,Nome,Cognome,IdSocio,Descrizione,Euro,Riferimento,[Data] " & _
"FROM " & tabella1 & " " & _
"WHERE [Data] = @prmData "

mycomm1.Parameters.Add("@prmData", OleDb.OleDbType.Date).Value = mydata


mydata1.SelectCommand = mycomm1
'Eseguo
myconn1.Open()
mydata1.Fill(mydataset1, tabella1)
myconn1.Close()

'Pubblico i Dati in un nuovo Form Con un Datagrid
Risultati.Visible = True
Risultati.DataGridView1.AutoGenerateColumns = True
Risultati.DataGridView1.DataSource = mydataset1
Risultati.DataGridView1.DataMember = tabella1
Risultati.DataGridView1.AutoResizeColumns()
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5