老师让我用c#写一个类似sql格式化的工具,想问下原理是什么,如果有源码更好。

沉默是金1108 2016-05-03 11:39:37
如题
...全文
3259 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
清梦凉夜 2016-05-06
  • 打赏
  • 举报
回复
引用 10 楼 qq_34818107 的回复:
protected void Button1_Click(object sender, EventArgs e) { string sql = TextBox1.Text; if (TextBox1.Text == "") { Response.Write("<script>alert('请输入sql内容!')</script>"); } string[] sArray = sql.Split(new string[] { ",", "from", "inner", "join", "where", "group" }, StringSplitOptions.RemoveEmptyEntries); Response.ContentType = "textml";//textml text/xml // context.Response.Write("123456"); SqlDataReader sdr = SqlHelper.ExecuteReader(sql); StringBuilder sb = new StringBuilder(); sb.Append("<table>"); sb.Append("<tr><th></th><th></th><th></th></tr>"); while (sdr.Read()) { sb.AppendFormat("<tr><td>{0}</td><br><td>{1}</td><br><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td></tr><td>{}</td>", sdr["stuid"].ToString(), sdr["name"].ToString(), sdr["sex"].ToString()); } sb.Append("</table>"); sdr.Close(); Context.Response.Write(sb.ToString()); Context.Response.End(); }写了这么多,不知道该怎么写了
这个好像ASP.NET的。。。
清梦凉夜 2016-05-06
  • 打赏
  • 举报
回复
看一本讲C#的书吧,然后,里面讲数据库的那段。数据库操作语句都写在类似commandtext里面,你改成删除数据的语句应该就好了。如果要做成界面,可以把这些都写到button里面吧。 (我理解的格式化,就是数据清除。。。)
tinydyw 2016-05-03
  • 打赏
  • 举报
回复
....说得也太含糊了点.....
沉默是金1108 2016-05-03
  • 打赏
  • 举报
回复
没人吗?好急啊!!!!!!
crystal_lz 2016-05-03
  • 打赏
  • 举报
回复
简单点 字符串处理 复杂点 《编译原理》 如果真要做好 估计你们老师都搞不定因为要做好的话 并不那么简单 而他却叫连怎么下手都不知道的你做 说明他并不觉得这个东西很复杂 如果当作字符串处理用正则匹配处理 简单语句到无所谓 如果是复杂语句还嵌套查询什么的还有什么存储过程之内的 估计也够你玩了 而且一个不小心很出现很多bug 在比如 如果用户输入的sql语句本来就不合法怎么办? 下面是一个不靠谱的例子 比如一个简单的查询

select\s+(?<列部分>.*?)\s+from\s+(?<表部分>.*?)(\swhere\s+(?<条件部分>.*?))?;
//将关键部分匹配出来 然后
console.writeline("select");
//逗号才分列 然后以换行和tab合并才分结果
console.writeline("\t" + string.join(",\r\n\t",列部分.split(',')));
console.writeline("from");
...
总之用正则的方式去处理够你玩了 如果有下面的一条语句

select * from tb_test where xxx='select * from xxx where xxx'
还是去看编译原理吧。。。
衣舞晨风 2016-05-03
  • 打赏
  • 举报
回复
参考notepad++代码
沉默是金1108 2016-05-03
  • 打赏
  • 举报
回复
protected void Button1_Click(object sender, EventArgs e) { string sql = TextBox1.Text; if (TextBox1.Text == "") { Response.Write("<script>alert('请输入sql内容!')</script>"); } string[] sArray = sql.Split(new string[] { ",", "from", "inner", "join", "where", "group" }, StringSplitOptions.RemoveEmptyEntries); Response.ContentType = "textml";//textml text/xml // context.Response.Write("123456"); SqlDataReader sdr = SqlHelper.ExecuteReader(sql); StringBuilder sb = new StringBuilder(); sb.Append("<table>"); sb.Append("<tr><th></th><th></th><th></th></tr>"); while (sdr.Read()) { sb.AppendFormat("<tr><td>{0}</td><br><td>{1}</td><br><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td></tr><td>{}</td>", sdr["stuid"].ToString(), sdr["name"].ToString(), sdr["sex"].ToString()); } sb.Append("</table>"); sdr.Close(); Context.Response.Write(sb.ToString()); Context.Response.End(); }写了这么多,不知道该怎么写了
xuzuning 2016-05-03
  • 打赏
  • 举报
回复
是的,代码较多 网上有很多 C# 写成的编译器。都是学习《编译原理》时的习作
沉默是金1108 2016-05-03
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
这个很简单 SQL 指令是由 保留字和其他字符串 构成的,而作为子句的保留字也就那么几个 如果要问原理,那就是语法分析。《编译原理》中都有
如何用c#代码实现呢?这个是最难的吧
xuzuning 2016-05-03
  • 打赏
  • 举报
回复
这个很简单 SQL 指令是由 保留字和其他字符串 构成的,而作为子句的保留字也就那么几个 如果要问原理,那就是语法分析。《编译原理》中都有
tinydyw 2016-05-03
  • 打赏
  • 举报
回复
这个有些复杂了...主要思路就是遇见特定的符号或者字符串就进行一定的处理,比如遇见逗号就换行,from顶格并且后面空出一定空间什么的... 我所想到的就是首先将字符串根据select,from,where等关键字分割开,这里应该是用正则实现,然后保存为数组,数组再根据起始的关键字和对应的符号或字符串分割,比如select就用逗号分割,from就根据left/right join和on,where就根据and,这样... 你需要先理解格式化的规则....整理清楚逻辑再到程序里实现...
沉默是金1108 2016-05-03
  • 打赏
  • 举报
回复
引用 4 楼 tinydyw 的回复:
把关键字都大写,换色什么的? 感觉是个麻烦的东西呢..要做的大概就是识别,更正2块吧..
简单地写一写的话 识别用contains,更正用replace就行了..不知道你具体要做到什么程度了..

不需要其他功能 只需要将一大串sql语句输入,然后可以输出成整洁规整的sql就行
tinydyw 2016-05-03
  • 打赏
  • 举报
回复
把关键字都大写,换色什么的? 感觉是个麻烦的东西呢..要做的大概就是识别,更正2块吧.. 简单地写一写的话 识别用contains,更正用replace就行了..不知道你具体要做到什么程度了..
沉默是金1108 2016-05-03
  • 打赏
  • 举报
回复
就是类似p/sql的那种格式化功能

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧