PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

时间:2023-01-03 20:21:46

一.准备需转为DataTable的json字符串

原json字符串数据

[{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '

转换后的效果(横向)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

转换后的效果(竖向)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

二.C#写SQL SERVER(CLR) json转DataTable存储过程

利用Json反序列化为字典类型 Dictionary<string, object> key,value形式,然后再转为DataTable

  /// <summary>
/// Json转Table
/// </summary>
/// <param name="jsonString"></param>
/// <param name="isVerticalTable">是否竖表</param>
[Microsoft.SqlServer.Server.SqlProcedure]
public static void Json2Table(string jsonString, bool isVerticalTable)
{
SqlDataRecord dataRecord = new SqlDataRecord();
var ListObject = Json.Deserialize(jsonString) as List<object>;
var Object = Json.Deserialize(jsonString) as Dictionary<string, object>;
if (ListObject == null && Object == null)
return;
if (ListObject == null)
{
ListObject = new List<object>();
ListObject.Add(Object);
}
List<SqlMetaData> sqlMetaDatas = new List<SqlMetaData>();
Dictionary<string, object> KeyObject = (Dictionary<string, object>)ListObject[];
if (!isVerticalTable)
{
foreach (var jProperty in KeyObject)
{
sqlMetaDatas.Add(new SqlMetaData(jProperty.Key, SqlDbType.NVarChar, ));
}
dataRecord = new SqlDataRecord(sqlMetaDatas.ToArray());
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int i = ; i < ListObject.Count(); i++)
{
Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
int j = ;
foreach (var item in KeyObject)
{
dataRecord.SetString(j, DicObject[item.Key].ToStringJson());
j++;
}
SqlContext.Pipe.SendResultsRow(dataRecord);
}
SqlContext.Pipe.SendResultsEnd();
}
else
{
dataRecord = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("id", SqlDbType.Int), new SqlMetaData("key", SqlDbType.NVarChar, ), new SqlMetaData("value", SqlDbType.NVarChar, ) });
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int i = ; i < ListObject.Count(); i++)
{
Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
foreach (var item in DicObject)
{
dataRecord.SetInt32(, i + );
dataRecord.SetString(, item.Key.ToString());
dataRecord.SetString(, item.Value.ToStringJson());
SqlContext.Pipe.SendResultsRow(dataRecord);
}
}
SqlContext.Pipe.SendResultsEnd();
}
SqlContext.Pipe.Send("ok");
}
public static class StaticMethod
{
public static string ToStringJson(this object thisObject)
{
if (thisObject == null)
return "";
if (thisObject is Dictionary<string,object>)
return Json.Serialize(thisObject);
else if (thisObject is List<object>)
return Json.Serialize(thisObject);
return thisObject.ToString();
} }

开源MiniJSON类解析Json字符串

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text; namespace SQLClr
{
/// <summary>
/// This class encodes and decodes JSON strings.
/// Spec. details, see http://www.json.org/
///
/// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
/// All numbers are parsed to doubles.
/// </summary>
public static class Json
{
/// <summary>
/// Parses the string json into a value
/// </summary>
/// <param name="json">A JSON string.</param>
/// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns>
//反序列化
public static object Deserialize(string json)
{
// save the string for debug information
if (json == null)
{
return null;
} return Parser.Parse(json);
}
//阻止其他类从该类继承
sealed class Parser : IDisposable
{
const string WORD_BREAK = "{}[],:\""; public static bool IsWordBreak(char c)
{
// 如果 c 是空白,则为 true;否则,为 false;报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -;
} enum TOKEN
{
NONE,
CURLY_OPEN,
CURLY_CLOSE,
SQUARED_OPEN,
SQUARED_CLOSE,
COLON,
COMMA,
STRING,
NUMBER,
TRUE,
FALSE,
NULL
};
// 实现从字符串进行读取的 System.IO.TextReader。
StringReader json; Parser(string jsonString)
{
json = new StringReader(jsonString);
} public static object Parse(string jsonString)
{
using (var instance = new Parser(jsonString))
{
return instance.ParseValue();
}
}
//释放
public void Dispose()
{
json.Dispose();
json = null;
} Dictionary<string, object> ParseObject()
{
Dictionary<string, object> table = new Dictionary<string, object>(); // ditch opening brace
json.Read(); // {
while (true)
{
switch (NextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.CURLY_CLOSE:
return table;
default:
// name
string name = ParseString();
if (name == null)
{
return null;
} // :
if (NextToken != TOKEN.COLON)
{
return null;
}
// ditch the colon
json.Read(); // value
table[name] = ParseValue();
break;
}
}
} List<object> ParseArray()
{
List<object> array = new List<object>(); // ditch opening bracket
json.Read(); // [
bool parsing = true;
while (parsing)
{
TOKEN nextToken = NextToken; switch (nextToken)
{
case TOKEN.NONE:
return null;
case TOKEN.COMMA:
continue;
case TOKEN.SQUARED_CLOSE:
parsing = false;
break;
default:
object value = ParseByToken(nextToken); array.Add(value);
break;
}
} return array;
} object ParseValue()
{
TOKEN nextToken = NextToken;
return ParseByToken(nextToken);
} object ParseByToken(TOKEN token)
{
switch (token)
{
case TOKEN.STRING:
return ParseString();
case TOKEN.NUMBER:
return ParseNumber();
case TOKEN.CURLY_OPEN:
return ParseObject();
case TOKEN.SQUARED_OPEN:
return ParseArray();
case TOKEN.TRUE:
return true;
case TOKEN.FALSE:
return false;
case TOKEN.NULL:
return null;
default:
return null;
}
} string ParseString()
{
StringBuilder s = new StringBuilder();
char c; // ditch opening quote
json.Read(); bool parsing = true;
while (parsing)
{ if (json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
parsing = false;
break;
case '\\':
if (json.Peek() == -)
{
parsing = false;
break;
} c = NextChar;
switch (c)
{
case '"':
case '\\':
case '/':
s.Append(c);
break;
case 'b':
s.Append('\b');
break;
case 'f':
s.Append('\f');
break;
case 'n':
s.Append('\n');
break;
case 'r':
s.Append('\r');
break;
case 't':
s.Append('\t');
break;
case 'u':
var hex = new char[]; for (int i = ; i < ; i++)
{
hex[i] = NextChar;
} s.Append((char)Convert.ToInt32(new string(hex), ));
break;
}
break;
default:
s.Append(c);
break;
}
} return s.ToString();
} object ParseNumber()
{
string number = NextWord;
// 摘要:
// 报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
//
// 参数:
// value:
// 要查找的 Unicode 字符。
//
// 返回结果:
// 如果找到该字符,则为 value 的从零开始的索引位置;如果未找到,则为 -1。
if (number.IndexOf('.') == -)
{
long parsedInt;
// 将数字的字符串表示形式转换为它的等效 64 位有符号整数。一个指示转换是否成功的返回值。
Int64.TryParse(number, out parsedInt);
return parsedInt;
} double parsedDouble;
Double.TryParse(number, out parsedDouble);
return parsedDouble;
}
//
void EatWhitespace()
{
//指示指定字符串中位于指定位置处的字符是否属于空白类别。
while (Char.IsWhiteSpace(PeekChar))
{
json.Read();
//摘要:
// 返回下一个可用的字符,但不使用它。
//
// 返回结果:
// 表示下一个要读取的字符的整数,或者,如果没有更多的可用字符或该流不支持查找,则为 -1。
if (json.Peek() == -)
{
break;
}
}
} char PeekChar
{
get
{
// 读取输入字符串中的下一个字符并将该字符的位置提升一个字符。
//
// 返回结果:
// 基础字符串中的下一个字符,或者如果没有更多的可用字符,则为 -1。
return Convert.ToChar(json.Peek());
}
} char NextChar
{
get
{
return Convert.ToChar(json.Read());
}
} string NextWord
{
get
{
// 表示可变字符字符串。无法继承此类。
StringBuilder word = new StringBuilder(); while (!IsWordBreak(PeekChar))
{
// 摘要:
// 在此实例的结尾追加指定 Unicode 字符的字符串表示形式。
//
// 参数:
// value:
// 要追加的 Unicode 字符。
//
// 返回结果:
// 完成追加操作后对此实例的引用。
word.Append(NextChar);
//下一个字符为空
if (json.Peek() == -)
{
break;
}
}
//
return word.ToString();
}
} TOKEN NextToken
{
get
{
EatWhitespace(); if (json.Peek() == -)
{
return TOKEN.NONE;
} switch (PeekChar)
{
case '{':
return TOKEN.CURLY_OPEN;
case '}':
json.Read();
return TOKEN.CURLY_CLOSE;
case '[':
return TOKEN.SQUARED_OPEN;
case ']':
json.Read();
return TOKEN.SQUARED_CLOSE;
case ',':
json.Read();
return TOKEN.COMMA;
case '"':
return TOKEN.STRING;
case ':':
return TOKEN.COLON;
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '':
case '-':
return TOKEN.NUMBER;
} switch (NextWord)
{
case "false":
return TOKEN.FALSE;
case "true":
return TOKEN.TRUE;
case "null":
return TOKEN.NULL;
} return TOKEN.NONE;
}
}
} /// <summary>
/// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
/// </summary>
/// <param name="json">A Dictionary<string, object> / List<object></param>
/// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
public static string Serialize(object obj)
{
return Serializer.Serialize(obj);
} sealed class Serializer
{
StringBuilder builder; Serializer()
{
//创建生成器
builder = new StringBuilder();
}
//序列化
public static string Serialize(object obj)
{
var instance = new Serializer(); instance.SerializeValue(obj); return instance.builder.ToString();
}
//类型
void SerializeValue(object value)
{
IList asList;
IDictionary asDict;
string asStr; if (value == null)
{
builder.Append("null");
}
else if ((asStr = value as string) != null)
{
SerializeString(asStr);
}
else if (value is bool)
{
builder.Append((bool)value ? "true" : "false");
}
else if ((asList = value as IList) != null)
{
SerializeArray(asList);
}
else if ((asDict = value as IDictionary) != null)
{
SerializeObject(asDict);
}
else if (value is char)
{
SerializeString(new string((char)value, ));
}
else
{
SerializeOther(value);
}
}
//序列化对象
void SerializeObject(IDictionary obj)
{
bool first = true; builder.Append('{'); foreach (object e in obj.Keys)
{
if (!first)
{
builder.Append(',');
} SerializeString(e.ToString());
builder.Append(':'); SerializeValue(obj[e]); first = false;
} builder.Append('}');
}
// 序列化数组
void SerializeArray(IList anArray)
{
builder.Append('['); bool first = true; foreach (object obj in anArray)
{
if (!first)
{
builder.Append(',');
} SerializeValue(obj); first = false;
} builder.Append(']');
}
//string
void SerializeString(string str)
{
builder.Append('\"'); char[] charArray = str.ToCharArray();
foreach (var c in charArray)
{
switch (c)
{
case '"':
builder.Append("\\\"");
break;
case '\\':
builder.Append("\\\\");
break;
case '\b':
builder.Append("\\b");
break;
case '\f':
builder.Append("\\f");
break;
case '\n':
builder.Append("\\n");
break;
case '\r':
builder.Append("\\r");
break;
case '\t':
builder.Append("\\t");
break;
default:
int codepoint = Convert.ToInt32(c);
if ((codepoint >= ) && (codepoint <= ))
{
builder.Append(c);
}
else
{
//builder.Append("\\u");
//builder.Append(codepoint.ToString("x4"));
builder.Append(c);
}
break;
}
} builder.Append('\"');
}
//其他
void SerializeOther(object value)
{
// NOTE: decimals lose precision during serialization.
// They always have, I'm just letting you know.
// Previously floats and doubles lost precision too.
//注意:小数在序列化过程中丢失精度。
//他们总是有,我只是让你知道。
//以前失去精度和双精度浮点数。
if (value is float)
{
builder.Append(((float)value).ToString("R"));
}
else if (value is int
|| value is uint
|| value is long
|| value is sbyte
|| value is byte
|| value is short
|| value is ushort
|| value is ulong)
{
builder.Append(value);
}
else if (value is double
|| value is decimal)
{
builder.Append(Convert.ToDouble(value).ToString("R"));
}
else
{
SerializeString(value.ToString());
}
}
}
}
}

三.SQL服务器CLR配置(允许SQL调用.net程序)

    sp_configure 'show advanced options', 1;
RECONFIGURE WITH override
GO
sp_configure 'clr enabled', 1;
RECONFIGURE WITH override
GO
Sp_changedbowner 'sa',true --sa改为当前登入用户名
alter database [dbname] set trustworthy on --bbname 改为自己的库名

四.注册 CLR 程序集

   create  ASSEMBLY SQLfunctionAssembly
FROM 'D:\SQLClr.dll' --改为自己C#写的dll路径填写
WITH PERMISSION_SET = UNSAFE;

创建的.net程序集数据会写入下表:

  select * from sys.assemblies
select * from sys.assembly_files

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

五.创建存储过程

   CREATE PROCEDURE[dbo].[Json2Table] (
@jsonString NVARCHAR(max),
@isVerticalTable bit
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[Json2Table] --[SQL程序集名].[命名空间.类名].[方法名]

六.测试Json转DataTable存储过程

DECLARE @jsonString VARCHAR(MAX)
SET @jsonString = '
[{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '
exec dbo.Json2Table @jsonString,0 --0转横表 1转竖表

运行后结果(转横表)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

运行后结果(转竖表)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法的更多相关文章

  1. PCB MS SQL 标量函数&lpar;CLR&rpar; 实现DataTable转Json方法

    一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...

  2. PCB MS SQL 排序应用---SQL相邻数据区间值求解

    其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...

  3. PCB MS SQL 标量函数&lpar;CLR&rpar; 实现Socket发送消息

    在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的.比如有这样的应用场景! 当SQL SERVER数据库满足某个条件 ...

  4. PCB MS SQL 标量函数与表值函数&lpar;CLR&rpar; 实现文件与目录操作

    一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...

  5. PCB MS SQL 标量函数&lpar;CLR&rpar; 实现DataTable转HTML的方法

    一.准备需转为HMLT字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的HTML的文本 <html ><head></head>< ...

  6. json转datatable&lpar;正则表达式的方法&rpar;

    /// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson&quot ...

  7. PCB MS SQL CLR聚合函数&lpar;函数作用,调用顺序&comma;调用次数&rpar; CLR说明

    用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...

  8. PCB MS SQL表值函数与CLR 表值函数 &lpar;例:字符串分割转表&rpar;

    将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5 ...

  9. PCB MS SQL SERVER版本管控工具source&lowbar;safe&lowbar;for&lowbar;sql&lowbar;server

    PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果, 而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程...这个过程是复杂的 想一想, ...

随机推荐

  1. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  2. ProGuard代码混淆技术详解

    前言     受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI ...

  3. iOS app上传错误集锦&lpar;转载&rpar;

    1.工程里增加了版本自动更新. 2.未增加判断网络状态的类Reachability. 3.问题:error itms -90049 This bundel is invalid. The bundle ...

  4. 低功耗蓝牙4&period;0BLE编程-nrf51822开发&lpar;8&rpar;-GATT

    The Generic Attribute Profile (GATT)使用属性定义一个服务框架,定义了服务和特性的过程和数据格式,包含发现.读取.写入.通知指示特性和配置特性广播. GATT配置文件 ...

  5. Java日期时间处理常用方法

    虽然是老生常谈,但整理出来还是有点用. 1.由字符串时间得到Date类型时间 // 由字符串时间得到Date类型时间 public static Date getDateFrom(String str ...

  6. 关于spring-mvc的InitBinder注解的参数

    关于spring-mvc的InitBinder注解的参数 通过Spring-mvc的@InitBinder注释的方法可以对WebDataBinder做一些初始化操作.比如设置Validator. 我一 ...

  7. android 计时器,倒计时

    自己定义CountDownTimer /** * 计时器 * @author Administrator * */ class TimeCount extends CountDownTimer{ pu ...

  8. http协议状态码解析

    关键词 HTTP协议 状态码 摘要 本文列出了HTTP协议的所有的状态码,并对每个状态码的含义作了深入的解释,以便大家参考.   本文列出了HTTP协议的所有的状态码,并对每个状态码的含义作了深入的解 ...

  9. 将 Idea 常用快捷键 设置为 Eclipse 的快捷键

  10. oracle TDE

    转自:oracle TDE学习系列 (1) — wallet 使用管理 关于oracle wallet,通常称为oracle钱夹,说的通俗一点,oracle wallet是一个用 口令加密的PKCS# ...