下午 所以我已经在这个问题上待了几个小时,并且无法真正超越这个最后的驼峰。以下是我正在编写的这个程序的代码:
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属性。
关于我错过的任何想法?
答案 0 :(得分:33)
您需要为SqlCommand
分配连接,您可以使用constructor或property:
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以获取可用连接。然而,这是一个不必要的开销。
答案 1 :(得分:10)
您没有初始化连接。这就是为什么会发生这种错误的原因。
您的代码:
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);
答案 2 :(得分:1)
这里有些不对劲。
您真的想要为每个日志条目打开和关闭连接吗?
您不应该使用SqlCommand
代替SqlDataAdapter
吗?
数据适配器(或SqlCommand
)完全需要错误消息告诉您缺少的内容:活动连接。仅仅因为你创建了一个连接对象并没有神奇地告诉C#它是你想要使用的那个(特别是如果你还没有打开连接)。
我强烈推荐使用C#/ SQL Server教程。
答案 3 :(得分:1)
实际上,当服务器建立连接时会发生此错误,但由于无法识别连接功能标识符而无法构建。通过在代码中键入连接函数可以解决此问题。为此,我举一个简单的例子。在这种情况下,函数可能会有所不同。
SqlCommand cmd = new SqlCommand("insert into ptb(pword,rpword) values(@a,@b)",con);
答案 4 :(得分:0)
打开和关闭连接需要花费很多时间。并使用"使用"正如另一位成员所说。 我稍微改变了你的代码,但是把你的循环中的SQL创建和打开和关闭都打开了。哪个应该加快执行速度。
style={{backgroundColor:"#41bedd"}}
答案 5 :(得分:-1)
试试吧..
在执行connection.open()
之前,您需要使用SqlCommand.Connection
对象上的ExecuteNonQuery()
打开连接
答案 6 :(得分:-1)
双击您的表单以创建form_load事件。然后在该事件内写入command.connection ="您的连接名称&#34 ;;