Problemas con Fechas y DateTime

19/08/2004 - 13:32 por Oriol | Informe spam
Hola a todos,

Tengo un pequeño problema y supongo que no se encontrar la solucion.

Tengo unos datos en una Base de datos MS SQL en formato SmallDateTime.
Algunos estan llenos con fecha y otros contienen NULL.

Cuando intento recuperar esos datos de la Base de datos mediante un
StoredProcedure (el cual funciona bien, testeado con el Query Analizer), me
da problemas con los valores null al intentar ponerlos en una variable de
tipo DateTime.

El proceso de recuperacion de datos es este: (Trabajo en C# y Winforms)

public static ArrayList ListarInformesPorCliente(string IdCliente)
{
ArrayList arData = new ArrayList();
SqlCommand cmdInforme= new SqlCommand();
cmdInforme.Connection = Sistema.conexionLocal;
cmdInforme.CommandType = CommandType.StoredProcedure;
cmdInforme.CommandText = "ListarInformesPorCliente";
SqlParameter myParam;
myParam = cmdInforme.Parameters.Add("@IdCliente",SqlDbType.Char,16);
myParam.Value = IdCliente;
SqlDataAdapter daInforme = new SqlDataAdapter(cmdInforme);
DataSet dsInforme = new DataSet();
daInforme.Fill(dsInforme,"Informes");
for (int i = 0; i<dsInforme.Tables["Informes"].Rows.Count; i++)
{
Informe cItem = new Informe();
cItem.IdInforme dsInforme.Tables["Informes"].Rows[i]["inf_IdInforme"].ToString();
cItem.FechaInforme System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]["inf_FechaInforme
"].ToString());
arData.Add(cItem);
}
cmdInforme.Dispose();
daInforme.Dispose();
dsInforme.Dispose();
return arData;
}

Donde cItem.FechaInforme es del tipo DateTime. He solucionado esto por parte
del SQL donde pongo la opcion "ISNULL(FechaInforme,01/01/2000)", pero esto
solo me sirve para que no me de error, pero los datos no son buenos, ya que
se muestra 01/01/2000 cuando deberia mostrarse NADA. Alguna forma de
conseguir que un valor NULL no de error al asociarlo a una variable
DateTime?

Gracias!

Saludos
Oriol.

Preguntas similare

Leer las respuestas

#6 Jose Alfredo
20/08/2004 - 12:37 | Informe spam
Hola Oriol

Si trabajas con valores nulos con DateTime te vas a encontrar un millon de
problemas, en general la fecha es algo que existe (si usas algo con tiempo,
tiene que existir tiempo), y lo ideal es que ese campo siempre tome un valor
por defecto cuando haces el diseño del programa. Puede haber momentos muy
contados que pueda no existir, pero siempre se debe tratar de poner una
fecha por defecto, es por eso que muchos DateTimepicker no te dejan escribir
la fecha y siempre requieren una. En la base de datos es más eficiente
colocar una fecha que te signifique nula que dejar el campo null, en general
no se aconseja (por terminos de eficiencia) dejar campos con posibilidad de
valores nulos. http://www.codeproject.com/cs/datab...dodont.asp

Mi técnica cuando uso un datapicker es por defecto cargarlo con la fecha de
hoy, si el usuario confirma la acción leo los valores si no los ignoro
todos.

En lo que escribes abajo el parser debe fallar al encontrarse una instancia
no válida de fecha, es decir una fecha nula

Saludos

Jose Alfredo


"Oriol" <intranet[arroba]rvsa-itv.com> schrieb im Newsbeitrag
news:
Hola a todos de nuevo,

He probado lo de antes, pero ahora me encuentro con otro problema, esta


vez
relacionado con el DateTimePicker.

this.dtpFechaNacimiento.Value > System.DateTime.Parse(tra.FechaNacimiento.ToShortDateString());

Cuando se ejecuta este codigo, me da un error cuando tra.FechaNacimiento


es
NULL.

El error es:
"Referencia a cadena no establecida como instancia de cadena. Nombre del
parametro: s"

Alguna forma de poner un NULL a un DateTimePicker. Porque si el valor es
null, no tiene porque salir ninguna fecha.

Gracias y saludos de nuevo.
Oriol.


"Oriol" <intranet[arroba]rvsa-itv.com> escribió en el mensaje
news:O%
> Hola Alejandro,
>
> Gracias, creo que ahora he entendido bien el correo de Jose Alfredo.
> El tema es que viendo mi codigo original, me quedaria hacer estas
> modificaciones, no?
>
> El codigo original:
> cItem.FechaInforme > >



System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]["inf_FechaInforme
> "].ToString());
> tendria que ser asi:
> if (dsInforme.Tables["Informes"].Rows[i]["inf_FechaInforme"] =null)
> {cItem.FechaInforme > >



System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]["inf_FechaInforme
> "]);}
> else
> {cItem.FechaInforme > >



System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]["inf_FechaInforme
> "].ToString());}
>
> Porque no hay otra forma de no tener que comprovar si es null, verdad? Y
asi
> no tener que hacer el IF en cada variable de tipo DateTime?
>
> Gracias Alejandro/Jose Alfredo.
>
> Saludos,
> Oriol.
>
> "Alejandro Perez" escribió en el mensaje
> news:92c001c48608$f74e9840$
> Hola Oriol. Realmente el problema si viene por alli como
> te comento Jose.
>
> La respuesta al porque si te sirve con un string y no con
> el datetime es por lo siguiente:
>
> El ToString() de un null retorna un string vacio. Si eso
> se lo asignas a una variable string, no tienes ningun
> problema. Es simplemente un string vacio "".
>
> Pero, si a ese string vacio le intentas hacer un
> DateTime.Parse, obtendras el error, porque un string "" no
> es un datetime valido.
>
> De esta manera, la solucion es la que te planteo Jose.
> Evalua que el valor que te retorna el campo datetime no
> sea "" para luego realizar el parse.
>
> Bye bye!
> Alejandro Perez
> MCSD/MCDBA/MCT
> Caracas - Venezuela
>
> >Hola José,
> >
> >El problema no creo que venga por aqui, porque por
> ejemplo tengo campos tipo
> >String con NULL, y si le aplico la funcion toString, no
> da problemas. El
> >problema creo que es en el System.DateTime.Parse. Aunque
> no estoy del todo
> >seguro y ahora mismo no puedo probarlo.
> >
> >Gracias.
> >
> >Saludos,
> >Oriol.
> >
> >"Jose Alfredo" escribió en el
> mensaje
> >news:e$
> >> Hola!
> >>
> >> A lo que yo pienso, no se puede convertir a string un
> valor null y por eso
> >> debe saltar un error en
> >>
> >> cItem.FechaInforme > > >> >
> >>
> >System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]
> ["inf_FechaInforme
> >> > "].ToString());
> >>
> >> pudieras testear primeramente si el valor es null y si
> es null, guardas
> >una
> >> cadena vacia...
> >>
> >> Saludos
> >>
> >> Jose Alfredo
> >>
> >>
> >> "Oriol" <intranet[arroba]rvsa-itv.com> schrieb im
> Newsbeitrag
> >> news:
> >> > Hola a todos,
> >> >
> >> > Tengo un pequeño problema y supongo que no se
> encontrar la solucion.
> >> >
> >> > Tengo unos datos en una Base de datos MS SQL en
> formato SmallDateTime.
> >> > Algunos estan llenos con fecha y otros contienen NULL.
> >> >
> >> > Cuando intento recuperar esos datos de la Base de
> datos mediante un
> >> > StoredProcedure (el cual funciona bien, testeado con
> el Query Analizer),
> >> me
> >> > da problemas con los valores null al intentar
> ponerlos en una variable
> >de
> >> > tipo DateTime.
> >> >
> >> > El proceso de recuperacion de datos es este: (Trabajo
> en C# y Winforms)
> >> >
> >> > public static ArrayList ListarInformesPorCliente
> (string IdCliente)
> >> > {
> >> > ArrayList arData = new ArrayList();
> >> > SqlCommand cmdInforme= new SqlCommand();
> >> > cmdInforme.Connection = Sistema.conexionLocal;
> >> > cmdInforme.CommandType > > CommandType.StoredProcedure;
> >> > cmdInforme.CommandText
> = "ListarInformesPorCliente";
> >> > SqlParameter myParam;
> >> > myParam = cmdInforme.Parameters.Add
> ("@IdCliente",SqlDbType.Char,16);
> >> > myParam.Value = IdCliente;
> >> > SqlDataAdapter daInforme = new SqlDataAdapter
> (cmdInforme);
> >> > DataSet dsInforme = new DataSet();
> >> > daInforme.Fill(dsInforme,"Informes");
> >> > for (int i = 0; i<dsInforme.Tables
> ["Informes"].Rows.Count; i++)
> >> > {
> >> > Informe cItem = new Informe();
> >> > cItem.IdInforme > > >> > dsInforme.Tables["Informes"].Rows[i]
> ["inf_IdInforme"].ToString();
> >> > cItem.FechaInforme > > >> >
> >>
> >System.DateTime.Parse(dsInforme.Tables["Informes"].Rows[i]
> ["inf_FechaInforme
> >> > "].ToString());
> >> > arData.Add(cItem);
> >> > }
> >> > cmdInforme.Dispose();
> >> > daInforme.Dispose();
> >> > dsInforme.Dispose();
> >> > return arData;
> >> > }
> >> >
> >> > Donde cItem.FechaInforme es del tipo DateTime. He
> solucionado esto por
> >> parte
> >> > del SQL donde pongo la opcion "ISNULL
> (FechaInforme,01/01/2000)", pero
> >esto
> >> > solo me sirve para que no me de error, pero los datos
> no son buenos, ya
> >> que
> >> > se muestra 01/01/2000 cuando deberia mostrarse NADA.
> Alguna forma de
> >> > conseguir que un valor NULL no de error al asociarlo
> a una variable
> >> > DateTime?
> >> >
> >> > Gracias!
> >> >
> >> > Saludos
> >> > Oriol.
> >> >
> >> >
> >>
> >>
> >
> >
> >.
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida