2012-04-21 20 views
8

Tarde, Así que he estado en este problema durante horas y realmente no puedo pasar esta última joroba. A continuación se muestra el código para este programa que estoy escribiendo:ExecuteNonQuery: la propiedad de conexión no se ha inicializado.

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 se compila bien sin error o una advertencia, pero cuando voy a ejecutarlo, tan pronto como se pone a cmd.InsertCommand.ExecuteNonQuery(); Me aparece el siguiente error:

ExecuteNonQuery: Connection property has not been initialized.

¿Alguna idea sobre lo que me perdí?

+1

cmd.InsertCommand.Connection = connection1; – Alan

+0

(por cierto, abrir una nueva conexión para cada entrada de registro es un no-no). – Alan

Respuesta

24

Es necesario asignar la conexión a la SqlCommand, se puede utilizar el constructor o la property:

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

recomiendo encarecidamente utilizar el using-statement para cualquier tipo de aplicación de IDisposable como SqlConnection, también a 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 que no es necesario crear una nueva conexión y DataAdapter para cada entrada en el foreach, incluso si la creación, apertura y cierre de una conexión hace no quiere decir que ADO.NET creará, abrir y cerrar una conexión física pero sólo se ve en el connection-pool para una conexión disponible. Sin embargo, es una sobrecarga innecesaria.

1

Un par de cosas mal aquí.

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

  2. ¿No debería estar utilizando SqlCommand en 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 encarecidamente un tutorial de C#/SQL Server.

-1

Intenta esto ..

es necesario abrir la conexión mediante connection.open() en el objeto SqlCommand.Connection antes de ejecutar ExecuteNonQuery()

8

No está inicializando de connection.That por qué este tipo de error viene a ti.

Su código: Código

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

Corregido:

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

En realidad este error se produce cuando el servidor hace la conexión, pero no se puede construir debido a un fallo en la identificación de identificador de 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); 
-1

haga doble clic en el formulario para crear event.Then Form_Load dentro de ese evento de escritura command.connection = "el nombre de conexión";

0

Abrir y cerrar la conexión lleva mucho tiempo. Y use el "uso" como sugirió otro miembro. Cambié su código ligeramente, 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 
     } 
Cuestiones relacionadas