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

Increible y extraño error con una cadena

Estas en el tema de Increible y extraño error con una cadena en el foro de .NET en Foros del Web. Hola, resulta que cuando un cliente se conecta al servidor, este tiene que ejecutar una actualización a la base de datos (que dicho sea de ...
  #1 (permalink)  
Antiguo 12/11/2005, 18:15
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Increible y extraño error con una cadena

Hola, resulta que cuando un cliente se conecta al servidor, este tiene que ejecutar una actualización a la base de datos (que dicho sea de paso, todavía no puedo hacerla funcionar co una conexión remota), la cual, como es lógico, la elaboro concatenando una serie de cadenas.
Quedaría algo así:

"Update Usuarios Set Estado = 1 Where Nickname = '" & ClientInfo.Nickname & "'"

Bueno, ClientInfo es una estructura en donde guardo los datos relevantes del cliente, por ejemplo el socket utilizado para comunicarse, un objeto IPEndPoint y el nickname.

La cuestión es que nunca me añade la última comilla simple a la cadena, lo cual al momento de ejecutarse la consulta a la base de datos me marca error de sintaxis!.
Probé concatenarlas de mil formas distintas, a través de un array, a través del método Concat, a través de un StringBuilder, etc, y no hay forma de que esa última comilla simple se me añada.
He podido comprobar que el problema está con la estructura, y no entiendo por que.
Hice lo siguiente:

Primer prueba:

Dim Variable As String = "Mariano"

'Concateno esta variable a la cadena larga

'--> el resultado es el esperado

Segunda prueba:

Dim Variable As String = ClientInfo.Nickname

'Concateno esta variable a la cadena larga

'--> no me añade la última comilla simple

Es decir que el problema no está en el método de concatenación, sino en la estructura ClientInfo.

Alguien tiene una pista de que me puede estar pasando?

Muchas gracias de antemano.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 12/11/2005, 18:27
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
No debería pasar eso, de todos modos muestras muy poco código..., personalmente para esos casos utilizo el método Format de la clase String, para que el código sea más legible y evitar esos _problemas_

Dim str as String = String.Format("Update Usuarios Set Estado = 1 Where Nickname = '{0}', ClientInfo.Nickname)

Saludos
PS. Sería mejor si pones las cosas que estás intentando...
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 12/11/2005, 19:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Disculpa Xknown, lo que pasa es que no hay mucho más que mostrar, osea esa es la parte relevante del código. SImplemente estoy tratando de concatenar una cadena, que por alguna rara razón no me agrega la comilla simple al final de esta, justo después de llamar a ClientInfo.Nickname. Es simplemente eso.
Ahora, intenté hacerlo con String.Format, y me sale lo mismo!. Es muy raro no?.
En la misma estructura guardo un objeto IPEndPoint, y cuando ClientInfo.IP.ToString, me sale de manera correcta, osea que tampoco el error viene por el lado de la estructura en sí, si no especificamente cuando llamo a ClientInfo.Nickname.

Te voy a hacer caso, y acá te pongo el fragmento del código:

Dim BufferForNickname() AsByte

BufferForNickname =
NewByte(100) {}

ClientInfo.Socket = Listener.AcceptSocket()

CurrentThreadClient = ClientInfo.Socket.RemoteEndPoint()

ClientInfo.Ip = CurrentThreadClient

ClientInfo.Socket.Receive(BufferForNickname, BufferForNickname.Length, SocketFlags.None)

ClientInfo.Nickname = System.Text.Encoding.ASCII.GetString(BufferForNick name)

ClientInfo.Thread =
New Thread(AddressOf Read)

SyncLockMe

Clients.Add(CurrentThreadClient.ToString(), ClientInfo)

Dim Conn AsNew OleDbConnection(ConnectionString)

Dim Cmd AsNew OleDbCommand()

Dim str AsString = str.Format("Update Usuarios Set UsuarioEstado = 1
Where UsuarioNickname = '{0}'", ClientInfo.Ip.ToString)

MsgBox(str)

Cmd.CommandText = str

Cmd.Connection = Conn

Conn.Open()

Try

Cmd.ExecuteNonQuery()

Catch Ex As OleDbException

MsgBox(Ex.Message)

EndTry

Conn.Close()

EndSyncLock

RaiseEvent ClientConnected(CurrentThreadClient, ClientInfo.Nickname)

ClientInfo.Thread.Start()

Muchas gracias xknown por interesarte en el tema.

Saludos!.
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 12/11/2005, 20:53
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Hmm, el _problema_ es que estás definiendo un arreglo de bytes demasiado grande para los datos que recibes, al momento de convertir esos bytes en un string, estos se reemplazan por el caracter 0 (\0 en c#), teniendo como resultado un string de 100 caracteres. Ahora, para solucionar esto, puedes recibir el número exacto de bytes que te envían o hacer un _hack_:
<font size="2">
Código PHP:
ClientInfo.Nickname System.Text.Encoding.UTF8.GetString(BufferForNickname).Replace(Chr(0), ""
Saludos
PS. Es mejor usar UTF8. No es necesario que me pidas disculpas.
__________________
Alex Concha
Buayacorp - Programación y Diseño

Última edición por xknown; 12/11/2005 a las 21:12
  #5 (permalink)  
Antiguo 13/11/2005, 06:22
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años
Puntos: 9
Maestro!, ahora si funciona!, un millón de gracias.
Que diferencia hay entre una codificación-decodificacion ASCII y UTF8?.
He prestado atención a lo que me dijiste de determinar exactamente cual es el tamaño de arreglo de bytes. Esto con TcpClient lo puedo hacer de manera correcta con solo llamar a TcpClientObj.ReceiveBufferSize, pero como lo hago en el servidor?. La clase TcpListener no tiene este método.
Nuevamente muchas gracias xknown.
Saludos!.
__________________
Add, never Remove
  #6 (permalink)  
Antiguo 13/11/2005, 08:37
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Cita:
Que diferencia hay entre una codificación-decodificacion ASCII y UTF8?
http://es.wikipedia.org/wiki/UTF-8
http://es.wikipedia.org/wiki/ASCII
Cita:
He prestado atención a lo que me dijiste de determinar exactamente cual es el tamaño de arreglo de bytes. Esto con TcpClient lo puedo hacer de manera correcta con solo llamar a TcpClientObj.ReceiveBufferSize, pero como lo hago en el servidor?. La clase TcpListener no tiene este método.
http://msdn.microsoft.com/library/sp...classtopic.asp

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
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 18:09.