http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7767|回复: 5

[总群] 问你们个习惯的问题:在类里,经常拼SQL语句,你们习惯用string还是StringBuilder?

[复制链接]
发表于 2013-6-25 14:55:48 | 显示全部楼层 |阅读模式
♂nidaye1() 14:53:15
问你们个习惯的问题:在类里,经常拼SQL语句,你们习惯用string还是StringBuilder?

♂站长苏飞() 14:53:48
StringBuilder这是必须的。

♀linxin() 14:53:58
StringBuilder

♂nidaye1() 14:54:00
恩,我现在用的也是这个。

♂[山东]火山() 14:54:06
StringBuilder





1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-6-25 15:13:08 | 显示全部楼层
飞哥StringBuilder是线程安全的吗?
 楼主| 发表于 2013-6-25 15:21:17 | 显示全部楼层
nidaye1() 14:56:18
0.jpg

♂nidaye1() 14:56:25
那是用上面这种定义,还是下面的?
♂[北京]-Ro4ters() 14:57:24
在哪用写在哪...

♂[北京]-Ro4ters() 14:57:44
我每次是这样.怕重复用的时候直接习惯的append了...

♂¤好孩子¤ () 14:58:32
定义个全局的,如果两个方法串不同,则Clear()一下么

[重庆]Eagle() 14:58:54
定义全局

♂nidaye1() 14:59:01
谢谢,

♂nidaye1() 14:59:03
stringbuilder没有clear

♂[北京]-Ro4ters() 14:59:07
写起劲了...万一忘了咋办.

[重庆]Eagle() 14:59:19
new是创建一个新的

[重庆]Eagle() 14:59:24
占用堆栈

♂[北京]-Ro4ters() 14:59:31
这到没注意看有没有clear.

♂¤好孩子¤ () 14:59:54
1.jpg

♂[北京]-Ro4ters() 14:59:57
定义全局.每次new也行.

[重庆]Eagle() 14:59:59
而stringbuilder本身就是直接抄作栈的

♂¤好孩子¤ () 14:59:59
可以这样写的呀

♂¤好孩子¤ () 15:00:10
习惯好了么

♂站长苏飞() 15:00:26
这个必须有,

♂¤好孩子¤ () 15:00:43


♂¤好孩子¤ () 15:00:46
必须 有!

♂nidaye1() 15:00:48
我晕,我的版本有问题?

♂[北京]-Ro4ters() 15:00:52
  这就是个人习惯问题吧..就像写个方法什么的.你习惯用public还是private..在不考虑其他因素的情况下./
♂nidaye1() 15:01:02
2.jpg

♂_ 丶(369713029) 15:01:24
r

♂站长苏飞() 15:01:32
如果在一个类里面的变量没有在各个方法之间进行相互操作的可能,最好是定义成局部变量,少一个全局变量服务器少一点压力。

♀linxin() 15:01:56


♀linxin() 15:02:08
站长说的很有道理

♂站长苏飞() 15:02:09
public是在Private不能达到效果时才使用

♂nidaye1() 15:02:43
恩,是这样的:我是各个方法都会进行sql语句拼接,所以在考虑是定义成全局的,还是在各个方法里自行定义

♂站长苏飞() 15:02:45
私有的变量可以完成的,尽量不要使用公有的变量

♂[北京]-Ro4ters() 15:02:52
3.jpg 我的也没clear.这个方法是在哪啊?

♂¤好孩子¤ (392930167) 15:02:53
4.jpg ,这个好像貌似.net 4之后才有的?

♂nidaye1() 15:03:16
是的,我刚刚查到了。

♂[北京]-Ro4ters() 15:03:18
噢.我现在是2.0

♂¤好孩子¤ () 15:03:20
,这个好像貌似.net 4之后才有的

♂nidaye1() 15:03:28
版本4开始支持了

♂nidaye1() 15:03:47
2里面有个remove,也可以的,呵呵。

♂站长苏飞() 15:04:36
没有就直接New一个

♂[北京]-Ro4ters() 15:05:02
嗯.我一般都是随用随写..

♂[山东]火山() 15:05:28
我一般都用string了。

♂站长苏飞() 15:05:30
不建议定义成公有变量

♂nidaye1() 15:06:04
理解了。









发表于 2013-6-25 15:22:36 | 显示全部楼层
拼sql语句的话,实际上我经常用
SqlParameter
平常是用 string += string2;
后台经飞哥提醒改用 StringBuilder了。。。
 楼主| 发表于 2013-6-25 15:40:50 | 显示全部楼层
[重庆]Eagle() 15:06:38
声明的时候,不带修饰符的,都是私有的

[重庆]Eagle() 15:07:32
而“全局变量”和“私有变量”又是2码事

♂[北京]-Ro4ters() 15:08:46
& Chr(13) & Chr(10)  这是不是回车和换行啊?

[重庆]Eagle() 15:08:51
public 是方便其它类调用

♂nidaye1() 15:09:13
StringBuilder sql = new StringBuilder();
        SqlParameter[] param;

        public void insert()
        {
            sql.Remove(0, sql.Length);
            sql.Append("insert.....");
            //insert...
        }

        public void update()
        {
            sql.Remove(0, sql.Length);
            sql.Append("update....");
            //update...
        }

        public void delete()
        {
            sql.Remove(0, sql.Length);
            sql.Append("delete ....");
            //delete
        }


[重庆]Eagle() 15:09:32
阿斯科马表

[重庆]Eagle() 15:09:39
里面有解释

♂nidaye1() 15:09:44
那这样的代码是可行的?而且代码质量还行?

♂站长苏飞() 15:10:54
这样的方法我绝对反对。呵呵

♂¤好孩子¤ () 15:10:55
看着好别扭呀

[重庆]Eagle() 15:11:05
贼别扭

♂nidaye1() 15:11:12
帮忙修改下?

[重庆]Eagle() 15:11:16
代码没有达到重用

♂¤好孩子¤ () 15:11:36
如果只是这么简单不如定义个string sql,然后每个方法sql=""来得直观

[重庆]Eagle() 15:11:59
苏飞,看看你的意见

♂nidaye1(48430935) 15:12:01
不是,我是演示下,sql语句的长度不定的。

♂nidaye1() 15:12:11
可能会有多次append

♂nidaye1() 15:12:21
向各位取取经,嘿嘿。
♀linxin() 15:12:45
sql语句可以+=的吧

[重庆]Eagle() 15:12:54
首先,你这个就不能达到多次append

[重庆]Eagle() 15:13:11
因为你append之前就清空了

♂¤好孩子¤ () 15:13:45
可以的,人家每个方法里sql语句是不共用

♂nidaye1() 15:14:03
版主,每个方法里sql是完全不一样的

[重庆]Eagle() 15:15:19
拼接怎么拼接?

♀linxin() 15:16:19


♀linxin() 15:16:37
这样的 是不知道条件有几个的时候

[重庆]Eagle() 15:17:02
方法显然差参数撒

♂nidaye1() 15:17:25
哦,示例没写好,

♂nidaye1() 15:17:44
上面有个SqlParameter[] param;后来忘记加上去了

[重庆]Eagle() 15:17:56
而且重用率不高

♂站长苏飞() 15:18:56
我只建议这样写,

♂站长苏飞() 15:18:57
  public void insert()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@username where id=@id");
            //insert...
        }
        public void update()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@UserName where id=@id");
            //update...
        }

        public void delete()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@UserName where id=@id");
            //delete
        }


[重庆]Eagle() 15:19:33


[重庆]Eagle() 15:19:57
飞哥,你这不是坑爹吗?

[重庆]Eagle() 15:20:18
用一次创建一个

♂nidaye1() 15:20:23
站长,您这样写法是不建议开始说的全局变量吗?

[重庆]Eagle() 15:20:23
你都不回收一下

♂站长苏飞() 15:20:51
方法里的调用完方法自动回收


♂站长苏飞() 15:21:01
定义在外面的可就不一定了,

♂站长苏飞() 15:21:08
你不建议这种是因为你不理解

[重庆]Eagle() 15:21:24
我知道代码有回收机制

♂小() 15:21:30
想到一个表的数据到excel,但表的数据有几百万条,太大了,用pl/sql每次查询都是溢出,程序自动崩掉。。


[重庆]Eagle() 15:21:31
但你这个....

♂小() 15:21:35
还知道有什么方法?


♂站长苏飞() 15:22:55
如果你没有数亿数据量处理的经验是体会不到这点的。

♂站长苏飞() 15:23:11
这也是为什么几乎所有的代码生成器都是这样写的原因

♂nidaye1() 15:23:22
是的,

♂站长苏飞() 15:23:24
比如流行的动软代码生成器

♂nidaye1() 15:23:30
我刚刚还在看动软的代码

♂小() 15:23:45


♂站长苏飞() 15:23:46
你一看就说不能这样,那我也可以看出来你没有这方面经验和体会

♂nidaye1() 15:24:03
我不太明白原因

♂nidaye1() 15:24:10
所以请教了这个笨问题

♂小() 15:24:10
各位有啥解决的么

♂小() 15:25:00
额?

♂站长苏飞() 15:25:05
写在方法外面,如果你的类对象不起出作用或是不会回收的,但方法就不一样,调用完就回收

♂站长苏飞() 15:25:48
如果你处理的是100多条,或者是几千,几万条数据也就算了,如果是上亿条,你会发现,你的内存和Cpu会增加N多

♂站长苏飞() 15:26:07
两种方法大家拿1个亿数据测试一下很明显的效果
♂nidaye1() 15:26:43
有点小蒙,站长,你推荐的是刚刚发修改后的完整代码那段?

♂站长苏飞() 15:26:53
大家想一下为什么代码生成器都建议我写的那种,而不是写在方法外面,难道他们不懂重复使用吗?这是有原因的。

♂站长苏飞() 15:27:19
这种  public void insert()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@UserName where id=@id");
            //insert...
        }
        public void update()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@UserName where id=@id");
            //update...
        }

        public void delete()
        {
            StringBuilder sql = new StringBuilder();
            sql.Append("update table set UserName=@UserName where id=@id");
            //delete
        }


♂nidaye1() 15:27:36
明白了。

♂站长苏飞() 15:28:05
字符处理如果不是因为技术无法实现建议使用我发的这种

♂¤好孩子¤ () 15:29:27
又学习了,好开心

♂[山东]火山() 15:30:20
这是要用存储过程?

♂站长苏飞() 15:30:51
大家下载个代码生成器或者看看微软的教程就明白了基本上都是这种写法

[重庆]Eagle() 15:31:10
好吧,顶一个

♂nidaye1() 15:31:55
5022.jpg

♂nidaye1() 15:31:59
是这样的,

♂站长苏飞() 15:32:28
这是必须的,任何一个C#高手或者是提供商都不会烦这样的错误

♂站长苏飞() 15:32:52
因为他们应该都体会过后果

♂nidaye1() 15:32:56
那还有个小问题:就是sqlparameter那块

♂nidaye1() 15:33:02
SqlParameter[] parameters = {
new SqlParameter("@ID", SqlDbType.VarChar,100),
new SqlParameter("@CaiDanXiangMing", SqlDbType.VarChar,100),
new SqlParameter("@CaiDanCiXu", SqlDbType.SmallInt,2),
new SqlParameter("@URL", SqlDbType.VarChar,255),
new SqlParameter("@CaiDanShuoMing", SqlDbType.VarChar,100),
new SqlParameter("@ChuFaTiaoJian", SqlDbType.VarChar,2000)};
parameters[0].Value = model.ID;
parameters[1].Value = model.CaiDanXiangMing;
parameters[2].Value = model.CaiDanCiXu;
parameters[3].Value = model.URL;
parameters[4].Value = model.CaiDanShuoMing;
parameters[5].Value = model.ChuFaTiaoJian;


♂nidaye1() 15:33:25
比如像这样的,还有一种是可以用new sqlparameter("@id", 11);

♂nidaye1() 15:33:59
两种都可行,动软是用了上者,

♂[北京]-Ro4ters() 15:34:13
new 后面还要加到参数里面去.

♂[北京]-Ro4ters() 15:34:31
还不如用你发的.还能控制type不容易出错

♂站长苏飞() 15:35:56
QQ图片20130625153809.jpg 这种写法大家注意后面必须是变量

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-16 05:10

© 2014-2021

快速回复 返回顶部 返回列表