进行数据库跟踪分析的工具
来源:互联网 发布:win10输入网络凭证 编辑:程序博客网 时间:2024/06/04 01:20
笔者以SQLServer为例,写了个分析数据库的工具,下边的是主要代码:
Form1.cs
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Collections;using System.Threading;using System.Data.SqlClient;namespace Database_tracking{ public partial class Form1 : Form { private int ThreadState = 1;//Thread运行状态,0为运行,1停止 private string configPath = Application.StartupPath + "\\config.ini"; /****操作INI文件开始***********/ [System.Runtime.InteropServices.DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 声明INI文件的读操作函数 GetPrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); public string ReadValue(string section, string key) { // 每次从ini中读取多少字节 System.Text.StringBuilder temp = new System.Text.StringBuilder(255); // section=配置节,key=键名,temp=上面,path=路径 GetPrivateProfileString(section, key, "", temp, 255, configPath); return temp.ToString(); } public void Writue(string section, string key, string value) { // section=配置节,key=键名,value=键值,path=路径 WritePrivateProfileString(section, key, value, configPath); } /*****操作INI文件结束**********/ public Form1() { InitializeComponent(); this.FormClosing += new FormClosingEventHandler(Form1_Closing); } private void Form1_Closing(object sender, FormClosingEventArgs e) { if (this.ThreadState != 1) { MessageBox.Show("Please stop all the thread first."); e.Cancel = true; } else { for (int i = 0; i < mThread.Length; i++) { if (mThread[i] != null) { if (mThread[i].IsAlive==true) { mThread[i].Abort(); } } } this.Dispose(); } } //private ArrayList mThread=new ArrayList(); private Thread[] mThread; private void button2_Click(object sender, EventArgs e) { //开始执行 if (button2.Text == "Start") { SetText("Starting..."); ThreadState = 0; listView1.Items.Clear(); cDataIndex = 0; lCount = 0; //启动线程 SetObjectStatus(false, button1); SetObjectStatus(false, button3); if (mDataBase.Length <= int.Parse(MyModel.ThreadCount)) { MyModel.ThreadCount = mDataBase.Length.ToString(); } ChangeValue("Stop"); for (int i = 0; i < int.Parse(MyModel.ThreadCount); i++) { mThread[i] = new Thread(ThreadWork); mThread[i].IsBackground = true; mThread[i].Name = i.ToString(); mThread[i].Start(); } } else { ThreadState = 1; ChangeValue("Start"); } } private void button1_Click(object sender, EventArgs e) { Config s = new Config(); s.ShowDialog(); } private string[] mDataBase; private int cDataIndex = 0;//当前运行的数字 private void Form1_Load(object sender, EventArgs e) { MyModel.MasterServer = ReadValue("Main", "MasterServer"); MyModel.MasterUid = ReadValue("Main", "MasterUid"); MyModel.MasterPwd = ReadValue("Main", "MasterPwd"); MyModel.MirrorServer = ReadValue("Main", "MirrorServer"); MyModel.MirrorUid = ReadValue("Main", "MirrorUid"); MyModel.MirrorPwd = ReadValue("Main", "MirrorPwd"); MyModel.ThreadCount = ReadValue("Main", "ThreadCount"); MyModel.Library = ReadValue("Main", "Library"); mThread = new Thread[(int.Parse(MyModel.ThreadCount))]; //将数据库名称存入数组 mDataBase = MyModel.Library.Split(new char[]{','}); } delegate void ChangeTextValue(string s); private void ChangeValue(string s) { if (this.button2.InvokeRequired) { ChangeTextValue d = new ChangeTextValue(ChangeValue); this.Invoke(d, new object[] { s }); } else { this.button2.Text = s; } } delegate void SetS(string s); private void SetText(string s) { if (this.button2.InvokeRequired) { SetS d = new SetS(SetText); this.Invoke(d, new object[] { s }); } else { this.Status.Text =DateTime.Now.ToString() + " " + s; } } private void ThreadWork() { while(true) { switch(ThreadState) { case 0: lock (this.button2) { //执行检测 CheckDataBase(); try { Thread.Sleep(50); //MessageBox.Show(Thread.CurrentThread.Name + " Close"); SetText("Complete..."); SetObjectStatus(true, button1); SetObjectStatus(true, button3); ChangeValue("Start"); Thread.CurrentThread.Abort(); } catch { } finally { Thread.CurrentThread.Abort(); } } break; case 1: try { Thread.Sleep(50); } catch { } finally { Thread.CurrentThread.Abort(); } break; } } } private int lCount = 0;//总记录数 delegate void a(string ID,string DataBaseName ,string tableName,string MasterRecordCount,string MirrorRecordCount,string same); private void newLine(string ID, string DataBaseName , string tableName, string MasterRecordCount, string MirrorRecordCount, string same) { if (this.listView1.InvokeRequired) { a s = new a(newLine); this.Invoke(s, new object[]{ID,DataBaseName,tableName ,MasterRecordCount,MirrorRecordCount,same}); } else { ListViewItem Temp=new ListViewItem(); Temp.Text=(ID); Temp.SubItems.Add(DataBaseName); Temp.SubItems.Add(tableName); Temp.SubItems.Add(MasterRecordCount); Temp.SubItems.Add(MirrorRecordCount); Temp.SubItems.Add(same); listView1.Items.Add(Temp); } } private void CheckDataBase() { lock (mDataBase) { do { SetText("Connecting DataBase..."); if (cDataIndex > mDataBase.Length - 1) { return; } string conn_Master_String = "Server=" + MyModel.MasterServer + ";database=" + this.mDataBase[cDataIndex] + ";uid=" + MyModel.MasterUid + ";pwd=" + MyModel.MasterPwd; string conn_Mirror_String = "Server=" + MyModel.MirrorServer + ";database=" + this.mDataBase[cDataIndex] + ";uid=" + MyModel.MirrorUid + ";pwd=" + MyModel.MirrorPwd; SqlConnection conn_Master = new SqlConnection(conn_Master_String); SqlConnection conn_Mirror = new SqlConnection(conn_Mirror_String); SqlCommand u_Master = new SqlCommand(); SqlCommand u_Mirror = new SqlCommand(); u_Master.Connection = conn_Master; u_Mirror.Connection = conn_Mirror; SetText("Geting all tables..."); //获取所有表 u_Master.CommandText = "SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'"; u_Mirror.CommandText = "SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'"; u_Master.Connection.Open(); u_Mirror.Connection.Open(); SqlDataAdapter Master_Sqldapater = new SqlDataAdapter(); SqlDataAdapter Mirror_Sqldapater = new SqlDataAdapter(); Master_Sqldapater.SelectCommand = u_Master; //Mirror_Sqldapater.SelectCommand = u_Mirror; DataSet Master_ds = new DataSet(); //DataSet Mirror_ds = new DataSet(); Master_Sqldapater.Fill(Master_ds); //Mirror_Sqldapater.Fill(Mirror_ds); int MasterCount = 0; int MirrorCount = 0; string mText = ""; for (int i = 0; i < Master_ds.Tables[0].Rows.Count; i++) { try { if (ThreadState == 0) { SetText("Comparing..."); //MessageBox.Show(Master_ds.Tables[0].Rows[i]["Name"].ToString()); u_Master.CommandText = "SELECT Count(*) From [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "]"; MasterCount = int.Parse(u_Master.ExecuteScalar().ToString()); u_Mirror.CommandText = "SELECT Count(*) From [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "]"; MirrorCount = int.Parse(u_Mirror.ExecuteScalar().ToString()); lCount += 1; mText = Master_ds.Tables[0].Rows[i]["Name"].ToString(); //newLine(lCount.ToString(), "No", mDataBase[cDataIndex], Master_ds.Tables[0].Rows[i]["Name"].ToString(), MasterCount.ToString()); //lCount += 1; //newLine(lCount.ToString(), "Yes", mDataBase[cDataIndex], Master_ds.Tables[0].Rows[i]["Name"].ToString(), MirrorCount.ToString()); if (MasterCount == MirrorCount) { //当记录行相同的情况下判断是否相同的值 SetText("Checking table: " + Master_ds.Tables[0].Rows[i]["Name"].ToString()); DataSet Tempds = new DataSet(); u_Master.CommandText = "select name from syscolumns where id=object_id('" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "') order by colid"; Master_Sqldapater.SelectCommand = u_Master; Master_Sqldapater.Fill(Tempds); DataSet mMaster = new DataSet(); DataSet mMirror = new DataSet(); u_Master.CommandText = "SELECT * From [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); switch (Master_ds.Tables[0].Rows[i]["Name"].ToString()) { case "ExecutionLogStorage": u_Master.CommandText = "SELECT * FROM [ReportServer].[dbo].[ExecutionLogStorage_xml]order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; case "Reporting": u_Master.CommandText = "SELECT * FROM [RHSDB].[dbo].[Reporting_xml] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; case "ServiceVersions": u_Master.CommandText = "SELECT * FROM [SaaS_BusConfiguration].[dbo].[ServiceVersions_xml] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; case "Log_EventData": u_Master.CommandText = "SELECT * " + " FROM [TopsLogging].[dbo].[Log_EventData_xml] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; case "TopsPolicyXml": u_Master.CommandText = "SELECT * FROM [VirusScanProd].[dbo].[TopsPolicyXml_xml] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; case "ScContactActionItems": u_Master.CommandText = "SELECT * FROM [VirusScanProd].[dbo].[ScContactActionItems_xml] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; default: u_Master.CommandText = "select * from [" + mDataBase[cDataIndex] + "].[dbo].[" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); break; } u_Mirror.CommandText = "SELECT * From [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] order by " + Tempds.Tables[0].Rows[0][0].ToString() + "," + Tempds.Tables[0].Rows[1][0].ToString(); Master_Sqldapater.SelectCommand = u_Master; Mirror_Sqldapater.SelectCommand = u_Mirror; Master_Sqldapater.Fill(mMaster); Mirror_Sqldapater.Fill(mMirror); string temp = "Yes"; for (int o = 0; o < mMaster.Tables[0].Rows.Count; o++) { for (int x = 0; x < Tempds.Tables[0].Rows.Count; x++) { if (mMaster.Tables[0].Rows[o][x].ToString().Contains("WINDOWS\\System32") == true) { MessageBox.Show(Master_ds.Tables[0].Rows[i]["Name"].ToString() + "\n" + mDataBase[cDataIndex]); } if (mMaster.Tables[0].Rows[o][x].ToString().Trim().GetHashCode() != mMirror.Tables[0].Rows[o][x].ToString().Trim().GetHashCode()) { //MessageBox.Show(mMaster.Tables[0].Rows[o][x].ToString().GetHashCode() + "\n" + mMirror.Tables[0].Rows[o][x].ToString().GetHashCode() + "\n" + u_Master.CommandText); temp = "The line " + (o + 1).ToString() + " of the record is not the same"; } } } Tempds.Dispose(); newLine(lCount.ToString(), mDataBase[cDataIndex], Master_ds.Tables[0].Rows[i]["Name"].ToString() , MasterCount.ToString(), MirrorCount.ToString(), temp); } else { newLine(lCount.ToString(), mDataBase[cDataIndex], Master_ds.Tables[0].Rows[i]["Name"].ToString() , MasterCount.ToString(), MirrorCount.ToString(), "No"); } } } catch //(Exception es) { //MessageBox.Show(mDataBase[cDataIndex] + "\n" + es.Message); } } Master_Sqldapater.Dispose(); Mirror_Sqldapater.Dispose(); Master_ds.Dispose(); //Mirror_ds.Dispose(); u_Master.Dispose(); u_Mirror.Dispose(); conn_Master.Close(); conn_Mirror.Close(); conn_Master.Dispose(); conn_Mirror.Dispose(); cDataIndex += 1; if (cDataIndex > mDataBase.Length-1) { ThreadState = 1; } SetText("Comparing Complete,continuing..."); CheckDataBase(); //MessageBox.Show(cDataIndex.ToString()); } while (cDataIndex < mDataBase.Length); } } delegate void ObjectStatus(bool a, Button s); private void SetObjectStatus(bool a, Button s) { if (s.InvokeRequired) { ObjectStatus d = new ObjectStatus(SetObjectStatus); this.Invoke(d, new object[]{ a, s }); } else { s.Enabled = a; } } private void button3_Click(object sender, EventArgs e) { cDataIndex = 0; Thread a = new Thread(Sync); a.IsBackground = true; a.Start(); } //执行同步 private void Sync() { SetObjectStatus(false, button1); SetObjectStatus(false, button2); SetObjectStatus(false, button3); SyncData(); SetObjectStatus(true, button1); SetObjectStatus(true, button2); SetObjectStatus(true, button3); try { Thread.Sleep(5); } catch { } finally { Thread.CurrentThread.Abort(); } } private void SyncData() { do { SetText("Connecting DataBase..."); if (cDataIndex > mDataBase.Length - 1) { return; } string conn_Master_String = "Server=" + MyModel.MasterServer + ";database=" + this.mDataBase[cDataIndex] + ";uid=" + MyModel.MasterUid + ";pwd=" + MyModel.MasterPwd; string conn_Mirror_String = "Server=" + MyModel.MirrorServer + ";database=" + this.mDataBase[cDataIndex] + ";uid=" + MyModel.MirrorUid + ";pwd=" + MyModel.MirrorPwd; SqlConnection conn_Master = new SqlConnection(conn_Master_String); SqlConnection conn_Mirror = new SqlConnection(conn_Mirror_String); SqlCommand u_Master = new SqlCommand(); SqlCommand u_Mirror = new SqlCommand(); u_Master.Connection = conn_Master; u_Mirror.Connection = conn_Mirror; SetText("Geting all tables..."); //获取所有表 u_Master.CommandText = "SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'"; u_Mirror.CommandText = "SELECT NAME FROM SYSOBJECTS WHERE XTYPE='U'"; u_Master.Connection.Open(); u_Mirror.Connection.Open(); SqlDataAdapter Master_Sqldapater = new SqlDataAdapter(); SqlDataAdapter Mirror_Sqldapater = new SqlDataAdapter(); Master_Sqldapater.SelectCommand = u_Master; //Mirror_Sqldapater.SelectCommand = u_Mirror; DataSet Master_ds = new DataSet(); //DataSet Mirror_ds = new DataSet(); Master_Sqldapater.Fill(Master_ds); //Mirror_Sqldapater.Fill(Mirror_ds); string mText = ""; for (int i = 0; i < Master_ds.Tables[0].Rows.Count; i++) { try { SetText("Truncate Mirror data..."); u_Mirror.CommandText = "truncate table [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "]"; u_Mirror.ExecuteNonQuery(); //lCount += 1; mText = Master_ds.Tables[0].Rows[i]["Name"].ToString(); /* if (mText.Contains("TopsPolicyXml")==true) { u_Mirror.CommandText = "SELECT COUNT(*) FROM [TopsPolicyXml]"; MessageBox.Show(u_Mirror.ExecuteScalar().ToString()); } */ //当记录行相同的情况下判断是否相同的值 SetText("Sync table: " + Master_ds.Tables[0].Rows[i]["Name"].ToString()); DataSet Tempds = new DataSet(); switch (Master_ds.Tables[0].Rows[i]["Name"].ToString()) { case "ExecutionLogStorage": u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * FROM [192.168.0.74].[ReportServer].[dbo].[ExecutionLogStorage_xml]"; break; case "Reporting": u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * FROM [192.168.0.74].[RHSDB].[dbo].[Reporting_xml]"; break; case "ServiceVersions": u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * FROM [192.168.0.74].[SaaS_BusConfiguration].[dbo].[ServiceVersions_xml]"; break; case "Log_EventData": u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * " + " FROM [192.168.0.74].[TopsLogging].[dbo].[Log_EventData_xml]"; break; case "TopsPolicyXml": //u_Mirror.CommandText = "SELECT [policyXml] FROM [192.168.0.74].[VirusScanProd].[dbo].[TopsPolicyXml_xml] where id=27"; //MessageBox.Show(u_Mirror.ExecuteScalar().ToString()); u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * FROM [192.168.0.74].[VirusScanProd].[dbo].[TopsPolicyXml_xml]"; break; case "ScContactActionItems": u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] SELECT * FROM [192.168.0.74].[VirusScanProd].[dbo].[ScContactActionItems_xml]"; break; default: u_Mirror.CommandText = "Insert into [" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "] select * from [192.168.0.74].[" + mDataBase[cDataIndex] + "].[dbo].[" + Master_ds.Tables[0].Rows[i]["Name"].ToString() + "]"; break; } u_Mirror.ExecuteNonQuery(); //newLine(lCount.ToString(), mDataBase[cDataIndex], Master_ds.Tables[0].Rows[i]["Name"].ToString() // , MasterCount.ToString(), MirrorCount.ToString(), temp); } catch (Exception es) { MessageBox.Show(mDataBase[cDataIndex] + "\n" + es.Message + "\n" + DateTime.Now.ToString()); } } Master_Sqldapater.Dispose(); Mirror_Sqldapater.Dispose(); Master_ds.Dispose(); //Mirror_ds.Dispose(); u_Master.Dispose(); u_Mirror.Dispose(); conn_Master.Close(); conn_Mirror.Close(); conn_Master.Dispose(); conn_Mirror.Dispose(); cDataIndex += 1; if (cDataIndex > mDataBase.Length - 1) { ThreadState = 1; } SetText("Comparing Complete,continuing..."); SyncData(); //MessageBox.Show(cDataIndex.ToString()); SetText("Sync complete..."); } while (cDataIndex < mDataBase.Length); } }}
Config.cs
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace Database_tracking{ public partial class Config : Form { private string configPath = Application.StartupPath + "\\config.ini"; /****操作INI文件开始***********/ [System.Runtime.InteropServices.DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 声明INI文件的读操作函数 GetPrivateProfileString() [System.Runtime.InteropServices.DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath); public string ReadValue(string section, string key) { // 每次从ini中读取多少字节 System.Text.StringBuilder temp = new System.Text.StringBuilder(255); // section=配置节,key=键名,temp=上面,path=路径 GetPrivateProfileString(section, key, "", temp, 255, configPath); return temp.ToString(); } public void Writue(string section, string key, string value) { // section=配置节,key=键名,value=键值,path=路径 WritePrivateProfileString(section, key, value, configPath); } /*****操作INI文件结束**********/ public Config() { InitializeComponent(); } private void Config_Load(object sender, EventArgs e) { MasterServer.Text = ReadValue("Main", "MasterServer"); MasterUid.Text = ReadValue("Main", "MasterUid"); MasterPwd.Text = ReadValue("Main", "MasterPwd"); MirrorServer.Text = ReadValue("Main", "MirrorServer"); MirrorUid.Text = ReadValue("Main", "MirrorUid"); MirrorPwd.Text = ReadValue("Main", "MirrorPwd"); ThreadCount.Text = ReadValue("Main", "ThreadCount"); Tables.Text = ReadValue("Main", "Library"); MyModel.MasterServer = MasterServer.Text; MyModel.MasterUid = MasterUid.Text; MyModel.MasterPwd = MasterPwd.Text; MyModel.MirrorServer = MirrorServer.Text; MyModel.MirrorUid = MirrorUid.Text; MyModel.MirrorPwd = MirrorPwd.Text; MyModel.Library = Tables.Text; MyModel.ThreadCount = ThreadCount.Text; } private void button1_Click(object sender, EventArgs e) { CheckValue(MasterServer.Text,MasterServer); CheckValue(MasterUid.Text,MasterUid); CheckValue(MasterPwd.Text,MasterPwd); CheckValue(MirrorServer.Text, MirrorServer); CheckValue(MirrorUid.Text, MirrorUid); CheckValue(MirrorPwd.Text, MirrorPwd); CheckValue(ThreadCount.Text, ThreadCount); CheckValue(Tables.Text, Tables); if (isNumeric(ThreadCount.Text) == false) { MessageBox.Show("This must enter a number"); ThreadCount.Focus(); } try { //Check True Writue("Main", "MasterServer", MasterServer.Text); Writue("Main", "MasterUid", MasterUid.Text); Writue("Main", "MasterPwd", MasterPwd.Text); Writue("Main", "MirrorServer", MirrorServer.Text); Writue("Main", "MirrorUid", MirrorUid.Text); Writue("Main", "MirrorPwd", MirrorPwd.Text); Writue("Main", "ThreadCount", ThreadCount.Text); Writue("Main", "Library", Tables.Text); MyModel.MasterServer = MasterServer.Text; MyModel.MasterUid = MasterUid.Text; MyModel.MasterPwd = MasterPwd.Text; MyModel.MirrorServer = MirrorServer.Text; MyModel.MirrorUid = MirrorUid.Text; MyModel.MirrorPwd = MirrorPwd.Text; MyModel.Library = Tables.Text; MyModel.ThreadCount = ThreadCount.Text; MessageBox.Show("Sucess!", "Info"); } catch(Exception es) { MessageBox.Show("Faled!Source: " + es.Message,"Info"); } } private void CheckValue(string s,TextBox m) { if (s.Trim() == "") { MessageBox.Show("The value of can not be empty"); m.Focus(); } } private bool isNumeric(string s) { try { int a = int.Parse(s); return true; } catch { return false; } } }}
MyModel.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Database_tracking{ static class MyModel { public static string MasterServer = ""; public static string MasterUid = ""; public static string MasterPwd = ""; public static string MirrorServer = ""; public static string MirrorUid = ""; public static string MirrorPwd = ""; public static string Library = ""; public static string ThreadCount = ""; }}
config.ini
[Main]MasterServer=(local)MasterUid=saMasterPwd=ericrobackMirrorServer=(local)MirrorUid=saMirrorPwd=ericrobackThreadCount=10Library=myCIO,EcomKeys,FirewallProd,NAIPartners,ReportServer,ReportServerTempDB,RHSDB,SaaS_BusConfiguration,SiebelExtract,SiteAdvisorprod,SMSProd,TopsLogging,TPSClient,TrustedToken,VirusScanProd,VSDetections,VSSummary
完整代码请点击:http://download.csdn.net/detail/robake/4701086
- 进行数据库跟踪分析的工具
- strace跟踪分析进程工具
- 工具: ass109.awk 分析 Oracle 的跟踪文件 - Oracle Life
- 如何有效地进行动态跟踪分析
- 如何有效地进行动态跟踪分析
- IE的debug工具对程序进行debug跟踪JS代码
- 分析工具代码&转换跟踪代码
- 五花八门的bug跟踪工具
- phpTrace 奇虎360开源的PHP脚本跟踪分析工具
- 连接跟踪的源代码分析
- 订单状态的跟踪分析
- Postgres 数据库分析工具
- 数据库性能分析工具
- 对Dns进行分析 nslookup工具的使用方法
- 使用valgrind的callgrind工具进行多线程性能分析
- 利用PyCharm的Profile工具进行Python性能分析
- 使用Websphere的TPTP工具进行性能分析和监控
- 使用valgrind的callgrind工具进行多线程性能分析
- 算法---排序汇总
- .MPEG-4 AVC/H.264 video codecs list
- date
- linux下查看软件的安装路径
- 23种设计模式要点总结
- 进行数据库跟踪分析的工具
- javascript放在head和body的区别
- 【java】JTextField与JComboBox结合动态匹配输入信息
- DMA
- MPEG-2
- 解决原pb11.5 webservice 大并发IIS挂机假死
- NSLock ,pthread_cond_lock();浅析
- LevelDB 介绍
- 电气工程领域核心期刊大全