2012-03-18 10 views
5

Estoy desarrollando la aplicación CMS en C# (Framework 4.0) que se conecta a la base de datos MySQL (5.0.95) en el servidor remoto por MySQL Connector (6.5.4).C# con MySQL a través de Connector/NET

Tengo un problema al ejecutar consultas.

p. Ej. Mi cadena de conexión:

"Server=" + Options.DbServer + ";Database="+ Options.Database +";Uid=" + Options.DbUser + ";Pwd=" + Options.DbPassword + ";CharSet=utf8; Connect Timeout=30;"; 

tengo clase estática que maneja cosas relacionadas con la base de datos, y no tengo _Connection miembro privado.

private static MySqlConnection _connection; 
public static MySqlConnection Connection 
{ 
    get 
    { 
     if (_connection.State != ConnectionState.Open) 
      _connection.Open(); 

     return _connection; 
    } 
    set { _connection = value; } 
} 

Este es el método que inicializa la conexión:

public static bool Init(string cs) 
{ 
    _connection = new MySqlConnection(cs); 
    MySqlCommand command = new MySqlCommand("SET NAMES utf8", Connection); 
    command.ExecuteNonQuery(); 
    return true; 
} 

Este método es donde consigo excepción:

public static bool InsertRecord(MySqlCommand command) 
{ 
    command.Connection = Connection; 
    if(command.ExecuteNonQuery() > 0) 
     return true; 

    return false; 
} 

command.ExecuteNonQuery() ha producido una excepción: Fatal error encontrado durante la ejecución del comando.

Esto es Seguimiento de la pila ...

MySql.Data.MySqlClient.MySqlException was unhandled 
    Message=Fatal error encountered during command execution. 
    Source=MySql.Data 
    ErrorCode=-2147467259 
    Number=0 
    StackTrace: 
     at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
     at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 
     at CMS.Database.InsertRecord(MySqlCommand command) in C:\_myStuff\VS2010\CMS\CMS\Database.cs:line 95 
     at CMS.frmAddItem.btnDo_Click(Object sender, EventArgs e) in C:\_myStuff\VS2010\CMS\CMS\frmAddItem.cs:line 138 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.RunDialog(Form form) 
     at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) 
     at System.Windows.Forms.Form.ShowDialog() 
     at CMS.frmMain.btnNovi_Click(Object sender, EventArgs e) in C:\_myStuff\VS2010\CMS\CMS\frmMain.cs:line 381 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.RunDialog(Form form) 
     at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) 
     at System.Windows.Forms.Form.ShowDialog() 
     at CMS.frmLogin.DoLogin() in C:\_myStuff\VS2010\CMS\CMS\frmLogin.cs:line 55 
     at CMS.frmLogin.button2_Click(Object sender, EventArgs e) in C:\_myStuff\VS2010\CMS\CMS\frmLogin.cs:line 31 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at CMS.Program.Main() in C:\_myStuff\VS2010\CMS\CMS\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: MySql.Data.MySqlClient.MySqlException 
     Message=Fatal error encountered attempting to read the resultset. 
     Source=MySql.Data 
     ErrorCode=-2147467259 
     Number=0 
     StackTrace: 
      at MySql.Data.MySqlClient.MySqlDataReader.NextResult() 
      at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) 
     InnerException: MySql.Data.MySqlClient.MySqlException 
      Message=Reading from the stream has failed. 
      Source=MySql.Data 
      ErrorCode=-2147467259 
      Number=0 
      StackTrace: 
       at MySql.Data.MySqlClient.MySqlStream.LoadPacket() 
       at MySql.Data.MySqlClient.MySqlStream.ReadPacket() 
       at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId) 
       at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId) 
       at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) 
       at MySql.Data.MySqlClient.MySqlDataReader.NextResult() 
      InnerException: System.IO.EndOfStreamException 
       Message=Attempted to read past the end of the stream. 
       Source=MySql.Data 
       StackTrace: 
         at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count) 
         at MySql.Data.MySqlClient.MySqlStream.LoadPacket() 
       InnerException: 

¿Alguna sugerencia?

+2

'Mensaje = Intentó leer más allá del final de la secuencia. - Está ejecutando _reader_ en algún lugar. – Oded

+1

La stacktrace indica que ExecuteNonQuery llama a ExecuteReader. Diría que aún no te estás conectando con éxito a la base de datos. ¿Alguna vez llama a 'Init()'? – dwerner

+0

¿Qué es 'command' en el punto donde obtienes la excepción? Echa un vistazo allí. Los puntos de interrupción son útiles para examinar el estado antes de que ocurra la excepción ... – dwerner

Respuesta

6

He notado que abre conexiones, pero no las cierra cuando termina con ellas. Prefiero el enfoque de abrir conexiones cuando se necesitan, en lugar de abrirlas si no están abiertas. Pueden estar rancios.

Cache cadena de conexión pero no la conexión en sí.

public static string ConnectionString {get;set;} 

public static bool InsertRecord(sql) 
{ 
    bool success = false; 
    using (var con = new Connection(ConnectionString)){ 
     var command = new SqlCommand(sql,con); 
     success = (command.ExecuteNonQuery() > 0); 
    } 
    return success; 
} 

Los recursos deben liberarse cuando ya no sean necesarios.

+0

Sí, obviamente este es un mejor enfoque. Cambié mis métodos según su sugerencia, y las excepciones desaparecen. Por ahora. :) ¡Muchas gracias! – magic

+0

¡De nada! – dwerner

2

Sugiero que marque this informe de error con respecto a este problema.

+0

tiempo de espera predeterminado del comando = 3600; – dwerner

+1

@Mikhail Preyskurantov: Gracias por su sugerencia, pero en el ejemplo que me está indicando, el hombre tiene en algunas excepciones mensaje interno: '" El tiempo de espera expiró. El tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde ". No tengo ese mensaje en mi rastro de pila. Finalmente, agregué tiempo de espera de comando en mi cadena de conexión, pero la situación sigue siendo la misma. – magic

1

MySQL utiliza un grupo de diferentes variables de tiempo de espera en diferentes niveles.

cuando se está estableciendo la conexión ->connect_timeout

Cuando servidor espera inactivo durante otra consulta que se enviarán ->wait_timeout

Si se está leyendo consulta o conjunto de resultados está siendo enviado de vuelta - >net_read_timeout y net_write_timeout

Tanto net_write_timeout y net_read_timeout son en sí Las variables de nivel de instancia, por lo que podría simplemente cambiarlas por conexiones cuando sepa que la consulta será problemática y, por lo tanto, no afectará al resto del servidor. (Como una solución)

Pero en primer lugar, usted debe comprueba el valor por defecto para cada uno de estos valores de tiempo de espera en el servidor mediante la ejecución de algo como:

show variables like '%timeout%' 

También debe buscar en el comando que está insertando y ver si se puede simplificar o desglosar las actualizaciones más pequeñas.

+0

Estos son mis valores: net_read_timeout net_write_timeout Entonces, ¿significa que el tiempo de espera de lectura es de 30 segundos? Mi consulta es de hecho muy simple, estoy insertando registro en la tabla con 4 columnas. – magic

+0

sí, parece tan ^^ ¿Coincide con el tiempo que tarda en colgarse? prueba 'SET @@ session.net_read_timeout = 360;' antes de la consulta de inserción si ese es el caso. – Kharaone

+0

No, se bloquea casi de inmediato, por lo que no creo que aumentar este tiempo de espera lo ayude. – magic

Cuestiones relacionadas