none
用c#做了个,sqlServer2005里面那个事件监控器一样的程序,启动问题请帮看看 RRS feed

  • 问题

  • 用c#做了个,sqlServer2005里面那个事件监控器一样的程序,可以实时查看执行的脚本以及其他信息.

    然后把程序放到没有安装sqlserver2005或者说放在sqlserver2008的环境下的时候出现错误提示

    (Failed to initialize object as reader.)

    这个程序我只是在这个链接引用了这个dll文件,而且发布的时候这个dll文件也放在程序的目录下面.就是启动程序就报错无法进行监控.

    C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll

    整个程序逻辑是在没有安装sqlServer的机器上跑这个程序但是所监控的数据库是另一个服务器的.

    请问这个如果不安装sqlserver2005,如何引用起来呢,是不是需要安装其他组件即可?望指教

     

    2013年11月28日 8:45

答案

  • 这一篇

    http://www.cnblogs.com/huyong/p/3214456.html

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    ,我们可以完成像SQLSERVER企业管理器一样的功能,非常强大,看你怎么使用了,在此仅抛砖引玉。我们需要在我们的项目中添加两个dll文件的引用,分别为:

    Microsoft.SqlServer.ConnectionInfo.dll

    Microsoft.SqlServer.Management.Sdk.Sfc.dll

    2013年11月29日 9:21
  • 我反编译了SQLSERVER的公用DLL

    我安装的是SQL2005

    路径:C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

    发现Microsoft.SqlServer.ConnectionInfo.dll里面没有TraceServer 这个类

    只有Microsoft.SqlServer.ConnectionInfoExtended这个DLL才有

    我觉得LZ一定是看了这一篇文章,要做一个SQL TRACE工具出来

    使用Trace Management Object监测和诊断SQL Server(一)

    不好意思,路径贴出错了

    SQL2005是C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies

    SQL2008才是C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

    SQL2012是:C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies

    我观察到SQL2005只有Microsoft.SqlServer.ConnectionInfo.dll DLL文件

    而从SQL2008开始才有Microsoft.SqlServer.ConnectionInfoExtended.dll DLL文件


    2013年11月29日 11:42
  • using Microsoft.SqlServer.Management.Common;
    using System;
    using System.Runtime.InteropServices;
    namespace Microsoft.SqlServer.Management.Trace
    {
    	[ComVisible(false)]
    	public class TraceServer : TraceReader
    	{
    		private ITraceObjectsRowsetController rowsetCtrl;
    		public void InitializeAsReader(ConnectionInfoBase serverConnInfo, string profileFileName)
    		{
    			try
    			{
    				this.rowsetCtrl = (TraceUtils.CreateInstance("\\Binn\\pfclnt.dll", "Microsoft.SqlServer.Management.Trace.CTraceObjectsRowsetController") as ITraceObjectsRowsetController);
    				this.rowsetCtrl.Initialize(serverConnInfo, profileFileName);
    				this.rowsetCtrl.InitSource(false);
    				this.traceController = this.rowsetCtrl;
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotInitializeAsReader", ex);
    			}
    		}
    		public void Pause()
    		{
    			try
    			{
    				this.rowsetCtrl.Pause();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotPause", ex);
    			}
    		}
    		public void Restart()
    		{
    			try
    			{
    				this.rowsetCtrl.Restart();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotRestart", ex);
    			}
    		}
    		public void Stop()
    		{
    			try
    			{
    				this.rowsetCtrl.Stop();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotStop", ex);
    			}
    		}
    	}
    }
    

    代码里有这一个方法

    public void InitializeAsReader(ConnectionInfoBase serverConnInfo, string profileFileName)
    {
    try
    {
    this.rowsetCtrl = (TraceUtils.CreateInstance("\\Binn\\pfclnt.dll", "Microsoft.SqlServer.Management.Trace.CTraceObjectsRowsetController") as ITraceObjectsRowsetController);
    this.rowsetCtrl.Initialize(serverConnInfo, profileFileName);
    this.rowsetCtrl.InitSource(false);
    this.traceController = this.rowsetCtrl;
    }
    catch (Exception ex)
    {
    TraceUtils.FilterException(ex);
    throw new SqlTraceException(typeof(StringConnectionInfo), "CannotInitializeAsReader", ex);
    }
    }

    2013年11月29日 11:43

全部回复

  • 不需要安装SQLSERVER的,我之前做的一个程序连接数据库实例的时候都用到过这个DLL

    如何使用 SMO 的 SQL Server 2008年版本的应用程序使用 SMO 的 SQL Server 2005 版本中的新功能

    或者你使用SQL2008的Microsoft.SqlServer.ConnectionInfo.dll就可以

    2013年11月28日 13:08
  • 测试了下还是无法启动报错

    无法将对象初始化为读取器。

    整套程序本地很正常使用到了服务端就报这个错,差距就是没有安装sql2005,目前我就是不清楚这个dll文件是否需要注册.

    2013年11月29日 4:32
  • 不需要注册的
    2013年11月29日 4:52
  •   SqlConnectionInfo connInfo = new SqlConnectionInfo(); 
                    TraceServer trcReader = new TraceServer();
                    connInfo.ServerName = "192.168.100";
                    connInfo.UserName = "sa";
                    connInfo.Password = "sa";
                    connInfo.UseIntegratedSecurity = false;
                    string strAppPath = System.Windows.Forms.Application.StartupPath;
                    MessageBox.Show(connInfo.ConnectionString);
                    MessageBox.Show(strAppPath + @"\SqlMonitoring.trc");
                    
                    trcReader.InitializeAsReader(connInfo, strAppPath + @"\SqlMonitoring.trc");
    我用的sql2005这就是实现代码.难道有什么不妥么
    2013年11月29日 5:09
  • 可否提供下你实现的方法以及所引用的dll文件

    2013年11月29日 8:46
  • 之前有,不过电脑重装了之后没有了,网上有一些例子的,不过暂时没有找到,不好意思LZ
    2013年11月29日 9:19
  • 这一篇

    http://www.cnblogs.com/huyong/p/3214456.html

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    ,我们可以完成像SQLSERVER企业管理器一样的功能,非常强大,看你怎么使用了,在此仅抛砖引玉。我们需要在我们的项目中添加两个dll文件的引用,分别为:

    Microsoft.SqlServer.ConnectionInfo.dll

    Microsoft.SqlServer.Management.Sdk.Sfc.dll

    2013年11月29日 9:21
  • 先谢谢大家了,功能现在实现了,就是在没有安装sqlserver的环境下无法运行,如果这样的话,我可能需要考虑其他的解决方案了,毕竟sqlserver并非是客户必须安装的环境,不像.net3.5那种事必须并且还自带的
    2013年11月29日 9:31
  • 我反编译了SQLSERVER的公用DLL

    我安装的是SQL2005

    路径:C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

    发现Microsoft.SqlServer.ConnectionInfo.dll里面没有TraceServer 这个类

    只有Microsoft.SqlServer.ConnectionInfoExtended这个DLL才有

    我觉得LZ一定是看了这一篇文章,要做一个SQL TRACE工具出来

    使用Trace Management Object监测和诊断SQL Server(一)

    不好意思,路径贴出错了

    SQL2005是C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies

    SQL2008才是C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies

    SQL2012是:C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies

    我观察到SQL2005只有Microsoft.SqlServer.ConnectionInfo.dll DLL文件

    而从SQL2008开始才有Microsoft.SqlServer.ConnectionInfoExtended.dll DLL文件


    2013年11月29日 11:42
  • using Microsoft.SqlServer.Management.Common;
    using System;
    using System.Runtime.InteropServices;
    namespace Microsoft.SqlServer.Management.Trace
    {
    	[ComVisible(false)]
    	public class TraceServer : TraceReader
    	{
    		private ITraceObjectsRowsetController rowsetCtrl;
    		public void InitializeAsReader(ConnectionInfoBase serverConnInfo, string profileFileName)
    		{
    			try
    			{
    				this.rowsetCtrl = (TraceUtils.CreateInstance("\\Binn\\pfclnt.dll", "Microsoft.SqlServer.Management.Trace.CTraceObjectsRowsetController") as ITraceObjectsRowsetController);
    				this.rowsetCtrl.Initialize(serverConnInfo, profileFileName);
    				this.rowsetCtrl.InitSource(false);
    				this.traceController = this.rowsetCtrl;
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotInitializeAsReader", ex);
    			}
    		}
    		public void Pause()
    		{
    			try
    			{
    				this.rowsetCtrl.Pause();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotPause", ex);
    			}
    		}
    		public void Restart()
    		{
    			try
    			{
    				this.rowsetCtrl.Restart();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotRestart", ex);
    			}
    		}
    		public void Stop()
    		{
    			try
    			{
    				this.rowsetCtrl.Stop();
    			}
    			catch (Exception ex)
    			{
    				TraceUtils.FilterException(ex);
    				throw new SqlTraceException(typeof(StringConnectionInfo), "CannotStop", ex);
    			}
    		}
    	}
    }
    

    代码里有这一个方法

    public void InitializeAsReader(ConnectionInfoBase serverConnInfo, string profileFileName)
    {
    try
    {
    this.rowsetCtrl = (TraceUtils.CreateInstance("\\Binn\\pfclnt.dll", "Microsoft.SqlServer.Management.Trace.CTraceObjectsRowsetController") as ITraceObjectsRowsetController);
    this.rowsetCtrl.Initialize(serverConnInfo, profileFileName);
    this.rowsetCtrl.InitSource(false);
    this.traceController = this.rowsetCtrl;
    }
    catch (Exception ex)
    {
    TraceUtils.FilterException(ex);
    throw new SqlTraceException(typeof(StringConnectionInfo), "CannotInitializeAsReader", ex);
    }
    }

    2013年11月29日 11:43
  • LZ的问题下面这篇文章已经给出了解释:

    使用Trace Management Object监测和诊断SQL Server(一)

    在SQL Server 2005里TMO对象被实现在了Microsoft.SqlServer.ConnectionInfo.dll里,

    在SQL Server 2008里TMO对象则被移到了Microsoft.SqlServer.ConnectionInfoExtended.dll里,

    但仍然在Microsoft.SqlServer.Management.Trace命名空间里。

    sqlServer2005里面那个事件监控器一样的程序,可以实时查看执行的脚本以及其他信息.
    
    然后把程序放到没有安装sqlserver2005或者说放在sqlserver2008的环境下的时候出现错误提示


    2013年11月29日 11:53
  • 谢谢大家解答,这篇文章看过,基本就是按这个去实现的,监控都没问题.现在发现监控需要启动安装对应数据才可以运行,在没有安装sql数据库的环境似乎怎么也没运行起来.老是出现无法初始化对象的情况
    2013年12月2日 1:09
  • 你是使用了 Profile 的功能吧, 这个是 32 位的,确认下你的程序是否编译为 32 位的, 如果不是,编译为仅 32 位模式再试试
    2013年12月2日 2:36
  • 邹建大侠的意思是:安装了64位SQL之后,有了64位DLL,就没有问题了?
    2013年12月2日 3:02
  • 没有 64 位的 profile 组件

    2013年12月2日 6:28
  • 今天做了测试安装sql2005后正常使用,然后为了确定是环境问题,卸载sql2005后就出现(无法初始对象)的错误

    2013年12月3日 0:56
  • You need sql connection component at least if want to connect to sql server.
    2013年12月3日 1:56
  • 其实LZ您可以调试一下您的代码,在VS里看究竟执行到哪一步报出

    (Failed to initialize object as reader.)

    如果执行到第三方dll的时候报错,那么问题可以确定到第三方dll那么你看一下这个dll的路径,你没有安装sql和安装sql进行比较一下

    2013年12月3日 15:20