WCF2
原文:http://www.cnblogs.com/gylspx/archive/2012/04/20/wcf3.html
第三篇继续我的wcf之旅,数据库获取datatable数据,将它转换为json返回客户端,
1.经过昨天的初试牛刀,wcf就绪,今天搞点服务返回数据库获取datatable数据,将它转换为json返回客户端,
当然你可以用ajax去调用,我是简单的用控制台输出了,ajax解析json格式字符串,应该不难,有时间的我会去晒一下,
没时间的话,童鞋们,你们自己研究把,例子很多,jquery,js都可以简单的很.嘿嘿...
开篇把,先说一个我碰到的错误,顺便给你们说一下怎么调试出错误,系统会提示你怎么去修改
这是什么错误呢?看看怎么调试,首先设置webcfg
把这个节点设置一下:true
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
再去看刚才那错误,提示变长了,细读会发现提示错误是什么,怎么改
修改名字之后就可以了,好了,错误说到这把,下面还是按部就班的来:
2.首先是接口方法
还是老话,这句不能忘: //千万不能忘记这个标识,不然你会很蛋疼的,调不到服务
[OperationContract]
3,实现接口,这里我把本来是一个类的公用方法抠出来了,经过改动之后完全可以,拿出来分享给童鞋们,大家一起学习成长
代码如下:
/// <summary>
/// 从数据库获取数据转换为json格式
/// </summary>
/// <returns></returns>
public string GetDatas()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Clear();
string sql = "select USER_NAME from ADMIN_USERS ";
DataTable dt = SqlHelper.ExecuteDataTable(SqlHelper.SHOP_CONN_STR, CommandType.Text, sql);
string ms = DT2JSON(dt);
return ms + "assa";
//string sql = "select USER_NAME from ADMIN_USERS ";
//DataSet dt = SqlHelper.ExecuteDataset(SqlHelper.SHOP_CONN_STR, CommandType.Text, sql);
//return dt.GetXml();
//string sql = "select USER_NAME from ADMIN_USERS ";
//using (SqlConnection con=new SqlConnection(sql))
//{
// using(SqlCommand com=new SqlCommand(sql,con))
// {
// SqlDataAdapter da = new SqlDataAdapter(com);
// DataSet ds = new DataSet();
// da.Fill(ds);
// return ds;
// }
//}
}
/// <summary>
/// 一个将DataTable转化为JSon字符串序列的函数
/// </summary>
/// <param name="dt">输入的DataTable</param>
/// <returns>返回的Json字符串,直接发送给Javascript</returns>
public static string DT2JSON(DataTable dt)
{
/*
* {"TableName":"table1","Columns":[{"ColumnName":"Name","DataType":"string"}],"Rows":[{"Name":"试试看\"我的\""}]}]
*/
StringBuilder JsonString = new StringBuilder();
if (dt != null)// && dt.Rows.Count > 0)
{
JsonString.Append("{[");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append('{');
for (int j = 0; j < dt.Columns.Count; j++)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":");
JsonString.Append(Obj2JSON(dt.Rows[i][j]));
if (j < dt.Columns.Count - 1)
JsonString.Append(',');
}
if (i < dt.Rows.Count - 1)
JsonString.Append("},");
else
JsonString.Append('}');
}
JsonString.Append("]}");
}
return JsonString.ToString();
}
/// <summary>
/// 将对像转换为JSON模式的字符串
/// </summary>
/// <param name="jobj"></param>
/// <returns></returns>
public static string Obj2JSON(Object jobj) //将某个对象转成json格式。
{
if (jobj == null) return "null";
String s = jobj.GetType().ToString();
if (s == "System.Int32")
return ((Int32)jobj).ToString();
if (s == "System.Int16")
return ((Int16)jobj).ToString();
if (s == "System.Int64")
return ((Int64)jobj).ToString();
if (s == "System.Double")
return ((Double)jobj).ToString();
if (s == "System.Decimal")
return ((Decimal)jobj).ToString();
if (s == "System.Byte")
return ((Byte)jobj).ToString();
if (s == "System.Guid")
return "\"" + ((Guid)jobj).ToString() + "\"";
if (s == "System.Boolean")
return ((Boolean)jobj).ToString().ToLower();
if (s == "System.DateTime")
return DateTime2JSON((DateTime)jobj);
if (s == "System.DBNull")
return "null";
if (s == "System.Data.DataTable")
return DT2JSON((DataTable)jobj);
if (s == "System.String")
return String2JSON((String)jobj);
return "\"????\"";
}
public static string String2JSON(string s) //把一个字符串转换为JSON格式,转义"/\n等字符。如果是null就返回"null"
{
if (s == null)
return "null";
if (s.Length == 0)
{
return "\"\"";
}
char c;
int i;
int len = s.Length;
StringBuilder sb = new StringBuilder(len + 4);
string t = "";
for (i = 0; i < len; i += 1)
{
c = s[i];
if ((c == '\\') || (c == '"') || (c == '/'))
{
sb.Append('\\');
sb.Append(c);
}
else if (c == '\b')
sb.Append("\\b");
else if (c == '\t')
sb.Append("\\t");
else if (c == '\n')
sb.Append("\\n");
else if (c == '\f')
sb.Append("\\f");
else if (c == '\r')
sb.Append("\\r");
else
{
if (c < ' ')
{
//t = "000" + Integer.toHexString(c);
string tmp = new string(c, 1);
try
{
t = "000" + int.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
}
catch
{
//Letao.Common.Functions.ERP_ERROR(new Letao.Common.LTDB(), "错误的json字符:" + tmp,true);
sb.Append(c);
continue;
}
sb.Append("\\u" + t.Substring(t.Length - 4));
}
else
{
sb.Append(c);
}
}
}
return "\"" + sb.ToString() + "\"";
}
/// <summary>
/// 日期转换成JSON模式的字符串
/// </summary>
/// <param name="dte"></param>
/// <returns></returns>
public static string DateTime2JSON(DateTime dte) //将DateTime 转成JSON格式。
{
String dtResult = "";
//dtResult = "{\"DataType\":\"System.DateTime\",\"Value\":\"" +
// dte.ToUniversalTime().ToString("s") + "Z\"}";
dtResult = "\"" + dte.ToString() + "\"";
return dtResult;
}
4.客户端调用,很多童鞋反映不知道怎么去调用,简单的一个方法,再开一个vs见一个项目,添加服务引用,地址写进去,前往就OK了
using (SR.MyWcfClient client = new SR.MyWcfClient())
{
Console.WriteLine("========");
Console.WriteLine(client.GetDatas());
Console.WriteLine("完成");
Console.ReadKey();
}
Console.ReadKey();
5.运行结果:如图