在我的情况下,我该如何设置 Silverlight 到 MySQL 的数据管道?

Posted

技术标签:

【中文标题】在我的情况下,我该如何设置 Silverlight 到 MySQL 的数据管道?【英文标题】:How might I set up data plumbing for Silverlight to MySQL in my situation? 【发布时间】:2009-11-24 14:55:07 【问题描述】:

简而言之:设置从 Silverlight 到 MySQL 数据库的只读数据访问的好方法是什么?


以下是我的情况的详细信息:

我目前正在尝试设置 Silverlight 应用程序来呈现来自 mysql 数据库的数据。目前,我需要设置对 MySQL 数据库的只读访问权限(我可能会设置其他表以在以后完成CRUD 功能,但对于这些特定表,我' m 只关心 retrieve 方面)。

我tried setting it up using RIA Services (CTP July 2009) with Entity Framework,但我had trouble debugging it 并最终以trying to recompile the source code from the MySQL ADO.NET connector 为install custom DLLs into the GAC。我无法让这些东西正常工作。

我的问题是我的许多 MySQL 表中的日期值都存储为 0000-00-00。 MySQL ADO.NET 连接器每次尝试删除其中包含无效日期的行时都会引发异常。我会尝试重新编译连接器(参见上面的链接),但这感觉很像黑客。我会尝试将 MySQL 数据库中的值更新为 within the appropriate spec for dates,但我们的 IT 经理(实际上是我们的 DBA)不想这样做。

我不介意学习使用 LINQ(LINQ-to-what?),但我想避免连接我自己的 SQL 命令字符串。由于日期限制,我需要一种方法为几乎每个日期实例指定Case When orders.OrderDate = '0000-00-00' Then '0001-01-01' Else orders.OrderDate End

我特别想听听一起使用 .NET 和 MySQL 的人的来信。在我的情况下什么会起作用?

【问题讨论】:

您可以尝试在连接字符串中设置 zeroDateTimeBehavior=convertToNull。这将为所有无效(即 0000-00-00)日期发送一个空值。 我相信选项是允许零日期时间 (dev.mysql.com/doc/refman/5.0/en/…)。我以前试过这个,但它不起作用。我认为连接器仍然会抛出异常。 如果我是你,我会写一个后端来代理数据库中的数据。 或者您可以使用现有的轻量级 ORM 并节省一些时间。 Subsonic 使用起来真的非常简单。 【参考方案1】:

为什么没有人建议使用 ORM 来隐藏 mySQL 详细信息? NHibernate 和 Subsonic 都支持 mySQL。两者在如何与数据库交互方面都非常可定制,并且应该允许您处理格式错误的日期。

通过使用 ORM,您的数据对象现在是 POCO,您可以使用任何您想要的方式将数据发送到 Silverlight 客户端。 Vanilla Web 服务或 WCF 应该没问题。如果您想尝试最前沿的 RIA 服务。

恕我直言,这将比设置 mysql->php->xml->asp.net->silverlight 链更简单。

【讨论】:

【参考方案2】:

我的问题是我的许多 MySQL 表中的日期值都存储为 0000-00-00。

您可以在 SQL 查询中只写 Select NullIf( SomeDate, '0000-00-00') As SomeDate From SomeTable 吗?我不知道 MySQL,但这就是我会在 T-SQL 中做的事情。

【讨论】:

如果我直接写SQL,我可能会做类似的事情,比如CASE WHEN SomeDate = '0000-00-00' Then '1901-01-01' Else SomeDate End As SomeDate。但是,我的问题是设置管道,以便我直接执行 SQL,但仍然可以根据需要灵活地输入上面的 CASE 语句。 你能把你的表包装在视图中吗?如果是这样,那将有效地清理您的数据,而不会强迫您以特定方式编写 SQL。 这不是一个坏建议,但我刚刚对其进行了测试,在尝试使用 SQL 语句的Where 部分中的数据字段时性能很糟糕。我想这是因为必须先评估视图中的 CASE 语句,然后才能针对视图的结果数据集运行查询。无论哪种方式,相差 31 毫秒和 3078 毫秒。 哇,真糟糕。放弃并使用定期从真实数据库批量加载的 SQL Express 副本怎么样?【参考方案3】:

这是我为遇到的类似问题所做的。

我使用 php 从 MySQL 数据库中获取数据并将其转换为 XML 文件。我从我的 silverlight 应用程序中调用了该文件,并使用 LINQtoXML 解析数据并使其在我的 XAML 控件中可用。我不是贸易程序员,所以也许有更好的方法可以做到这一点,但这适用于我的应用程序。希望这可以帮助。林克摇滚!

下面是部分代码:

< ?php

header("Content-type: text/xml");

$grb_hostname = "host";
$grb_database = "dbName";
$grb_username = "dbUser";
$grb_password = "dbPwd";
$grb = mysql_connect($grb_hostname, $grb_username, $grb_password); 

mysql_select_db($grb_database, $grb);

$results = mysql_query("SELECT * FROM bursts ORDER BY bursts.id DESC");

$xmlOutput = "<?xml version=\"1.0\"?>\n"; 
$xmlOutput .= "<grbs>\n";

while($row = mysql_fetch_array($results)) 
    $xmlOutput .= "\t<grb id=\"".$row['id']."\" trigger=\"".$row['trigger']."\">\n";
    $xmlOutput .= "\t\t<grb_id>".$row['grb_id']."</grb_id>\n";
    $xmlOutput .= "\t\t<burst_ra>".$row['burst_ra']."</burst_ra>\n";
    $xmlOutput .= "\t\t<burst_dec>".$row['burst_dec']."</burst_dec>\n";
    $xmlOutput .= "\t</grb>\n";

$xmlOutput .= ""; // 前面没有空格/

回显$xml输出;

?>

然后在我的 Silverlight 中,我有以下内容:

private void LoadGrbs()

    

        WebClient grbXmlFile = new WebClient();

        // Make sure the crossdomainpolicy.xml file exists on the remote server.
        grbXmlFile.DownloadStringAsync(new Uri("url_xml_generating_php_file", UriKind.Absolute));
        grbXmlFile.DownloadStringCompleted += new DownloadStringCompletedEventHandler(grbsXmlLoaded);
    

    private void grbsXmlLoaded(object sender, DownloadStringCompletedEventArgs e)
    
        processGrbXml(e.Result);
    

    private void processGrbXml(string grbData)
    
        XDocument grbs = XDocument.Parse(grbData);

        var query = from g in grbs.Descendants("grb")
                    select new
                        
                            grbId = (string)g.Element("grb_id"),
                            grbDec = (string)g.Element("burst_dec")
                        ;

        foreach (var grb in query)
        
            grbListbox.Items.Add(grb.grbId);
        

    

grbListbox 是我 Silverlight 应用程序中的一个列表框控件。

【讨论】:

您可以向您的 Silverlight 应用添加验证码以检查不正确的日期。 感谢您的建议,并喜欢您创造性地使用 Linq to XML。但是,我试图避免对涉及SELECT * FROM ... 的服务器进行查询。尽管 XML 格式的数据更“可解析”,但在开始解析它们之前,我必须下载数十万条记录。这将花费太多时间。【参考方案4】:

您应该使用 RIA 服务,最新版本于上周发布,现在已包含在 silverlight 4 测试版中。

http://silverlight.net/getstarted/silverlight-4-beta/

您不必将实体框架与 RIA 一起使用,还有其他选项。我们有,但我们使用 SQL Server,所以这可能不是您最喜欢的。

他们已经更改了新 RIA Stuff 中的一些错误,所以我建议您再看看。这是上周布拉德艾布拉姆斯的例子:

http://microsoftpdc.com/Sessions/CL21

最后,如果您在调试时遇到很多麻烦,您可以看看 Fiddler。这是一个监视流量的程序,它可以以更明显的方式向您显示您遇到的错误。

【讨论】:

感谢您的建议。我将再看一下带有 beta 4 的 RIA 服务。但是,我仍然需要找到 域数据源和 MySQL DB 之间的链接。在此过程中,我仍然必须能够解释无效日期。 我还应该注意:实体框架和 RIA 服务与 SQL Server 一起工作非常好,因为它们都是 Microsoft 产品。但是,它们不能很好地与 MySQL 配合使用,尤其是当 MySQL 数据存在问题时。我很想能够使用 RIA 服务,但如果我觉得我正在破解它以使其工作,它可能不是最好的解决方案。 微软一直在强调 RIA 服务(或 WCF RIA 服务)应该很好地处理非实体的东西。如果您查看 Colin Blair 的博客:riaservicesblog.com/Blog 他谈到了他如何不喜欢域数据源,并建议(在我看来)更好的方法。你真的更多地在玩你的数据上下文。有一个关于使用 RIA 和 NHibernate 而不是 Entity 的视频,你也可以看看。我认为就是这样:microsoftpdc.com/Sessions/CL07 为什么这个答案应该投反对票?它对你有什么影响?

以上是关于在我的情况下,我该如何设置 Silverlight 到 MySQL 的数据管道?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 wpf silverlight 应用程序注销

如果远程服务器位于很远的物理距离,我该如何才能改善响应时间

如何模拟EntityManager?

我可以从页面类设置 Silverlight 应用程序的文化吗?

如何在 XAML (Silverlight) 中以编程方式设置 TextBox 文本

Silverlight 4:如何切换控件可见性