以下SQL以防以后还需用到,特此备份
删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL
1 ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] 2 ( 3 @leavewordID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 BEGIN TRANSACTION 10 DELETE FROM tb_leavewordID WHERE leavewordID=@leavewordID 11 DELETE FROM tb_reply WHERE leavewordID=@leavewordID 12 SET @record=0 --成功 13 COMMIT TRANSACTION 14 END TRY 15 BEGIN CATCH 16 ROLLBACK TRANSACTION 17 SET @record=-1 --失败 18 END CATCH 19 RETURN @record 20 END
删除一条新闻,一条新闻可能有多条留言,每条留言可能有回复信息,这时我们删除一条新闻的SQL如下
1 ALTER PROCEDURE [dbo].[proc_tb_news_delete] 2 ( 3 @newsID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 DECLARE @leavewordCount INT --留言个数 9 DECLARE @delete_where VARCHAR(4000) --留言id字符,类似1,2,4,5,6 10 SET @leavewordCount=(SELECT ISNULL(COUNT(1),0) FROM tb_leaveword WHERE newsID=@newsID) 11 SET @delete_where='' 12 13 IF(@leavewordCount=0) --此条新闻无留言时 14 BEGIN TRY 15 DELETE FROM tb_news WHERE newsID=@newsID 16 SET @record=0 --成功 17 END TRY 18 BEGIN CATCH 19 SET @record=-1 --失败 20 END CATCH 21 22 ELSE IF(@leavewordCount>0) --此条新闻有留言时 23 ----获取删除条件(start)---- 24 DECLARE MY_CURSOR CURSOR 25 FOR SELECT leavewordID FROM tb_news WHERE newsID=@newsID 26 BEGIN 27 DECLARE @leavewordID INT 28 OPEN MY_CURSOR 29 FETCH NEXT FROM MY_CURSOR INTO @leavewordID 30 IF(@leavewordID IS NOT NULL) 31 SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+',' 32 WHILE(@@FETCH_STATUS<>-1) 33 BEGIN 34 SET @leavewordID=NULL 35 FETCH NEXT FROM MY_CURSOR INTO @leavewordID 36 IF(@leavewordID IS NOT NULL) 37 SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+',' 38 END 39 END 40 CLOSE MY_CURSOR 41 DEALLOCATE MY_CURSOR 42 SET @delete_where=SUBSTRING(@delete_where,1,LEN(@delete_where)-1) 43 ----获取删除条件(end)---- 44 BEGIN 45 BEGIN TRY 46 BEGIN TRANSACTION 47 DELETE FROM tb_news WHERE newsID=@newsID 48 EXECUTE('DELETE FROM tb_leaveword WHERE leavewordID IN('+@delete_where+')') 49 EXECUTE('DELETE FROM tb_reply WHERE leavewordID IN('+@delete_where+')') 50 SET @record=0 --成功 51 COMMIT TRANSACTION 52 END TRY 53 BEGIN CATCH 54 ROLLBACK TRANSACTION 55 SET @record=-1 --失败 56 END CATCH 57 END 58 RETURN @record 59 END
删除一新闻类型时,可能此类型下有多条新闻,此条新闻下又有多条留言,留言下又有多条回复,依次级联删除,如下存储过程
1 ALTER PROCEDURE [dbo].[proc_tb_news_type_delete] 2 ( 3 @typeID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 DECLARE @newsCount INT --此类新闻下的新闻个数 9 SET @newsCount=(SELECT ISNULL(COUNT(1),0) FROM tb_news WHERE typeID=@typeID) 10 IF(@newsCount=0) --此类型下无新闻 11 BEGIN TRY 12 DELETE FROM tb_news_type WHERE typeID=@typeID 13 SET @record=0 --成功 14 END TRY 15 BEGIN CATCH 16 SET @record=-1 --失败 17 END CATCH 18 19 ELSE IF(@newsCount>0) --此类型下有新闻 20 BEGIN TRY 21 BEGIN TRANSACTION 22 DECLARE MY_CURDOR CURSOR 23 FOR SELECT newsID FROM tb_news WHERE typeID=@typeID 24 BEGIN 25 DECLARE @newsID INT 26 OPEN MY_CURSOR 27 FETCH NEXT FROM MY_CURSOR INTO @newsID 28 IF(@newsID IS NOT NULL) 29 DELETE FROM tb_news_type WHERE typeID=@typeID 30 EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程 31 WHILE(@@FETCH_STATUS<>-1) 32 BEGIN 33 SET @newsID=NULL 34 FETCH NEXT FROM MY_CURSOR INTO @newsID 35 IF(@newsID IS NOT NULL) 36 DELETE FROM tb_news_type WHERE typeID=@typeID 37 EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程 38 END 39 END 40 CLOSE MY_CURSOR 41 DEALLOCATE MY_CURSOR 42 COMMIT TRANSACTION 43 END TRY 44 BEGIN CATCH 45 ROLLBACK TRANSACTION 46 SET @record=-1 --失败 47 END CATCH 48 RETURN @record 49 END
当删除多条新闻类型时,我们需要把拼接好的类型id,例如:1,2,4,5,12,34,穿入存储过程,分割字符的SQL语句如下所示:
1 DECLARE @A VARCHAR(5000) 2 DECLARE @i INT 3 SET @A='A,B,C,D,D,S,X,C,C,C,D,AAAA,DDDDDD,DEF,ERT,' 4 SET @i=CHARINDEX(',',@A) 5 6 WHILE @i>=1 7 BEGIN 8 PRINT LEFT(@A,@i-1) 9 SET @A=SUBSTRING(@A,@i+1,LEN(@A)-1) 10 SET @i=CHARINDEX(',',@A) 11 END
删除多条新闻类型SQL如下:
1 ALTER PROCEDURE [dbo].[proc_tb_news_type_selects_delete] 2 ( 3 @typeID_list VARCHAR(500), 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 BEGIN TRANSACTION 10 DECLARE @index INT 11 DECLARE @typeID INT 12 SET @typeID_list=RTRIM(LTRIM(@typeID_list)) 13 SET @index=CHARINDEX(',',@typeID_list) 14 WHILE @index>=1 15 BEGIN 16 SET @typeID=CAST(LEFT(@typeID_list,@index-1) AS INT) 17 EXECUTE proc_tb_news_type_delete @typeID=@typeID 18 SET @typeID_list=SUBSTRING(@typeID_list,@index+1,LEN(@typeID_list)-1) 19 SET @index=CHARINDEX(',',@typeID_list) 20 END 21 COMMIT TRANSACTION 22 SET @record=0 --成功 23 END TRY 24 BEGIN CATCH 25 ROLLBACK TRANSACTION 26 SET @record=-1 --失败 27 END CATCH 28 RETURN @record 29 END
如需转载,请注明出处
类泛型的约束:
1 public static class ToModel<T> where T : class, new()
定义委托:
1 public delegate void SetString(string value);
创建委托方法:
1 private static SetString CreateStringDelegate(T model, string propertyName) 2 { 3 MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod(); 4 Type type = typeof(SetString); 5 return Delegate.CreateDelegate(type, model, mi) as SetString; 6 }
利用反射和委托将DataTable转换为实体集:
1 public static IList<T> GetDelegate_ToModelList(DataTable dt) 2 { 3 IList<T> list = new List<T>(); 4 if (dt == null || dt.Rows.Count < 1) return list; 5 SetString setDelegateString; 6 foreach (DataRow dr in dt.Rows) 7 { 8 T model = new T(); 9 foreach (DataColumn dc in dt.Columns) 10 { 11 setDelegateString = CreateStringDelegate(model, dc.ColumnName); 12 setDelegateString(dr[dc.ColumnName].ToString()); 13 } 14 list.Add(model); 15 } 16 return list; 17 }
这样写问题就来了,因为委托定义的参数时string类型的,因为我们实体中可能有int或者DateTime类型的,这时就需要用上泛型委托了
如果这样定义委托:
1 public delegate void SetString<PT>(PT value)
创建委托方法(这里有问题,不知如何处理):
1 private static SetString CreateStringDelegate(T model, string propertyName) 2 { 3 MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod(); 4 Type type = typeof(model).GetProperty(propertyName).PropertyType; 5 return Delegate.CreateDelegate(type, model, mi) as SetString<type>; 6 }
利用反射和委托将DataTable转换为实体集:
1 public static IList<T> GetDelegate_ToModelList(DataTable dt) 2 { 3 IList<T> list = new List<T>(); 4 if (dt == null || dt.Rows.Count < 1) return list; 5 foreach (DataRow dr in dt.Rows) 6 { 7 T model = new T(); 8 foreach (DataColumn dc in dt.Columns) 9 { 10 SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName); 11 setDelegateString(dr[dc.ColumnName].ToString()); 12 } 13 list.Add(model); 14 } 15 return list; 16 }
一直疑惑着,希望有人帮我解决疑惑,直接反射的方法我也有,但是这个问题不解决,心里一直有疙瘩,希望有人帮帮忙,谢谢!
原来也写过一篇关于百度Ueditor编辑器的介绍:百度Ueditor编辑器的使用,ASP.NET也可上传图片
最开始是使用CuteEditor控件,需要好几mb的空间,因为刚开始学习ASP.NET的时候,觉得简单就是拉控件上去,后来自己发现了百度Ueditor编辑器,再后来看见热心人的评论也知道了KindEditor编辑器,后来也改用了这个 KindEditor编辑器 ,因为它比百度编辑器占的空间小,感觉也好一点,后来做网站,有时站内留言或者发贴子,我觉得这类编辑器功能太多了点,总感觉只适合新闻类编辑器,后来就网上不停的百度和Google查找,找了很久看见了淘宝开源的Kissy Editor编辑器,感觉很好,后来不小心在博客园又发现了一个简易的编辑器,感觉更容易看懂,也方便修改,只是界面没有淘宝的好看,但是对于简易的留言板还是够用了,两编辑器界面如下所示:
Kissy Editor编辑器
简易编辑器,是查看了博客园http://www.cnblogs.com/lexus/archive/2010/09/12/1824214.html这篇博客
kissy editor目录结构如下图所示:
kissy editor可以根据个人需求,ToolBar可以控制显示哪些,可输入字符个数,等等都可以在editor-aio.js脚本文件中修改,由于此脚本只显示一行,找到相应修改的位置有点困难,你可以先查看editor.js脚本文件,找到需要修改的地方,然后在editor-aio.js中查找,如下修改字符个数的操作,如图所示:

kissy editor 的工具条也可以找到相应的editor-aio.js 文件进行修改,如下图所示:
淘宝上下载,会有一个demo的例子,由于我不想在此目录下面,因为我写的一个小例子,不在此目录下方,我就修改了路径,原有的那个demo.html中图像选择会显示不出图片,如下图所示:
需要按照自己的项目需求而修改,这里只是举了一个简单的例子。
kissy editor 的使用代码如下所示:
3 <head>
4 <title></title>
5 <link href="kissy_editor/themes/default/editor-min.css" rel="stylesheet" type="text/css" />
6 <style type="text/css">
7 #Submit1{ padding:5px 5px 5px 5px;}
8 </style>
9 </head>
10 <body>
11 <form action="data.aspx" method="post">
12 <textarea id="demo" name="code" cols="142" rows="15">
13 <p>欢迎使用 KISSY Editor!</p>
14 </textarea>
15 <p><input id="Submit1" type="submit" value="提交" /></p>
16 </form>
17 <script src="kissy_editor/editor-aio.js" type="text/javascript"></script>
18 <script type="text/javascript">KISSY.Editor("demo");</script>
19 </body>
20 </html>
下面说一下简易HTMl编辑器,使用方式如下代码所示:
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
5 <title></title>
6 <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
7 <script src="ebox/ebox.js" type="text/javascript"></script>
8 </head>
9 <body>
10 <form action="data.aspx" method="post">
11 <textarea name="code" id="ebox">欢迎使用简易编辑器</textarea>
12 <p><input type="submit" value="submit" /></p>
13 </form>
14 <div style=" margin:0 auto; text-align:center;"></div>
15 <script type="text/javascript">
16 $("#ebox").css("height", "350px").css("width", "100%").htmlbox({
17 toolbars: [
18 [
19 "undo", "redo", "removeformat", "bold",
20 "underline", "strike", "italic", "sup", "sub",
21 "left", "center", "right", "indent", "outdent",
22 "link", "unlink", "image", "quote", "striptags", "code",
23 "fontcolor", "highlight", "fontsize", "fontfamily", "styles"
24 ]
25 ]
26 });
27 </script>
28 </body>
29 </html>
相信你看见了代码,就知道可以更改ToolBar显示哪些已有的功能,很简单吧。
写了有些凌乱,不要见怪,在此分享,那些需要简易编辑器的,下载使用,还是不错的选择。
下载地址:点击这里下载
版权所有,转载请注明出处!
一切伟大的行动和思想,都有一个微不足道的开始。微不足道的我,正在吸取知识的土壤,希望能取得成功!不嫌弃我微不足道的,愿交天下好友!
什么是LINQ
- LINQ(发音为link)代表语言集成查询(Language Integrated Query)
- 详细见LINQ
匿名类型
第一个成员初始化器是赋值形式,第二个是成员访问表达式,第三个是标示符形式,如下实例所示:
1 string Sex = "男"; 2 var person = new { Age = 24, SimpleClass.Name, Sex }; 3 Console.WriteLine("{0},Sex{1},Age {2}",person.Name,person.Sex,person.Age);
运行结果:

注意标示符形式和访问表达式必须定义在匿名类型申明之前,Sex是一个局部变量,Name是类SimpleClass的静态字段。
尽管在代码中看不到匿名类型,对象浏览器却能看到。如果编译器遇到了另一个具有相同参数名、相同引用类型名和相同顺序的匿名类型,它会重用这个类型并直接创建新的实例,而不会创建新的匿名类型。
查询语法和方法语法
- 查询语法(query syntax)是声明形式的,看上去和SQL的语句很相似。查询语法使用查询表达式书写。
- 方法语法(method syntax)是命令形式,它的使用是标准的方法调用。方法是一组叫做标准查询运算符的方法。
- 在一个查询中也可以组合以上两种形式。
示例代码如下所示:
1 var query1 = from n in Enumerable.Range(1, 10) 2 where n < 8 3 select n; 4 Console.Write("查询语法得到结果:"); 5 foreach (var v in query1) Console.Write("{0}\t",v); 6 7 var query2 = Enumerable.Range(1, 8).Where(n => n < 8); 8 Console.WriteLine(""); 9 Console.Write("方法语法得到结果:"); 10 foreach (var v in query2) Console.Write("{0}\t", v); 11 12 int count = (from n in Enumerable.Range(1, 10) 13 where n < 8 14 select n).Count(); 15 Console.WriteLine(""); 16 Console.WriteLine("两种方式的组合:{0}", count);
运行结果:

查询表达式的结构
1、from子句
- from子句指定了要作为数据源使用的数据集合。它也引入了迭代变量,迭代变量有序表示数据源的每一个元素。
1 int[] arr = { 1, 5, 9, 8, 45, 23, 26, 14, 7, 8, 9 }; 2 var query = from n in arr //(n->迭代变量) 3 where n < 10 //使用迭代变量 4 select n; //使用迭代变量 5 foreach (var v in query) Console.Write("{0}\t",v); 6 Console.WriteLine("");
运行结果:

2、join子句
- LINQ中的join子句和SQL中的join很相似,连接操作接受两个集合然后创建一个临时的对象集合,每个对象包含原始集合对象中的所有字段,使用连接来结合两个或更多个集合中的数据。
示例代码如下:
1 public class Student 2 { 3 public int StID; 4 public string LastName; 5 } 6 public class CourseStudent 7 { 8 public string CourseName; 9 public int StID; 10 } 11 12 CourseStudent[] studentInCourses = new CourseStudent[]{ 13 new CourseStudent{CourseName="Art",StID=1}, 14 new CourseStudent{CourseName="Art",StID=3}, 15 new CourseStudent{CourseName="History",StID=1}, 16 new CourseStudent{CourseName="History",StID=2}, 17 new CourseStudent{CourseName="Physics",StID=3} 18 }; 19 Student[] students = new Student[] { 20 new Student{StID=1,LastName="张三"}, 21 new Student{StID=2,LastName="李四"}, 22 new Student{StID=3,LastName="王五"} 23 }; 24 25 //获取选修2门课以上同学的名字 26 var query = (from s in students 27 join c in studentInCourses on s.StID equals c.StID 28 where (from x in studentInCourses where x.StID==c.StID select x.StID).Count()>1 29 select s.LastName).Distinct(); 30 foreach (var v in query) Console.Write("{0}\t",v); 31 Console.WriteLine(""); 32 //获取选修历史同学的名字 33 var query1 = from s in students 34 join c in studentInCourses on s.StID equals c.StID 35 where c.CourseName == "History" 36 select s.LastName; 37 foreach (var v in query1) Console.Write("{0}\t", v);
运行结果:

查询主体中的from...let...where片段
- 可选的from...let...where部分是查询主体的第一部分,可以由任意数量的3个子句来组合--from子句、let子句和where子句。
1、from子句
- 查询表达式必须从from子句开始,后面跟的是查询主体。主体本身可以从任何数量的其他from子句开始,每一个from子句都指定了一个额外的数据源集合并引入了要在之后运算的迭代变量,所有from子句的语法和含义都是一样的。
示例代码如下:
1 var someInts = from a in Enumerable.Range(1, 5) //必须的第一个from子句 2 from b in Enumerable.Range(6, 5) //查询主体的第一个子句 3 where a < 3 && b < 10 4 select new { a, b, sum = a + b }; //匿名类型对象 5 foreach (var v in someInts) Console.WriteLine(v);
2、let子句
- let子句接受一个表达式的运算并把它赋值给一个需要在其他运算中使用的标示符。
示例代码如下:
1 var someInts = from a in Enumerable.Range(1, 5) 2 from b in Enumerable.Range(6, 5) 3 let sum = a + b //在新的变量中保存结果 4 where sum == 12 5 select new { a, b, sum }; 6 foreach (var v in someInts) Console.WriteLine(v);
运行结果:

3、where子句
- where子句根据之后的运算来去除不符合指定条件的项。
示例代码如下:
1 var someInts = from a in Enumerable.Range(1, 5) 2 from b in Enumerable.Range(6, 5) 3 let sum = a + b 4 where sum > 12 //条件一 5 where a==4 //条件二 6 select new { a, b, sum }; 7 foreach (var v in someInts) Console.WriteLine(v);
运行结果:

orderby子句
- orderby子句接受一个表达式并根据表达式依次返回结果项,orderby子句的默认排序是升序,然而我们可以使用ascending和descending关键词显示第设置元素排序为升序或降序,ordery可以有任意多个子句,它们必须用逗号隔开。
示例代码如下:
1 var persons = new[] { //匿名类型的对象数组 2 new {Name="张三",Sex="男",Age=32,Address="广东深圳"}, 3 new {Name="李四",Sex="男",Age=26,Address="广东广州"}, 4 new {Name="王五",Sex="女",Age=22,Address="广东深圳"}, 5 new {Name="赵六",Sex="男",Age=33,Address="广东东莞"} 6 }; 7 var query = from p in persons 8 orderby p.Age 9 select p; 10 foreach (var p in query) Console.WriteLine("Name:{0},Sex:{1},Age:{2},Address:{3}", p.Name, p.Sex, p.Age, p.Address);
运行结果:

group by子句
- group子句把select的对象根据一些标准进行分组。例如,有了前面示例人的数组,程序可以根据它们的所在地进行分组。
- group by如果项包含在查询结果中,它们就可以根据某个字段的值进行分组。作为分组依据的项叫做键(key);和select子句不同,group子句不从原始的数据源中返回可枚举的可枚举类型,而是返回以枚举已经形成的项的分组的可枚举类型;分组本身是可枚举类型,它们可枚举实际的项。
示例代码如下:
1 var persons = new[] { //匿名类型的对象数组 2 new {Name="张三",Sex="男",Age=32,Address="广东深圳"}, 3 new {Name="李四",Sex="男",Age=26,Address="广东广州"}, 4 new {Name="王五",Sex="女",Age=22,Address="广东深圳"}, 5 new {Name="赵六",Sex="男",Age=33,Address="广东东莞"} 6 }; 7 var query = from p in persons 8 group p by p.Address; 9 foreach (var v in query) //枚举分组 10 { 11 Console.WriteLine("{0}",v.Key); //分组键 12 foreach (var t in v) //枚举分组中的项 13 { 14 Console.WriteLine("Name:{0},Sex:{1},Age:{2},Address:{3}", t.Name, t.Sex, t.Age, t.Address); 15 } 16 }
运行结果:

查询延续
- 查询延续子句可以接受查询的一部分结果并赋予一个名字,从而可以查询的另一部分中使用。
示例代码如下:
1 var somInts = from a in Enumerable.Range(1, 10) 2 join b in Enumerable.Range(5, 10) on a equals b 3 into groupTemp //查询延续 4 from c in groupTemp 5 select c; 6 foreach (var v in somInts) Console.WriteLine(v);
运行结果如下:

使用委托参数和Lambda的示例
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
示例代码如下:
1 IList<int> list = Enumerable.Range(1, 100).ToList(); 2 Func<int, bool> myDel = delegate(int x) { return x % 2 == 1; };//委托匿名方法 3 var countOdd1 = list.Count(myDel);//调用委托 4 var countOdd2 = list.Count(x => x % 2 == 1);//Lambda表达式 5 Console.WriteLine("委托参数得到奇数的个数:{0}",countOdd1); 6 Console.WriteLine("Lambda得到奇数的个数:{0}", countOdd2);
运行结果:

版权所有,转载请注明出处!
一切伟大的行动和思想,都有一个微不足道的开始。微不足道的我,正在吸取知识的土壤,希望能取得成功!不嫌弃我微不足道的,愿交天下好友!