将Access数据库数据在Silverlight DataGrid中显示

最近,需要将一个现有的ASP.NET应用程序迁移到Silverlight用户界面。该应用程序使用Microsoft Access(MDB)作为数据存储。虽然使用LINQ to SQL类可以轻松访问SQL Server中的数据,但当涉及到其他数据存储,如MySQL或MS Access时,就没有那么简单了。迁移完成后,认为这些经验教训对社区会很有用,因此写下了这篇文章。

使用代码

压缩文件包含两个项目:

Web项目有一个WCF服务。这个服务公开了两个方法:

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) { RunQueryOnServer(); } private void RunQueryOnServer() { AccessClient ac = new AccessClient(); ac.ExecuteQueryCompleted += new EventHandler(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,将连接字符串指向有效的数据库(和驱动程序)。此代码仅作为示例。没有添加足够的验证来捕获错误或无效输入。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485