Foros del Web » Programación para mayores de 30 ;) » .NET »

Insert en BD con valores null mediante SOAP...

Estas en el tema de Insert en BD con valores null mediante SOAP... en el foro de .NET en Foros del Web. Muy buenas, a ver si me podeis echar un cable, estoy haciendo una aplicación ASP.NET en Visual C# que por motivos de portabilidad todas las ...
  #1 (permalink)  
Antiguo 26/04/2005, 04:43
Avatar de Scour  
Fecha de Ingreso: octubre-2003
Ubicación: Murcia (España)
Mensajes: 94
Antigüedad: 20 años, 6 meses
Puntos: 0
Insert en BD con valores null mediante SOAP...

Muy buenas, a ver si me podeis echar un cable, estoy haciendo una aplicación ASP.NET en Visual C# que por motivos de portabilidad todas las transacciones hacia y desde base de datos (SQL Server 2000) se realizan mediante SOAP.

El caso es que, por ejemplo, en el apartado de alta de usuarios al sistema, desde la aplicación ASP.NET, paso los valores que ha introducido el usuario en el formulario a la función SOAP:

Código:
servicio.alta_usuarios (TBUsuario.Text, TBPassword.Text, TBNombre.Text, TBApellido1.Text, TBApellido2.Text, TBNombreBreve.Text, Int32.Parse(DDLDepartamento.SelectedValue), Int32.Parse(RBLCentro.SelectedValue), Int32.Parse(RBLEmpresa.SelectedValue), TBPuesto.Text, TBTelefono.Text, TBExtension.Text, TBEmail.Text, Int32.Parse(TBEstado.Text), DateTime.Parse(TBFechaSolic.Text), DateTime.Parse(TBFechaVal.Text), DateTime.Parse(TBFechaMod.Text), Int32.Parse(TBFuncion.Text), Int32.Parse(TBContratoAlta.Text), Int32.Parse(TBContratoVista.Text));
Y la correspondiente función SOAP es la siguiente:

Código:
[WebMethod]
		public string alta_usuarios(string usuario, string password, string nombre, string apellido1, string apellido2, string nombre_breve, int id_departamento, int id_centro, int id_empresa, string puesto, string telefono, string extension, string mail, int estado, DateTime fecha_solic, DateTime fecha_val, DateTime fecha_mod, int funcion, int contrato_alta, int contrato_vista)
		{
			string conexion = cedena_conexion();
			SqlConnection con = new SqlConnection (conexion);
			SqlCommand cmdinsert = new SqlCommand ("insert into usuarios (usuario, password, nombre, apellido1, apellido2, nombre_breve, id_departamento, id_centro, id_empresa, puesto, telefono, extension, mail, estado, fecha_solic, fecha_val, fecha_mod, funcion, contrato_alta, contrato_vista) values (@usuario, @password, @nombre, @apellido1, @apellido2, @nombre_breve, @id_departamento, @id_centro, @id_empresa, @puesto, @telefono, @extension, @mail, @estado, @fecha_solic, @fecha_val, @fecha_mod, @funcion, @contrato_alta, @contrato_vista)", con);

			cmdinsert.Connection.Open();

			SqlParameter param1 = new SqlParameter ("@usuario", SqlDbType.VarChar, 10);
			param1.Direction = ParameterDirection.Input;
			param1.IsNullable = false;
			param1.Value = (usuario);
			cmdinsert.Parameters.Add(param1);

			SqlParameter param2 = new SqlParameter ("@password", SqlDbType.VarChar, 10);
			param2.Direction = ParameterDirection.Input;
			param2.IsNullable = false;
			param2.Value = (password);
			cmdinsert.Parameters.Add(param2);

			SqlParameter param3 = new SqlParameter ("@nombre", SqlDbType.VarChar, 20);
			param3.Direction = ParameterDirection.Input;
			param3.IsNullable = false;
			param3.Value = (nombre);
			cmdinsert.Parameters.Add(param3);

			SqlParameter param4 = new SqlParameter ("@apellido1", SqlDbType.VarChar, 20);
			param4.Direction = ParameterDirection.Input;
			param4.IsNullable = false;
			param4.Value = (apellido1);
			cmdinsert.Parameters.Add(param4);

			SqlParameter param5 = new SqlParameter ("@apellido2", SqlDbType.VarChar, 20);
			param5.Direction = ParameterDirection.Input;
			param5.IsNullable = false;
			param5.Value = (apellido2);
			cmdinsert.Parameters.Add(param5);

			SqlParameter param6 = new SqlParameter ("@nombre_breve", SqlDbType.VarChar, 15);
			param6.Direction = ParameterDirection.Input;
			param6.IsNullable = false;
			param6.Value = (nombre_breve);
			cmdinsert.Parameters.Add(param6);

			SqlParameter param7 = new SqlParameter ("@id_departamento", SqlDbType.Int, 4);
			param7.Direction = ParameterDirection.Input;
			param7.IsNullable = false;
			param7.Value = (id_departamento);
			cmdinsert.Parameters.Add(param7);

			SqlParameter param8 = new SqlParameter ("@id_centro", SqlDbType.Int, 4);
			param8.Direction = ParameterDirection.Input;
			param8.IsNullable = false;
			param8.Value = (id_centro);
			cmdinsert.Parameters.Add(param8);

			SqlParameter param9 = new SqlParameter ("@id_empresa", SqlDbType.Int, 4);
			param9.Direction = ParameterDirection.Input;
			param9.IsNullable = false;
			param9.Value = (id_empresa);
			cmdinsert.Parameters.Add(param9);

			SqlParameter param10 = new SqlParameter ("@puesto", SqlDbType.VarChar, 15);
			param10.Direction = ParameterDirection.Input;
			param10.IsNullable = false;
			param10.Value = (puesto);
			cmdinsert.Parameters.Add(param10);

			SqlParameter param11 = new SqlParameter ("@telefono", SqlDbType.VarChar, 15);
			param11.Direction = ParameterDirection.Input;
			param11.IsNullable = true;
			param11.Value = (telefono);
			cmdinsert.Parameters.Add(param11);

			SqlParameter param12 = new SqlParameter ("@extension", SqlDbType.VarChar, 5);
			param12.Direction = ParameterDirection.Input;
			param12.IsNullable = true;
			param12.Value = (extension);
			cmdinsert.Parameters.Add(param12);

			SqlParameter param13 = new SqlParameter ("@mail", SqlDbType.VarChar, 50);
			param13.Direction = ParameterDirection.Input;
			param13.IsNullable = false;
			param13.Value = (mail);
			cmdinsert.Parameters.Add(param13);

			SqlParameter param14 = new SqlParameter ("@estado", SqlDbType.Int, 4);
			param14.Direction = ParameterDirection.Input;
			param14.IsNullable = false;
			param14.Value = (estado);
			cmdinsert.Parameters.Add(param14);

			SqlParameter param15 = new SqlParameter ("@fecha_solic", SqlDbType.DateTime, 10);
			param15.Direction = ParameterDirection.Input;
			param15.IsNullable = false;
			param15.Value = (fecha_solic);
			cmdinsert.Parameters.Add(param15);

			SqlParameter param16 = new SqlParameter ("@fecha_val", SqlDbType.DateTime, 10);
			param16.Direction = ParameterDirection.Input;
			param16.IsNullable = true;
			param16.Value = (fecha_val);
			cmdinsert.Parameters.Add(param16);

			SqlParameter param17 = new SqlParameter ("@fecha_mod", SqlDbType.DateTime, 10);
			param17.Direction = ParameterDirection.Input;
			param17.IsNullable = true;
			param17.Value = (fecha_mod);
			cmdinsert.Parameters.Add(param17);

			SqlParameter param18 = new SqlParameter ("@funcion", SqlDbType.Int, 4);
			param18.Direction = ParameterDirection.Input;
			param18.IsNullable = false;
			param18.Value = (funcion);
			cmdinsert.Parameters.Add(param18);

			SqlParameter param19 = new SqlParameter ("@contrato_alta", SqlDbType.Int, 4);
			param19.Direction = ParameterDirection.Input;
			param19.IsNullable = true;
			param19.Value = (contrato_alta);
			cmdinsert.Parameters.Add(param19);

			SqlParameter param20 = new SqlParameter ("@contrato_vista", SqlDbType.Int, 4);
			param20.Direction = ParameterDirection.Input;
			param20.IsNullable = true;
			param20.Value = (contrato_vista);
			cmdinsert.Parameters.Add(param20);

			try 
			{
				cmdinsert.ExecuteNonQuery();
			}
			catch (Exception errorMens)
			{
				return errorMens.Message;
			}
			finally 
			{
				cmdinsert.Connection.Close();
			}
			return "ok";
		}
Bueno, resulta, que algunos campos de formulario no son obligatorios, de modo que el usuario debería poder dejarlos en blanco y que la Insert funcionara correctamente. Como veis, en la definición de parametros del servicio SOAP se especifica (en cada uno de ellos) si el parametro puede ser nulo o no:

parametro.IsNullable = false; //No puede ser nulo.
parametro.IsNullable = True; //Puede ser nulo.

Pero esto no me sirve de nada, o casi nada, por que, si el usuario deja campos vacios, en la llamada al servicio SOAP desde la página web me salta un error diciendo que la cadena no es válida, es decir, si el usuario deja vacio el campo TBFechaMod.Text, que no es obligatorio, cuando se ejecuta la llamada a la función SOAP, me da el error por que DateTime.Parse(TBFechaMod.Text) no es un formato de fecha válido, ya que está vacio... y así con todos los campos 'nulables' que el usuario no rellene...

No se si habré conseguido explicarme...

¿Se os ocurre alguna forma de que no pete, de que pase un valor null cuando el campo está vacio?

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 26/04/2005, 05:00
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
if TBFechaMod.Text<>""
paramx.value = DateTime.Parse(TBFechaMod.Text)
else
paramx.value = System.DBNull.Value
end if
  #3 (permalink)  
Antiguo 26/04/2005, 05:34
Avatar de Scour  
Fecha de Ingreso: octubre-2003
Ubicación: Murcia (España)
Mensajes: 94
Antigüedad: 20 años, 6 meses
Puntos: 0
Muy buenas José, gracias por tu pronta respuesta, pero verás, efectivamente, en el SOAP tengo que poner eso que me indicas, lo que pasa es que el error no me lo da en el SOAP, de hecho, ni tan siquiera llega a ejecutarlo. ¿Por qué?, si en la declaración del SOAP, le he especificado que los parametros que recibe son, por ejemplo, string var1, int var2, DateTime var3... etc, no puedo pasarle un null, me da error en la cadena, por que la cadena no es válida...

Se me está ocurriendo poner que lo reciba todo como string, y antes de hacer la llamada comprobar si los campos están vacios, si lo están, meterle a los campos en la llamada el valor "vacio", y en SOAP mirar a ver si está vacio, y si es así, entonces pasarle al Insert el System.DBNull.Value que me indicas... (Me acaba de venir la inspiración mientras te contestaba, lo escribo para que no se me olvide, que ahora tengo que ir a comer... ).

Saludos y gracias.
  #4 (permalink)  
Antiguo 26/04/2005, 08:25
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Bien, pues si ya te lo dices tu solo todo, jeje, el problema es que si obligas a las variables a ser de un tipo, p.ej. si id_departamento es un integer no podrás asignarle null, para eso las tendrás que declarar como object, no se si me explico, ok??
  #5 (permalink)  
Antiguo 26/04/2005, 08:35
Avatar de Scour  
Fecha de Ingreso: octubre-2003
Ubicación: Murcia (España)
Mensajes: 94
Antigüedad: 20 años, 6 meses
Puntos: 0
Lo que me refería era a pasar todos los campos como string, que el SOAp en la declaración los esperara así, y comprobar en la página web si el campo está vacio, si es así escribir en la variable que paso al SOAP la palabra "vacio" o un código o lo que sea, y ya en SOAP, leer la variable, y si pone dicho código, pasarle al insert el BDNull, y si no, el valor que contenga... no se si me explico... Lo he probado ya y funciona... lo que pasa es que hasta que te viene la inspiración estas dando vueltas y mareando la perdiz... :P

Salud!!
  #6 (permalink)  
Antiguo 26/04/2005, 08:44
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
ok ok ok ok ok
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:19.