ExecuteNonQuery: la propiedad de conexión no se ha inicializado.

Por la tarde, así que he estado en este tema durante horas y realmente no puedo pasar esta última joroba. Debajo está el código para este progtwig que estoy escribiendo:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace Test { class Program { static void Main() { EventLog alog = new EventLog(); alog.Log = "Application"; alog.MachineName = "."; foreach (EventLogEntry entry in alog.Entries) { SqlConnection connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True"); SqlDataAdapter cmd = new SqlDataAdapter(); cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) "); cmd.InsertCommand.Parameters.Add("@EventLog",SqlDbType.VarChar).Value = alog.Log; cmd.InsertCommand.Parameters.Add("@TimeGenerated", SqlDbType.DateTime).Value = entry.TimeGenerated; cmd.InsertCommand.Parameters.Add("@EventType", SqlDbType.VarChar).Value = entry.EntryType; cmd.InsertCommand.Parameters.Add("@SourceName", SqlDbType.VarChar).Value = entry.Source; cmd.InsertCommand.Parameters.Add("@ComputerName", SqlDbType.VarChar).Value = entry.MachineName; cmd.InsertCommand.Parameters.Add("@InstanceId", SqlDbType.VarChar).Value = entry.InstanceId; cmd.InsertCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = entry.Message; connection1.Open(); cmd.InsertCommand.ExecuteNonQuery(); connection1.Close(); } } } } 

El código comstack bien sin error o advertencia, pero cuando voy a ejecutarlo, tan pronto como llega a cmd.InsertCommand.ExecuteNonQuery (); Obtuve el siguiente error:

ExecuteNonQuery: la propiedad de conexión no se ha inicializado.

¿Alguna idea sobre lo que me perdí?

Debe asignar la conexión al SqlCommand , puede usar el constructor o la propiedad :

 cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) "); cmd.InsertCommand.Connection = connection1; 

Recomiendo utilizar la using-statement para cualquier tipo de implementación de IDisposable como SqlConnection , también cerrará la conexión:

 using(var connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True")) { SqlDataAdapter cmd = new SqlDataAdapter(); using(var insertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ")) { insertCommand.Connection = connection1; cmd.InsertCommand = insertCommand; //..... connection1.Open(); // .... you don't need to close the connection explicitely } } 

Aparte de eso, no es necesario crear una nueva conexión y DataAdapter para cada entrada en el foreach , incluso si la creación, la apertura y el cierre de una conexión no significa que ADO.NET creará, abrirá y cerrará una conexión física , sino que solo se verá en el grupo de conexiones para una conexión disponible. Sin embargo, es una sobrecarga innecesaria.

No estás inicializando la conexión. Por eso te llega este tipo de error.

Tu codigo:

 cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) "); 

Código corregido:

 cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ",connection1); 

Un par de cosas mal aquí.

  1. ¿Realmente desea abrir y cerrar la conexión para cada entrada de registro?

  2. ¿No deberías estar usando SqlCommand lugar de SqlDataAdapter ?

  3. El adaptador de datos (o SqlCommand ) necesita exactamente lo que el mensaje de error le dice que falta: una conexión activa. El hecho de que haya creado un objeto de conexión no le dice mágicamente a C # que es el que desea usar (especialmente si no ha abierto la conexión).

Recomiendo mucho un tutorial de C # / SQL Server.

En realidad, este error ocurre cuando el servidor hace la conexión pero no puede construir debido a un error al identificar el identificador de la función de conexión. Este problema se puede resolver escribiendo la función de conexión en el código. Para esto, tomo un ejemplo simple. En este caso, la función es con su puede ser diferente.

 SqlCommand cmd = new SqlCommand("insert into ptb(pword,rpword) values(@a,@b)",con); 

Abrir y cerrar la conexión lleva mucho tiempo. Y use el “uso” como sugirió otro miembro. Cambié un poco su código, pero puse la creación de SQL y la apertura y el cierre FUERA de su ciclo. Lo cual debería acelerar un poco la ejecución.

  static void Main() { EventLog alog = new EventLog(); alog.Log = "Application"; alog.MachineName = "."; /* ALSO: USE the USING Statement as another member suggested using (SqlConnection connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True") { using (SqlCommand comm = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ", connection1)) { // add the code in here // AND REMEMBER: connection1.Open(); } }*/ SqlConnection connection1 = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=syslog2;Integrated Security=True"); SqlDataAdapter cmd = new SqlDataAdapter(); // Do it one line cmd.InsertCommand = new SqlCommand("INSERT INTO Application VALUES (@EventLog, @TimeGenerated, @EventType, @SourceName, @ComputerName, @InstanceId, @Message) ", connection1); // OR YOU CAN DO IN SEPARATE LINE : // cmd.InsertCommand.Connection = connection1; connection1.Open(); // CREATE YOUR SQLCONNECTION ETC OUTSIDE YOUR FOREACH LOOP foreach (EventLogEntry entry in alog.Entries) { cmd.InsertCommand.Parameters.Add("@EventLog", SqlDbType.VarChar).Value = alog.Log; cmd.InsertCommand.Parameters.Add("@TimeGenerated", SqlDbType.DateTime).Value = entry.TimeGenerated; cmd.InsertCommand.Parameters.Add("@EventType", SqlDbType.VarChar).Value = entry.EntryType; cmd.InsertCommand.Parameters.Add("@SourceName", SqlDbType.VarChar).Value = entry.Source; cmd.InsertCommand.Parameters.Add("@ComputerName", SqlDbType.VarChar).Value = entry.MachineName; cmd.InsertCommand.Parameters.Add("@InstanceId", SqlDbType.VarChar).Value = entry.InstanceId; cmd.InsertCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = entry.Message; int rowsAffected = cmd.InsertCommand.ExecuteNonQuery(); } connection1.Close(); // AND CLOSE IT ONCE, AFTER THE LOOP } 

solo intenta esto …

necesita abrir la conexión usando connection.open() en el objeto SqlCommand.Connection antes de ejecutar ExecuteNonQuery()

Haga doble clic en su formulario para crear el evento form_load. Luego, dentro de ese evento, escriba command.connection = “your connection name”;