2010-02-21 11 views
5

Hola a todos Estoy tratando de hacer lo siguiente consulta de inserciónde error: La conversión de un tipo de datos nvarchar a un tipo de datos smalldatetime resultó en un valor fuera de rango

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 deja de recibir el siguiente error:

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

¿Alguien me puede ayudar?

Respuesta

3

¿Qué significa su declaración DateTime.Now.ToString()?

¿Qué idioma y configuración regional espera su servidor SQL?

¿Tiene un desajuste allí? Tal vez su .NET devuelva un formato MM/dd/yyyy, mientras que SQL Server espera dd/MM/yyyy (o viceversa).

probar este código en el servidor SQL Server:

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

sustituir a mi cadena de allí con lo que obtuvo de salida de .NET de DateTime.Now.ToString() - Cómo funciona? ¿SQL Server le da un mejor mensaje de error?

A continuación, intente utilizar el formato ISO-8601 para las fechas (AAAAMMDD) - esto funciona para TODOS configuración regional y de idioma en SQL Server - ¿esto funciona?

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

muchas gracias ... ¡eso funciona! ¡Creo que el problema fue más el hecho de que el formato de la fecha en mi máquina es diferente al del servidor! – c11ada

+0

.net devuelve la fecha en el formato de dd/MM/aaaa y cuando revisé el servidor SQL, la fecha formato es estilo de EE. UU. – c11ada

+2

El formato de "fecha y hora" más seguro posible de .net a sql que he usado hasta la fecha es "aaaa-MM-dd HH: mm: ss.fff". PK :-) –

0

Intente cambiar esto:

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

a esto:

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

Im consiguiendo 2 nuevos errores ahora 1) El partido mejor método sobrecargado para 'System.Web.UI.WebControls.ParameterCollection.Add (String, String)' tiene algunos argumentos no válidos 2) El argumento de '2': No se puede convertir de 'System.DateTime' a 'string' – c11ada

0

intentas sin convertir su fecha de cadena:

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

Editar: Prueba esto a continuación:

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

Hay otra manera de simplemente pasar el objeto real, pero no recuerdo ... lo siento.

+0

estoy recibiendo 2 nuevos errores ahora 1) La mejor coincidencia de método sobrecargado para 'System.Web.UI.WebControls.ParameterCollection.Add (string, string)' tiene algunos argumentos inválidos 2) Argumento '2': no ​​se puede convertir de 'System.DateTime' a 'string' – c11ada

+0

Disculpe, tiene razón. De hecho, hay otra manera de agregar solo el objeto, por ejemplo, fecha y hora, pero no puedo recordar, no tengo VS abierto en este momento. Pruébalo en la fuente de datos real y busca un método como AddParameterValue ... (nombre de la cadena, valor del objeto) ... – ziya

1

que tenían el mismo problema al añadir datetime.now en mi servidor SQL columna 'Fecha' se establece en tipo de datos smalldatetime.

Para resolver era bastante simple (después de muchos intentos !!)

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

Esto devolverá la fecha en el formato que el servidor esperará

0

En Windows 8, si se enfrentan a este problema incluso después de cambiar Formats por debajo de la ubicación

Control Panel -> Region

Usted todavía tiene que transferir esta configuración a los usuarios. En la misma ventana, vaya a la pestaña "Administrativo", haga clic en Configuración de copia.

Seleccione las casillas de verificación apropiadas y haga clic en OK.

Cuestiones relacionadas