使用MDB中的数据填充Silverlight DataGrid
这是一个示例项目,通过 OLEDB 访问 Microsoft Access MDB 数据,并动态填充 DataGrid。
引言
这段示例代码展示了一种简单的方法,可以将存储在 Access MDB(或任何其他 OLEDB 数据源)中的数据暴露出来,并以最少的代码在 Silverlight DataGrid 中显示。
背景
最近,我需要将现有的应用程序从 ASP.NET 迁移到 Silverlight UI。该应用程序使用 MS Access (MDB) 作为数据存储。使用 LINQ to SQL 类,访问 SQL Server 数据非常容易。但是,当涉及到其他数据存储中的数据,例如 MySQL 或 MS Access 时,就没有简单的方法了。
完成迁移后,我觉得这些经验对社区会有所帮助 - 因此写了这篇文章。
Using the Code
压缩文件包含两个项目
- ASP.NET Web 项目
- Silverlight 项目
Web 项目包含一个 WCF 服务。该服务暴露两个方法
[ServiceContract]
public interface IAccess
{
[OperationContract]
void ExecuteNonQuery(string strQuery);
[OperationContract]
string ExecuteQuery(string strQuery);
}
ExecuteQuery
方法运行指定的查询,并将结果集作为字符串(XML 格式)返回
public string ExecuteQuery(string strQuery)
{
DataTable dt = new DataTable();
dt.TableName="data";
OleDbDataAdapter oDA = new OleDbDataAdapter(strQuery,strConnection);
oDA.Fill(dt);
StringWriter sw = new StringWriter();
dt.WriteXml(sw);
return sw.ToString();
}
Silverlight 项目包含一个 XAML 页面 (MainPage.xaml),用户可以在其中输入 SQL 查询。单击“查询”按钮后,XAML 页面调用 WCF 服务 ExecuteQuery
方法,获取结果(作为 XML),并填充 datagrid。
private void btnQueryDatabase_Click(object sender, System.Windows.RoutedEventArgs e)
{
// TODO: Add event handler implementation here.
RunQueryOnServer();
}
private void RunQueryOnServer()
{
AccessClient ac = new AccessClient();
ac.ExecuteQueryCompleted +=
new EventHandler<ExecuteQueryCompletedEventArgs>(ac_ExecuteQueryCompleted);
this.Cursor = Cursors.Wait;
ac.ExecuteQueryAsync(txtQuery.Text);
}
void ac_ExecuteQueryCompleted(object sender, ExecuteQueryCompletedEventArgs e)
{
dGrid.Columns.Clear();
dGrid.ItemsSource = null;
StringReader sr = new StringReader(e.Result);
XDocument xDoc = XDocument.Load(sr);
if (xDoc.Descendants("data").Count() > 0)
{
XElement xEl = xDoc.Descendants("data").ToList()[0];
foreach (XElement xe in xEl.Elements())
{
DataGridTextColumn dg = new DataGridTextColumn();
dg.Header = xe.Name.LocalName;
Binding bnd = new Binding();
bnd.Converter = new XMLValueConvertor();
bnd.ConverterParameter = xe.Name.LocalName;
dg.Binding = bnd;
dGrid.Columns.Add(dg);
}
dGrid.ItemsSource = xDoc.Descendants("data").ToList();
}
this.Cursor = Cursors.Arrow;
}
请注意,我们使用 Binding Converter 在填充网格时从 XML 元素中提取元素值。
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
try
{
XElement xEl = (XElement)value;
return xEl.Element(parameter.ToString()).Value;
}
catch
{
return "";
}
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
关注点
在执行应用程序之前,您需要修改 web.config 以将连接字符串指向有效的数据库(和驱动程序)。这段代码仅用作示例。我没有添加足够的验证来捕获错误或无效输入。
如果您有任何意见、建议或建设性的批评,请告诉我,以便我将其纳入其中。
历史
- 版本 1 - 2009 年 11 月 24日。