C# 仅显示WPF DataGrid中数据库的副本
我有两个数据库,在比较它们时,可以找到重复的数据库。列C# 仅显示WPF DataGrid中数据库的副本,c#,wpf,datagrid,duplicates,C#,Wpf,Datagrid,Duplicates,我有两个数据库,在比较它们时,可以找到重复的数据库。列NAME是重复检测的因素。还有很多其他列,这就是将所有重复的列并排放到WPF DataGrid以查看其他列的要点——哪些列不匹配 举例来理解问题 数据库1: NRO NAME ADDRESS POSTA 400086 Microsoft AvenuesStreet microsoft@micorosoft.com 400068 Amazon StreetOfArt amazonging@ama
NAME
是重复检测的因素。还有很多其他列,这就是将所有重复的列并排放到WPF DataGrid以查看其他列的要点——哪些列不匹配
举例来理解问题
数据库1:
NRO NAME ADDRESS POSTA
400086 Microsoft AvenuesStreet microsoft@micorosoft.com
400068 Amazon StreetOfArt amazonging@amazon.com
400059 Google OperaStreet microsoft@micorosoft.com
数据库2:
NRO NAME ADDRESS POSTA
300081 Microsoft AvenuesStreet microsoftAS@micorosoft.com
300032 Amazon Street45 zinomaz@amazon.com
300084 Apple StreetOfApple apple@apple.com
WPF DataGRid应显示:
NRO NAME ADDRESS POSTA
400086 Microsoft AvenuesStreet microsoft@micorosoft.com
300081 Microsoft AvenuesStreet microsoftAS@micorosoft.com
400068 Amazon StreetOfArt amazonging@amazon.com
300032 Amazon Street45 zinomaz@amazon.com
我尝试过从数据库获取数据:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
try
{
ProgressBar.IsIndeterminate = true;
// HERE COMES MERGE ATTEMPT
var gridView = await GetDataAsync();
var collectionView = new ListCollectionView(gridView) as ICollectionView;
collectionView.Filter = (r) => gridView.where(t => t.Name == r.Name && t != r).Count() >= 2;
DataGrid1.ItemsSource = collectionView;
ProgressBar.IsIndeterminate = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private Task<DataView> GetDataAsync()
{
return Task.Run(() =>
{
string connectionStringSE = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringSE = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
string connectionStringFI = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringFI = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
DataTable dataTable = new DataTable("COMPANY");
// using-statement will cleanly close and dispose unmanaged resources i.e. IDisposable instances
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
}
return dataTable.DefaultView;
});
}
private async void按钮\u单击\u 1(对象发送方,RoutedEventArgs e)
{
尝试
{
ProgressBar.IsIndeterminate=true;
//合并尝试来了
var gridView=await GetDataAsync();
var collectionView=新的ListCollectionView(gridView)作为ICollectionView;
collectionView.Filter=(r)=>gridView.where(t=>t.Name==r.Name&&t!=r.Count()>=2;
DataGrid1.ItemsSource=collectionView;
ProgressBar.IsIndeterminate=false;
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私有任务GetDataAsync()
{
返回任务。运行(()=>
{
string connectionStringSE=“Driver={普及ODBC客户端接口};ServerName=db223;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;”;
string queryStringSE=“选择NRO、名称、名称A、名称B、地址、邮政、邮政N、邮政B、公司、国家、ID、公司活动”;
string connectionStringFI=“Driver={普及ODBC客户端接口};ServerName=db223;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;”;
string queryStringFI=“选择NRO、名称、名称A、名称B、地址、邮政、邮政N、邮政B、公司、国家、ID、公司活动”;
DataTable=新的DataTable(“公司”);
//语句将干净地关闭和处置非托管资源,即IDisposable实例
使用(OdbcConnection dbConnectionSE=新的OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE=新的OdbcDataAdapter();
dadapterSE.SelectCommand=新的OdbcCommand(queryStringSE,dbConnectionSE);
数据简短填写(数据表);
}
使用(OdbcConnection dbConnectionFI=新的OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI=新的OdbcDataAdapter();
dadapterFI.SelectCommand=newodbccommand(queryStringFI,dbConnectionFI);
var newTable=新数据表(“公司”);
dadapterFI.Fill(新表);
dataTable.Merge(newTable);
}
返回dataTable.DefaultView;
});
}
但这似乎是错误的,我正在努力想什么是正确的做法
我的完整代码没有重复检测:
using System.Data.Odbc;
using System.Windows;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System;
using System.Globalization;
using System.Windows.Data;
namespace DB_inspector_FilterTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
try
{
ProgressBar.IsIndeterminate = true;
DataGrid1.ItemsSource = await GetDataAsync();
ProgressBar.IsIndeterminate = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private Task<DataView> GetDataAsync()
{
return Task.Run(() =>
{
string connectionStringSE = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringSE = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
string connectionStringFI = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringFI = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
DataTable dataTable = new DataTable("COMPANY");
// using-statement will cleanly close and dispose unmanaged resources i.e. IDisposable instances
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
}
return dataTable.DefaultView;
});
}
private Dictionary<string, string> _conditions = new Dictionary<string, string>();
private void UpdateFilter()
{
try
{
var activeConditions = _conditions.Where(c => c.Value != null).Select(c => "(" + c.Value + ")");
DataView dv = DataGrid1.ItemsSource as DataView;
dv.RowFilter = string.Join(" AND ", activeConditions);
}
catch (Exception)
{
//MessageBox.Show(ex.Message);
}
}
private void NameSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
string filter = NameSearch.Text;
if (string.IsNullOrEmpty(filter))
_conditions["name"] = null;
else
_conditions["name"] = string.Format("NAME Like '%{0}%'", filter);
UpdateFilter();
}
private void ActiveCustomer_Click_1(object sender, RoutedEventArgs e)
{
if (ActiveCustomer.IsChecked == true)
{
_conditions["active"] = string.Format("ACTIVE Like '%{0}%'", "1");
UpdateFilter();
}
else
{
_conditions["active"] = null;
UpdateFilter();
}
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
if (OnlyFIandSE.IsChecked == true)
{
_conditions["onlyfiandse"] = string.Format("NRO Like '6%' OR NRO Like '7%'");
UpdateFilter();
}
else
{
_conditions["onlyfiandse"] = null;
UpdateFilter();
}
}
}
}
使用System.Data.Odbc;
使用System.Windows;
使用系统数据;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用制度;
利用制度全球化;
使用System.Windows.Data;
名称空间数据库检查程序过滤器测试
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
专用异步无效按钮\u单击\u 1(对象发送方,路由目标)
{
尝试
{
ProgressBar.IsIndeterminate=true;
DataGrid1.ItemsSource=等待GetDataAsync();
ProgressBar.IsIndeterminate=false;
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私有任务GetDataAsync()
{
返回任务。运行(()=>
{
string connectionStringSE=“Driver={普及ODBC客户端接口};ServerName=db223;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;”;
string queryStringSE=“选择NRO、名称、名称A、名称B、地址、邮政、邮政N、邮政B、公司、国家、ID、公司活动”;
string connectionStringFI=“Driver={普及ODBC客户端接口};ServerName=db223;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;”;
string queryStringFI=“选择NRO、名称、名称A、名称B、地址、邮政、邮政N、邮政B、公司、国家、ID、公司活动”;
DataTable=新的DataTable(“公司”);
//语句将干净地关闭和处置非托管资源,即IDisposable实例
使用(OdbcConnection dbConnectionSE=新的OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE=新的OdbcDataAdapter();
dadapterSE.SelectCommand=新的OdbcCommand(queryStringSE,dbConnectionSE);
数据简短填写(数据表);
}
使用(OdbcConnection dbConnectionFI=新的OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI=新的OdbcDataAdapter();
dadapterFI.SelectCommand=newodbccommand(queryStringFI,dbConnectionFI);
var newTable=新数据表(“公司”);
dadapterFI.Fill(新表);
dataTable.Merge(newTable);
}
返回dataTable.DefaultView;
});
}
私有字典_条件=新字典();
私有void UpdateFilter()
{
尝试
{
var activeConditions=_conditions.Where(c=>c.Value!=null)。选择(c=>“(“+c.Value+”));
DataView dv=DataGrid1.ItemsSource作为DataView;
dv.RowFilter=string.Join(“AND”,activeConditions);
}
捕获(例外)
{
//MessageBox.Show(例如Message);
}
}
私有无效名称搜索文本已更改(对象发送方、系统
using System.Data.Odbc;
using System.Windows;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System;
using System.Globalization;
using System.Windows.Data;
namespace DB_inspector_FilterTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
try
{
ProgressBar.IsIndeterminate = true;
DataGrid1.ItemsSource = await GetDataAsync();
ProgressBar.IsIndeterminate = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private Task<DataView> GetDataAsync()
{
return Task.Run(() =>
{
string connectionStringSE = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringSE = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
string connectionStringFI = "Driver={Pervasive ODBC Client Interface};ServerName=DB123;dbq=@DBFSSE;Uid=ADMIN;Pwd=123;";
string queryStringFI = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTB,CORPORATION,COUNTRY,ID,ACTIVE from COMPANY";
DataTable dataTable = new DataTable("COMPANY");
// using-statement will cleanly close and dispose unmanaged resources i.e. IDisposable instances
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
var duplicates = dataTable.AsEnumerable().GroupBy(col => col[2]).Where(gr => gr.Count() > 1).ToList();
duplicates.ForEach(i => Console.Write("{0}\t", i));
Console.Read();
}
return dataTable.DefaultView;
});
}
private Dictionary<string, string> _conditions = new Dictionary<string, string>();
private void UpdateFilter()
{
try
{
var activeConditions = _conditions.Where(c => c.Value != null).Select(c => "(" + c.Value + ")");
DataView dv = DataGrid1.ItemsSource as DataView;
dv.RowFilter = string.Join(" AND ", activeConditions);
}
catch (Exception)
{
//MessageBox.Show(ex.Message);
}
}
private void NameSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
string filter = NameSearch.Text;
if (string.IsNullOrEmpty(filter))
_conditions["name"] = null;
else
_conditions["name"] = string.Format("NAME Like '%{0}%'", filter);
UpdateFilter();
}
private void ActiveCustomer_Click_1(object sender, RoutedEventArgs e)
{
if (ActiveCustomer.IsChecked == true)
{
_conditions["active"] = string.Format("ACTIVE Like '%{0}%'", "1");
UpdateFilter();
}
else
{
_conditions["active"] = null;
UpdateFilter();
}
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
if (OnlyFIandSE.IsChecked == true)
{
_conditions["onlyfiandse"] = string.Format("NRO Like '6%' OR NRO Like '7%'");
UpdateFilter();
}
else
{
_conditions["onlyfiandse"] = null;
UpdateFilter();
}
}
}
}
...
return dataTable.AsEnumerable()
.GroupBy(x => x.Field<string>("NAME"))
.Where(x => x.Count() > 1)
.SelectMany(x => x)
.CopyToDataTable().DefaultView;