锋利的C#

  程序员博客 :: 首页 :: 新随笔 :: 订阅 :: 管理 :: 登录 ::
访问csharp的空间

随笔分类

随笔归档

个人相册

阅读排行榜

评论排行榜

最新评论

csharp 阅读(3505) 评论(0)

作者:Eligio Morgado H.

介绍
前几天,将MySQL数据库移到了另外一台主机后,我得到了一个沮丧的惊喜:新的主机不接受数据库的外来连接。
这是我的问题,因为我的应用程序(C#开发的)通过ODBC连接到这个数据库。
我找到了得到信息的方式:创建PHP文件,通过JSON格式返回数据。然后再C#应用中处理JSON格式数据。
我想与大家分享这个过程。

Json.NET
我找到了一个处理JSON很棒的framework,首先我们安装它,最简单的方法是用NuGet,打开Visual Studio,运行包管理器,然后输入:
PM> Install-Package Newtonsoft.Json
现在我们可以开始工作了。

MySQL数据表结构

我已经建了一个很简单的表,包含几行数据。
新建数据表脚本如下:

CREATE TABLE 'Users' (
'Id' INT UNSIGNED NOT NULL AUTO_INCREMENT ,
'FirstName' VARCHAR( 50 ) NOT NULL ,
'LastName' VARCHAR( 50 ) NOT NULL ,
'Email' VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( 'Id' ) ,
FULLTEXT (
'FirstName' ,
'LastName' ,
'Email'
)
) TYPE = MYISAM ;

添加数据行的脚本如下:

INSERT INTO 'Users' ('FirstName' , 'LastName' , 'Email' )
VALUES 
('Pepe', 'Pardo', 'pepe.pardo@gmail.com'),
('Manolo', 'Locomia', 'manolo.locomia@gmail.com'),
('Diplo', 'Docus', 'diplo.docus@gmail.com'); 


PHP脚本
下一步是创建PHP文件连接数据库,执行SQL查询并返回JSON格式的结果。

Foo.php

<?php
// 数据库连接配置
$DatabaseServer = "localhost";
$DatabaseUser = "testUser";
$DatabasePassword = "testPassword";
$DatabaseName = "myDBName";

// 设置数据库连接
$mysqli = new mysqli($DatabaseServer, $DatabaseUser, $DatabasePassword, $DatabaseName);

// 尝试连接数据库
if ($mysqli->connect_errno) 
{
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

// 查询数据获得结果集
$result = $mysqli->query("SELECT Id, FirstName, LastName, Email FROM Users;");

// 遍历结果集获得所有数据
while($row = mysqli_fetch_assoc($result)) 
{
$rows[] = $row;
}

// 关闭结果集
$result->close();

// 关闭数据库连接
$mysqli->close();

// 返回JSON编码的数据
print(json_encode($rows, JSON_NUMERIC_CHECK));
?>


记得用mysqli_fetch_assoc代替mysql_fetch_array,否则会在JSON中有重复的值。

从PHP 5.3.3开始,你可以使用JSON_NUMERIC_CHECK标记对数字进行自动转换。我想将Id列的数据作为int返回,所以我使用了JSON_NUMERIC_CHECK。
现在我们可以将PHP文件放到WEB服务器上测试了,我们用浏览器运行它,返回的结果如下:

[{"Id":"1","FirstName":"Pepe","LastName":"Pardo","Email":"pepe.pardo@gmail.com"},
{"Id":"2","FirstName":"Manolo","LastName":"Locomia","Email":"manolo.locomia@gmail.com"},
{"Id":"3","FirstName":"Diplo","LastName":"Docus","Email":"diplo.docus@gmail.com"}]



我们已经解决了服务器端,现在我们在C#编写的应用中显示查询结果。

桌面应用
如上所述我们安装好Json.NET后,就可以开始编码了。
首先,创建一个User类,用于存储返回的每个对象。
User.cs

using Newtonsoft.Json;

namespace JsonToDataListView
{
class User
{
[JsonProperty("Id")]
public int Id { get; set; }

[JsonProperty("FirstName")]
public string Name1 { get; set; }

[JsonProperty("LastName")]
public string Name2 { get; set; }

[JsonProperty("Email")]
public string EmaiAddress { get; set; }
}
}

在这个类中唯一特殊的是使用JsonPropertyAttribute匹配JSON键和类属性。
Form1.cs

using System;
using System.Net;
using System.Windows.Forms;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace JsonToDataGridView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
WebClient wc = new WebClient();
var json = wc.DownloadString(textBox1.Text);

List<User> users = JsonConvert.DeserializeObject<List<User>>(json);

dataGridView1.DataSource = users;
}
}
}

首先,我们创建WebClient对象,用于连接刚才创建的PHP页面。
然后,我们使用DownloadString函数下载页面内容到变量,应用中有所有具体信息。主要是Json.NET帮我们做了许多事。
JSON反序列化创建User对象列表,我们使用静态类DeserializeObject和JsonConvert函数,传递从网上获得的完整结果作为参数。
现在我们只需要在DataGridView里使用DataSource属性显示出数据。


发表评论
切换编辑模式