最近,需要将一个现有的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,将连接字符串指向有效的数据库(和驱动程序)。此代码仅作为示例。没有添加足够的验证来捕获错误或无效输入。