2010-02-21 6 views
5

Ciao a tutti Sto cercando di fare la seguente query di inserimentoErrore: La conversione di un tipo di dati nvarchar ad un tipo di dati smalldatetime ha comportato un valore out-of-range

SqlDataSource userQuizDataSource = new SqlDataSource(); 
userQuizDataSource.ConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=quizApp;Integrated Security=True"; 
userQuizDataSource.InsertCommand = "INSERT INTO [UserQuiz] ([DateTimeComplete], [Score], [UserName]) VALUES (@DateTimeComplete, @Score, @UserName)"; 

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString()); 
userQuizDataSource.InsertParameters.Add("Score", score.ToString()); 
userQuizDataSource.InsertParameters.Add("UserName", User.Identity.Name); 

int rowsAffected = userQuizDataSource.Insert(); 

Buti mantengono ottenendo il seguente errore:

The conversion of a nvarchar data type to a smalldatetime data type resulted in an out-of-range value. The statement has been terminated.

Qualcuno può aiutarmi?

risposta

3

Cosa restituisce la dichiarazione DateTime.Now.ToString() ??

In che lingua e impostazioni internazionali è previsto il server SQL ??

Avete un disallineamento lì ??? Forse il tuo .NET restituisce un formato MM/dd/yyyy, mentre SQL Server si aspetta dd/MM/yyyy (o viceversa).

provare questo codice nel vostro SQL Server:

DECLARE @test TABLE (smalldate SMALLDATETIME) 
INSERT INTO @test VALUES ('02/21/2010 22:00:32') -- 
SELECT * FROM @test 

sostituire il mio stringa lì con quello in uscita che hai da .NET di DateTime.Now.ToString() - fa questo lavoro? SQL Server ti offre un messaggio di errore migliore?

Avanti, provate a utilizzare il formato ISO-8601 per le date (AAAAMMGG) - questo funziona per TUTTI impostazioni internazionali e della lingua in SQL Server - fa questo lavoro ??

DECLARE @test TABLE (smalldate SMALLDATETIME) 
INSERT INTO @test VALUES ('20100221 22:00:32') -- 
SELECT * FROM @test 
+0

grazie mille ... che funziona !! Penso che il problema sia stato il fatto che il formato della data sulla mia macchina è diverso da quello del server !! – c11ada

+0

.net restituisce la data nel formato dd/MM/yyyy e quando ho controllato il server SQL, il formato data è US style !! – c11ada

+2

Il formato "data e ora" più sicuro possibile da .net a sql che ho usato fino ad oggi è "aaaa-MM-gg HH: mm: ss.fff". PK :-) –

0

Provare a cambiare questo:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString()); 

a questo:

userQuizDataSource.InsertParameters.Add("@startdate", SqlDbType.DateTime, DateTime.Now.ToString()); 
+0

Im ottenendo 2 nuovi errori ora 1) La partita metodo migliore overload per 'System.Web.UI.WebControls.ParameterCollection.Add (string, string)' ha alcuni argomenti non validi 2) argomento '2': non è possibile convertire da 'System.DateTime' a 'string' – c11ada

0

Prova senza convertire la data a stringa:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now); 

Edit: Prova questo allora:

userQuizDataSource.InsertParameters.Add("DateTimeComplete", TypeCode.DateTime, DateTime.Now.ToString()); 

C'è un altro modo per passare semplicemente l'oggetto reale, ma non riesco a ricordare .. mi dispiace.

+0

im ottenendo 2 nuovi errori ora 1) La migliore corrispondenza del metodo sovraccarico per 'System.Web.UI.WebControls.ParameterCollection.Add (stringa, stringa)' ha alcuni argomenti non validi 2) Argomento '2': impossibile convertire da 'System.DateTime' a 'string' – c11ada

+0

Siamo spiacenti, hai ragione. C'è in realtà un altro modo per aggiungere solo l'oggetto, ovvero il datetime, ma non ricordo, non ho ancora aperto VS al momento. Provalo sull'origine dati attuale e cerca un metodo come AddParameterValue .. (nome stringa, valore oggetto) .. – ziya

1

Ho avuto lo stesso problema aggiungendo datetime.now nel mio SQL Server colonna 'Data' impostato su tipo di dati smalldatetime.

Per risolvere era abbastanza semplice (dopo molti tentativi !!)

string currentdatetime= 
DateTime.Now.Year + "." + DateTime.Now.Month + "." + DateTime.Now.Day + 
       " " + DateTime.Now.Hour+(":")+DateTime.Now.Minute+(":")+DateTime.Now.Second 

Ciò restituirà la data nel formato che il server si aspetta

0

In Windows 8, se si trovano ad affrontare questo problema anche dopo aver cambiato Formats nel sottostante

Control Panel -> Region

Hai ancora a trasferire queste impostazioni per gli utenti. Nella stessa finestra, vai alla scheda "Amministrativo", fai clic su Impostazioni copia.

Selezionare le caselle di controllo appropriate e fare clic su OK.