ExecuteNonQuery:尚未初始化Connection属性。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExecuteNonQuery:尚未初始化Connection属性。相关的知识,希望对你有一定的参考价值。

下午,所以我已经在这个问题上待了几个小时,并且无法真正超越这最后一个驼峰。以下是我写的这个程序的代码:

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();  
      }   
    }  
  }  
} 

代码编译正常,没有错误或警告,但当我去运行它,一旦它到达cmd.InsertCommand.ExecuteNonQuery();我收到以下错误:

ExecuteNonQuery:尚未初始化Connection属性。

关于我错过的任何想法?

答案

您需要将连接分配给SqlCommand,您可以使用constructorproperty

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

我强烈建议使用using-statement用于实现像IDisposable这样的SqlConnection的任何类型,它也会关闭连接:

using(var connection1 = new SqlConnection(@"Data Source=.sqlexpress;Initial Catalog=syslog2;Integrated Security=True"))
using(var 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
}

除此之外,您不需要为DataAdapter中的每个条目创建新连接和foreach,即使创建,打开和关闭连接并不意味着ADO.NET将创建,打开和关闭物理连接但只是看起来进入connection-pool以获得可用的连接。然而,这是一个不必要的开销。

另一答案

你没有初始化连接。这就是为什么会出现这种错误的原因。

你的代码:

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

更正代码:

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

这里有几件事不对。

  1. 您真的想要为每个日志条目打开和关闭连接吗?
  2. 难道你不应该使用SqlCommand而不是SqlDataAdapter
  3. 数据适配器(或SqlCommand)完全需要错误消息告诉您缺少的内容:活动连接。仅仅因为你创建了一个连接对象并没有神奇地告诉C#它是你想要使用的那个(特别是如果你还没有打开连接)。

我强烈推荐使用C#/ SQL Server教程。

另一答案

实际上,当服务器建立连接但由于识别连接功能标识符失败而无法构建时会发生此错误。通过在代码中键入连接函数可以解决此问题。为此,我举一个简单的例子。在这种情况下,功能可能会有所不同。

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

打开和关闭连接需要花费很多时间。并使用“使用”作为另一个成员建议。我稍微改变了你的代码,但是把你的循环中的SQL创建和打开和关闭都打开了。哪个应该加快执行速度。

  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
        }
另一答案

试试吧..

在执行connection.open()之前,你需要在SqlCommand.Connection对象上使用ExecuteNonQuery()打开连接

另一答案

双击您的表单以创建form_load事件。然后在该事件内写入command.connection =“您的连接名称”;

以上是关于ExecuteNonQuery:尚未初始化Connection属性。的主要内容,如果未能解决你的问题,请参考以下文章

错误 ExecuteNonQuery:连接属性尚未初始化 C# (Access)

ExecuteNonQuery:尚未初始化Connection属性。

VB.NET SQL Server 插入 - ExecuteNonQuery:连接属性尚未初始化

C# 中的事务和 ExecuteNonQuery 错误

Dapper事务操作

c# ExecuteNonQuery 总是返回零