[散分]送新人,为什么不推荐这样写,这样写有啥问题?

.Net技术 码拜 9年前 (2015-05-10) 772次浏览 0个评论
 

如下代码

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string sqlstr = "update Patients set P_Name="""
        //    + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + """,ID_Card="""
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + """,Guardian_Name="""
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text.ToString().Trim() + """ where PatientID="""
            + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        GridView1.EditIndex = -1;
        bind();
    }

为什么不推荐这样写,这样写有啥问题?

1分
不安全也不高效啊,而且要是改动的话也不方便改啊,不清楚
1分
1.ToString()没有考虑空值处理
2.注入式攻击
1分
我会用存储过程

1分
很容易被注入,比如第一个 TextBox 的值为 5″”–
你的 P_Name 就全为 5 了。
1分
UP
1分
sdm
1分
应该主要就是安全的问题
1分
ding
1分
可读性比较差吧
1分
安全的问题
1分
建议用存储过程

安全!

1分
回帖是一种美德
1分
这样写的话,有一处改动就会需要改很多地方。
1分
不方便读写..你这样简单的还好说..复杂的判断的 就很难知道程序运行的本身SQL是什么了..
不如写好参数使用SqlParameter 这样SQL语句很清晰.很容易知道程序最终要去执行什么.不必去断点到最后才知道SQL是什么。
1分
jf
1分
这样写有被注入式攻击的危险,需要手动过滤参数,不如写成存储过程来的方便。
1分
建议LZ从头到尾些个最规范的出来学习下哈
1分
应该用SqlParameter。
1分
引用 14 楼 zgke 的回复:

不方便读写..你这样简单的还好说..复杂的判断的 就很难知道程序运行的本身SQL是什么了.. 
不如写好参数使用SqlParameter 这样SQL语句很清晰.很容易知道程序最终要去执行什么.不必去断点到最后才知道SQL是什么。 

up~
我原先也这么写,后来发现有转义字符什么的就很麻烦,另外语句长了看得也很晕乎~
不过我倒是觉得刚学sql的时候这么些不错,能把sql的写法搞清楚

1分
建议用存储过程。

可读性一般。

1分
主要还是安全性,不是可读性问题吧
回贴有感,有大感,点这儿看原贴
4分
按照LZ的意思应该强调的不是安全方面的问题吧!

string是比较特殊的类型,按照string不可变性

string  str="a"+"b"+"c";

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力!

使用StringBuilder或String.Format就不存在这种现象!

string str = String.Format("{0}{1}{2}","a","b","c");

不对请指出,谢谢

1分
不好修改  安全性不高    
1分
一直这么写
1分
跟着前辈走没错
1分
容易被SQL注入,安全性不高,代码长,不容易修改
1分
引用 22 楼 kkun_3yue3 的回复:

回贴有感,有大感,点这儿看原贴

看了..我还的在大脑里模拟按STRING拼字符..会死机.就没敢回

大家不必贴代码修正,
只要讨论即可,
有不妥的,或不科学的,不够严谨的都可以说,
仅指出来即可,分均分,越全面越好
以自勉和提高
1分
SQL能注入式攻击的
1分
引用 29 楼 kkun_3yue3 的回复:

大家不必贴代码修正, 
只要讨论即可, 
有不妥的,或不科学的,不够严谨的都可以说, 
仅指出来即可,分均分,越全面越好 
以自勉和提高

支持个!

只摘了一部分,下面是完整版

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
        }
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        bind();
    }

    //del
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        string sqlstr = "";
        sqlstr = "delete from [Booking] where PatientID=""" + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        sqlstr = "delete from [Grug Allergy] where PatientID=""" + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        sqlstr = "delete from [Patient_History] where PatientID=""" + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        sqlstr = "delete from [Waiting List] where PatientID=""" + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        sqlstr = "delete from [Patients] where PatientID=""" + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        bind();
    }

    //update
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string sqlstr = "update Patients set P_Name="""
        //    + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + """,ID_Card="""
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + """,Guardian_Name="""
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text.ToString().Trim() + """ where PatientID="""
            + GridView1.DataKeys[e.RowIndex].Value.ToString() + """";
        sqlHp.SQLExecute(sqlstr);
        GridView1.EditIndex = -1;
        bind();
    }

    //
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        GridView1.EditIndex = -1;
        bind();
    }
1分
1.ToString()没有考虑空值处理 
2.注入式攻击
1分
呵呵 学习学习  路过
1分
1,不便于维护
2,sql注入
1分
太难读了!
1分
感觉注入攻击严重
1分
引用 21 楼 xfreyes 的回复:

主要还是安全性,不是可读性问题吧

都写成这样了,还不是可读性问题…

1分
jf
1分
我也说下
1,用Cells[X]的处理方法在列排列顺序改变后也得改动程序.
2,UI和数据处理建议分开.
3,直接拼SQL的方式容易被注入攻击,建议用参数.
1分
安全性不高!
1分
没有考虑安全性!
1分
引用 23 楼 goga21cn 的回复:

按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”);

不对请指出,谢谢

23楼正解

1分
引用 2 楼 kamboo 的回复:

1.ToString()没有考虑空值处理 
2.注入式攻击

1分
代码安全性差
1分
jf
1分
引用 2 楼 kamboo 的回复:

1.ToString()没有考虑空值处理 
2.注入式攻击

正解啊!

1分
資源開銷比較大
1分
路过看看~!~
1分
安全型差、效率低。。。。。
1分
1. 可读性差
2. 易被注入攻击
3. 对相关的对象没有做空值及转换失败的判断处理
1分
看看
1分
代码安全性、可读性较差,sql注入!
1分
汗啊。
1分
因为没有用到参数传入
1分
不安全,4楼解释的很对
1分
這樣不易於維護啊。
我覺得還是用多層構架好~!
清晰明了
1分
现在已经很少有人这样写了吧。建议用存储过程。还有。如果换成我要这样写的话。
我肯定用strsql.append(“”);来写,也比较方便。省得用+“”之类的东西了
1分
帮顶。
1分
不安全
也很难扩展

我一般都是写到存储过程中,采用传参的方式

1分
扩展性,安全性,执行效率问题。通过存储过程和操作类实现
1分
这样写的原因 还不是因为看了书…..那些教程上,入门与提高上, 都这么干…
思想就被绑住了.

加入教材上不是那么写的, 我们又何必绕这么大个弯子呢?

写教材的人啊, 拿俺们当悟空了.

1分

那位达人再去我的帖子上看下, 解决个问题? 在此谢过了!

1分
han  a 
1分
jf
1分
学习接分
1分
用3层来开发在项目复杂的情况下更易于维护
1分
总觉得不妥….学习…
1分
我是新人,新到看不懂lz的程序……
1分
引用 61 楼 wuyq11 的回复:

扩展性,安全性,执行效率问题。通过存储过程和操作类实现

支持!如果语句太长,很不利于维护和查错了;

1分
可读性很差,并且要改起来太麻烦,时间久了估计自己看着都会晕乎的……
1分
呵呵 学习学习
1分
不知道!
这种情况应该是在要求多的时候才有需要区别。
1分
高手散分,新手接!激励自己~
1分
这是啥呢
1分
可读性差
1分
如果碰到个垃圾老板,就这样写是正解了

如果老板还不错,这样写,对不起老板,更对不起下一个维护代码的同行

1分
dddddddddd
1分
不安全不灵活
1分
UP
1分
太难读了.
   给你 几个个建议,.
   

   一个是写成这样的方式…
    

     delete from [Booking] where PatientID=@PatientID;
    
    

   然后用SqlParamter[] params 数组 来传..
    这样的好处是 易维护..
    做 开发..  维护的大部分时间不应该浪费在读代码上….
    而是浪费在 如何找出来哪里会发生问题的地方的..
   二是用存储过程.
    高效率 , 也是用SqlParamter数组 跟上面差不多少,效率提高很多
    三就是用StringBuilder写模板.
    效率高..易读.我比较喜欢这个.跟存储过程效率差不多少.

1分
帮定 & 接分
1分
谁教我哈sql注入及注入后是什么情况
1分
这样写最大的问题是 如果有特殊符号比如说是 ’ 单引号的话 就会出现错误。 所以不推荐这样写 最好是用参数代替!
1分
引用 73 楼 shungang2323 的回复:

呵呵 学习学习

dddddddd

1分
up
1分
用存储过程,安全,这样写很乱
1分
很不安全!回帖是种美德!
1分
学习。。
1分
1 DA BL UI 都混在一起,不方便代码维护,如果没有什么业务逻辑,那么至少也要将DA分离开。

2 这种写法看似简单,但一旦多有几个地方是同样功能,代码的总数反而会比分层的代码要多。

3 浪费性能,多个string拼接一般使用StringBuilder

4 不安全,SQL有可能被注入

1分
代码维护起来麻烦啊.
可读性也不好.
1分
群策群力
1分
不推荐这样写很大成分的原因是不安全sql注入
1分
效率问题
格式问题
可读性差  
难以理解
1分
up
1分
没有看明白!

请指点

1分
感觉像是高空作业….很危险.
1分
非常不安全,很容易被注入!
1分
如果 GridView1.DataKeys[e.RowIndex].Value.ToString() 中的值是:   “” or 1-1  —
这样的字符串, 数据库中的岂不是要被全改了.
1分
发现很多人还是喜欢用GridView,为什么不用DataGridView,貌似更强大。
1分
学习,很多人说用存储过程
1分
存储过程是个好东西,LZ要注意安全,不然死的很惨
1分
学习了!
1分
赤果果的接分[img=http://www.baidu.com][/img]
1分
可读性不高 ;不好修改
1分
学习了
1分
少了try语句?
1分
随便看看
1分
x學習為主
1分
 接住了,能学会  不
1分
看着别扭,可读性比较差,安全性也不好。

JF.

1分
一个是sql注入
另一个是单引号
((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim()
如果内容是“A””B”
sql语句就出错了
1分
up
1分
如上所说,应该是安全性问题,还有就是,字符串拼接操作多的话,应该用StringBuilder,性能好些。
1分
引用 32 楼 kkun_3yue3 的回复:

只摘了一部分,下面是完整版 

C# codeprotected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bind();
        }
    }
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        bind();
    }

    //del
    protected void GridView1_RowDeleting(object send…

拿LZ的下面这句语句来说:
       sqlstr = “delete from [Booking] where PatientID=””” + GridView1.DataKeys[e.RowIndex].Value.ToString() + “”””;
        sqlHp.SQLExecute(sqlstr);
如果GridView1.DataKeys[e.RowIndex].Value.ToString() 的值为:(1″” or “”a””=””a”” )的话,这句语句就变成了
delete from [Booking] where PatientID=””1″” or “”a””=””a””
这样的情况下,Booking表格中的内容将会被全部删除,所以这种写法非常不安全
很容易就被注入式攻击。

1分
其实那样写很方便不过以后就不方便了
1分
弱弱的问一句:啥叫注入式攻击呀?好像蛮多人都这么说
1分
学习
1分
安全性问题。
1分
安全问题
我是菜鳥,只會一點javascript!
1分
拿分走人
1分
接分
1分
一不安全,容易被注入式攻击
二效率低,处理速度慢
1分
可读性太差了。。看的累
1分
我只能引用楼主在原帖的话:
叹为观止
1分
sqlstr = “delete from [Booking] where PatientID=””” + GridView1.DataKeys[e.RowIndex].Value.ToString() + “”””;

如果别人在GridView1.DataKeys[e.RowIndex]位置输入的是 1 or true
想想是什么后果啊

1分
.
1分
看不懂啊,俺的水平不够
1分
考虑不够完善,有Bug,而且效率不高,安全性也不好!
1分
学习
1分
看不懂,完全不懂,所以来学习,顺便接分
1分
学习了,我是新手,哪位大哥能我举一个嘛例!
怎么改,好了!
1分
接分啦
1分
up
1分
新手~~   注入式攻击么意思?
         老师教我们用存储过程来做
         然后就像楼上说的 那个tostring()考虑空值的问题
         
1分
我都是这么写,呵呵。有人给提出改进的办法么?
1分
容易被SQL注入,安全性不高,代码长,不容易修改
1分
这种写法就是没有理解面向对象编程思想,再主要就是这样会受到注入式攻击
1分
jf
1分
GridView1_RowUpdating  有点浪费SQL链接资源
1分
我觉得首先是可读性较差,另外容易出错.可能还有其他的,还希望高手能指点,新手,谢谢!
1分
新手~~~~路过
1.没有try一旦出错很容易引起程序崩溃
2.出错后不容易一下找到错误
3.不符合面向对象的思想
1分
接分而来
1分
会被注入攻击,你在文本框输入个英文的‘试试

维护 不方便,修改sql语句时很容易搞乱

1分
人齐,可以接分。
1分
学习,一直是这么写的 —_—!!
1分
安全性这一方面的问题,足以将这段代码推翻。
如果是我,我会这样写。
编写一个类,名字叫DataAccess.cs
public void updateMessage(int PatientID,string P_Name,string Guardian_Name)
{
SqlConnection conn=new SqlConnection(“连接数据库”);
conn.open();
SqlCommand sqlCmd=conn.CreateCommand();
string sql=”update 表名 set 

PatientID=@PatientID,P_name=@P_Name,Gut_name=@Guardian_Name where 

PatientID=@PatientID”:
  sqlCmd.Paramenters.Add(“@PatientID”,SqlDbType.Int).value=PatientID;
sqlCmd.Paramenters.Add(“@P_Name”,SqlDbType.VarChar).value=P_Name;
sqlCmd.Paramenters.Add

(“@Guardian_Name”,SqlDbType.VarChar).value=Guardian_Name;
sqlCmd.CommandText=sql;
        sqlCmd.ExecuteNonQuery();
conn.close();
}

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs 

e)
{
int ID = int.Parse(Convert.ToString(GridView1.DataKeys

[e.RowIndex].Value));
string p_name = ((TextBox)GridView1.Rows[e.RowIndex].Cells

[3].Controls[0]).Text;
        string guardian_name = ((TextBox)GridView1.Rows[e.RowIndex].Cells

[4].Controls[0]).Text;
DataAccess da=new DataAccess();
da.updateMessage(ID,p_name,guardian_name);
        GridView1.EditIndex = -1;
        bind();
}

由于网速问题,这段代码写了两次,不对的地方希望大家指正。
不过,舍友说了,现在这些代码不值钱,将来是我们生活的来源啊,呵呵,是啊!

1分
建议用循环写.
1分
学习
1分
这个代码看晕维护的人
1分
学习。。。
1分
引用 43 楼 FenixeVon 的回复:

引用 23 楼 goga21cn 的回复:
按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”; 

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”); 

不对请指出,谢谢 

同意

1分
很多人提到存储过程,能不能贴段代码出来看看啊
1分
SQl连接数据库的时候会有代码舆论的,最好连接数据库的时候写另外一个类,叫DBHelper把那些数据库的代码都写在那里面,到时候直接调用就可以了啊!
1分

我是新人我接分!

快乐接分!

1分
ding
1分
UP
1分
看到这种代码立刻就能想到SQL注入,千万不要忽视了这个最原始的攻击方法。
另外,直接把SQL写在界面代码中,会给将来的维护带来很多不便,应该考虑分层开发,况且现在不都流行这个嘛。
还有几个细节的问题处理得不够好,e.RowIndex和GridView1.Rows[…]访问了多次,最好把它们放在局部变量里,还有就是TextBox.Text属性就来就是String类型,再ToString()一次不是画蛇添足嘛。虽然这几个细节问题对一般程序的效率不会有太大的影响,但是对于程序员来说应该培养一种良好的编程风格或者说习惯,无论是对程序还是对自己都可能会有潜在的影响。
1分
sql效率和安全问题
1分
学习来了
1分
我是菜鸟 赚积分来的
1分
testsdafsafasdfsdf速度是
1分
路過,,,學習
1分
学习 
领分!
1分
学习
领分!
1分
顶一下

楼上说了

sql注入
tostring 的时候如果value为null的话,会有异常抛出
还有索引girdview的时候 3 4 有可能会越界,都要做判断才为好的

1分
这个语句除了上面提到的一些缺点之外,还有一个非常重要的缺陷是数据库执行效率太低,每一条这样的语句数据库都需要重新分析,制订执行计划,不能重复使用。
1分
学习~~
1分
引用楼主 kkun_3yue3 的帖子:

如下代码 

C# codeprotected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string sqlstr = “update Patients set P_Name=”””
        //    + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + “””,ID_Card=”””
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + “””,Guardian_Name=””…

直接在名字这一列输入
xxx””;EXECUTE sp_msforeachtable “”delete from ?””–
点一下更新
你就哭吧。。。

1分
学习!
1分
“” or 1=””1

这样注入方便点~~` 

1分
UP 俺是新人
1分
谢谢 

JF

1分
还没开始学c#
1分
是啊  还是用存储过程好
1分
不错  来学习下
1分
安全且不高效
1分
全性不高。。
容易被攻击
1分
推荐帖?
1分
主要是可以被注入问题吧
1分
可读性不强.
可维护性差
没有做安全过虑
没有进行DB的NULL转换
1分
楼上很多朋友说了,SQL注入式一点,1″”or 1=1″” 这个表达式可以破环你的SQL语句,这是一个最常见的表达式,还有其他的很多
还有一个就是表示层里面不要写SQL语句,这样维护性和可扩展性都很差,一发动全身..
SQL语句写到数据访问层中去
1分
引用 186 楼 MOmo400 的回复:

可读性不强. 
可维护性差 
没有做安全过虑 
没有进行DB的NULL转换 

加一点:思考方式还是以前的过程式编程.

1分
维护性不高
1分
ding,dui
1分
1.容易注入攻击
2.可读性差
3.每一个拼接会在内存中产生一个对像,这样费内存效率也底下
4.不便于维护可读性差,刚开始写时可以知道写的是什么,过个一半年要改可就麻烦了.
1分
建议放在事物里,保证数据完整性。
1分
引用 23 楼 goga21cn 的回复:

按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”);

不对请指出,谢谢

对啊,我想lz要说的是这个问题吧。

1分
引用 30 楼 xuyie101 的回复:

SQL能注入式攻击的

严重同意

1分
路过,接分
同时mark,学习学习
1分
DataGridView使用是最好用列的名字吧,要不改一列就会改很多
1分
引用 23 楼 goga21cn 的回复:

按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”)

不对请指出,谢谢

谢谢 学习了

1分
安全问题,这个我用测试软件测试过的
一测一个准~~~
存在injection 的风险
1分
LZ的问题主要是安全性和可读性,安全性会造成数据库、服务器被控制,
可读性如果会造成其他同事理解错误、或者书写错误,也将造成数据错误

引用 23 楼 goga21cn 的回复:

按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”);

不对请指出,谢谢

很明确地告诉你…

str=”a”+”b”+”c”;

等价于 str=”abc”;

只有一个常量,即 “abc”;

我想你是把a,b,c,当变量
那么,不管是 str=a+b+c;
String.Format(“{0}{1}{2}”,a,b,c);
都一样地是传递a,b,c的3个副本,
但是对于少数的字符串串联,其成本远远低于调用String.Format
请看 String.Format 实现代码:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
    builder.AppendFormat(provider, format, args);
    return builder.ToString();
}

builder.AppendFormat 代码:

public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)
{
    int num3;
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    char[] chArray = format.ToCharArray(0, format.Length);
    int index = 0;
    int length = chArray.Length;
    char ch = ""\0"";
    ICustomFormatter formatter = null;
    if (provider != null)
    {
        formatter = (ICustomFormatter) provider.GetFormat(typeof(ICustomFormatter));
    }
Label_004E:
    num3 = index;
    int num4 = index;
    while (index < length)
    {
        ch = chArray[index];
        index++;
        if (ch == ""}"")
        {
            if ((index < length) && (chArray[index] == ""}""))
            {
                index++;
            }
            else
            {
                FormatError();
            }
        }
        if (ch == ""{"")
        {
            if ((index < length) && (chArray[index] == ""{""))
            {
                index++;
            }
            else
            {
                index--;
                break;
            }
        }
        chArray[num4++] = ch;
    }
    if (num4 > num3)
    {
        this.Append(chArray, num3, num4 - num3);
    }
    if (index == length)
    {
        return this;
    }
    index++;
    if (((index == length) || ((ch = chArray[index]) < ""0"")) || (ch > ""9""))
    {
        FormatError();
    }
    int num5 = 0;
    do
    {
        num5 = ((num5 * 10) + ch) - 0x30;
        index++;
        if (index == length)
        {
            FormatError();
        }
        ch = chArray[index];
    }
    while (((ch >= ""0"") && (ch <= ""9"")) && (num5 < 0xf4240));
    if (num5 >= args.Length)
    {
        throw new FormatException(Environment.GetResourceString("Format_IndexOutOfRange"));
    }
    while ((index < length) && ((ch = chArray[index]) == "" ""))
    {
        index++;
    }
    bool flag = false;
    int num6 = 0;
    if (ch == "","")
    {
        index++;
        while ((index < length) && (chArray[index] == "" ""))
        {
            index++;
        }
        if (index == length)
        {
            FormatError();
        }
        ch = chArray[index];
        if (ch == ""-"")
        {
            flag = true;
            index++;
            if (index == length)
            {
                FormatError();
            }
            ch = chArray[index];
        }
        if ((ch < ""0"") || (ch > ""9""))
        {
            FormatError();
        }
        do
        {
            num6 = ((num6 * 10) + ch) - 0x30;
            index++;
            if (index == length)
            {
                FormatError();
            }
            ch = chArray[index];
        }
        while (((ch >= ""0"") && (ch <= ""9"")) && (num6 < 0xf4240));
    }
    while ((index < length) && ((ch = chArray[index]) == "" ""))
    {
        index++;
    }
    object arg = args[num5];
    string str = null;
    if (ch == "":"")
    {
        index++;
        num3 = index;
        num4 = index;
        while (true)
        {
            if (index == length)
            {
                FormatError();
            }
            ch = chArray[index];
            index++;
            switch (ch)
            {
                case ""{"":
                    if ((index < length) && (chArray[index] == ""{""))
                    {
                        index++;
                    }
                    else
                    {
                        FormatError();
                    }
                    break;

                case ""}"":
                    if ((index < length) && (chArray[index] == ""}""))
                    {
                        index++;
                    }
                    else
                    {
                        index--;
                        if (num4 > num3)
                        {
                            str = new string(chArray, num3, num4 - num3);
                        }
                        goto Label_0253;
                    }
                    break;
            }
            chArray[num4++] = ch;
        }
    }
Label_0253:
    if (ch != ""}"")
    {
        FormatError();
    }
    index++;
    string str2 = null;
    if (formatter != null)
    {
        str2 = formatter.Format(str, arg, provider);
    }
    if (str2 == null)
    {
        if (arg is IFormattable)
        {
            str2 = ((IFormattable) arg).ToString(str, provider);
        }
        else if (arg != null)
        {
            str2 = arg.ToString();
        }
    }
    if (str2 == null)
    {
        str2 = string.Empty;
    }
    int repeatCount = num6 - str2.Length;
    if (!flag && (repeatCount > 0))
    {
        this.Append("" "", repeatCount);
    }
    this.Append(str2);
    if (flag && (repeatCount > 0))
    {
        this.Append("" "", repeatCount);
    }
    goto Label_004E;
}

 

 

 

1分
最后200楼~ 
1分
1:维护,修改不方便,扩展不方便;解决办法,用三层架构(可以参考petshop4);
2:安全性能差;解决办法,改用存储过程,写一个专门的过滤类;
3:可读性差:
4:系统性能会下降,(在过多的请求下)
1分
接分
学习啊,我是新人。
刚开始学C#,来学习了
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string sqlstr = “update Patients set P_Name=”””
        //    + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + “””,ID_Card=”””
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + “””,Guardian_Name=”””
            + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[4].Controls[0])).Text.ToString().Trim() + “”” where PatientID=”””
            + GridView1.DataKeys[e.RowIndex].Value.ToString() + “”””;
        sqlHp.SQLExecute(sqlstr);
        GridView1.EditIndex = -1;
        bind();
    }

俺也是新手,写的时候也喜欢这样 想到什么就写什么 没什么区考虑可读性安全的等 但事后在来看 确实头晕

受教了  接分

没有考虑安全性
1.不容易阅读,不管是对自己还是对别人,过一段时间当你再回过头来看的时候,你可能要花很长时间才能看明白,对别人,有可能看不懂,就算看懂也需要花很长时间,如果很多都是这样写的花,可能以后人家可能就根本不给你维护,直接重写的,这样对谁都是不负责任的
2.引起注入
新人需要扶持,jf中
学习中
up
安全问题,因为GridView更新事件中如果按照你那种写法,会被攻击的
1. 不安全
2 效率低
3 不易修改维护
安全性不高,容易被注入式攻击
维护不易
执行效率低
over
up
容易被注入
不方便维护
代码不清晰
修改太麻烦…其他问题不大
果然还是安全和效率的问题.
长见识了
大虾??
中华人民共和国有关法律中华人民共和国有关法律
这种方法不行吗?我这几天学VC#2005数据库实例导航上面就是这个方法实现用户注册的,原来还有那么多问题呀!领教了!
中华人民共和国有关法律
abcuu每天回帖asd
很多年以前,我是一个穿着全是窟窿的军大衣留着鸡冠头的朋克。每当我在北京的胡同和街道流窜的时候,见到穿着不合时宜的劣质西装拿着破烂公文包小心拘谨的在街上讨生活的职业人士,我总会感到一种狭隘的优越感,嘴角露出鄙夷的微笑,然后目送着这些可怜的人儿消失在街角,发自内心的送上牛逼 二字为他们送行。那时我从来不曾想到自己也会有这么四处求职的一天,而且还不如人家是求职未遂。请原谅我词语匮乏,一时找不到该用什么名称形容我现在这种连牛逼 都当不成的状态。
 
  就在前不久我穿的人模狗样去北京人艺求职,试图谋取一个戏剧史料研究的职位。一起求职的姑娘居多,经过我一盘道儿,原来个个根正苗红,本科都屈指可数,一水中戏传媒戏剧硕士,还星星点点点缀着几个博士和海归,搞得我这么一个南艺少年颇为尴尬。面试笔试进行了三轮,怀着对戏剧艺术的无比崇敬以及对自身丢人现眼的专业水平的自知之明,我开始完全就没挂着什么成功的打算,只是希望应聘不要变成自取其辱,丢自己人还好,要是把学校也丢了连带上什么老师同学校门口卖毛盘的阿姨乃至数百万与我无关的南京大学生,那我的罪过可就严重了。我一直觉得要是做不到总览群书旁征博引,至少也要实事求是。于是丢掉包袱大胆应试,不想却阴差阳错通过层层初选,最后接到电话让我去人艺和领导谈话,一打听原本一百多人只剩下了5个人。于是我顿感天上掉下馅饼,一个人民艺术家即将横空出世。我以为所谓谈话估摸就是表决心谈待遇,下一步就是报到转关系。

结果出乎意料,谈话原来还是考试,而且高层亲自出马,和北京人艺dang委书记座谈。  提到party委书记,我顿时四脖子汗流。我从小到大生命力顽强,但是在两个事情上却屡战屡败,简直就是阿格留斯的脚踵。其中一个是英语,无论如何学习,每逢英语考试都一塌糊涂,导致了我在教育事业中充满坎坷,能读到大学实属不易。而第二个就是我们伟大的dang,并非是对dang的不敬,只是我只要和dang有一点关系,最后总要以悲剧结尾。别看我曾是个无go-vern-ment主义男孩,但是咱祖上却是正经八百成分优良,远说太祖父抗战时期就是敌后武攻队队长,而外祖父母则算是革命元老,前几天清明我跟家人去给先人祭扫,发现在八宝山老干部

室里至今外祖父母的骨灰还覆盖着圣洁的dang旗。Dang跟我更为直接联系的则是我妈,我妈从我记事起就是什么宣传部长组织干部。要是别人家孩子兴许还算是个荣耀,可我妈的身份却总要和我在学校拙劣的表现屡屡捆绑在一起出现在家长会上,成为无数家庭的笑柄。这种对dang的恐惧导致我在人艺最后的谈话中悲剧重演,人民艺术家事业中道崩卒。事后来我妈还真托人询问失败原因,我还以为是因为学历不够或者知识欠缺,这两点确实是我职业简历的弱项,结果人艺的传出来的意见却出乎意料,人家的结论是因为我的想法和反映太过强大,估计创作和创业更适合我的发展,即便录取说不定两年内就会跳槽。而人艺历史悠久,人民艺术家事业任重道远,需要年轻人用尽他们的一生来奋斗。 
  这一事件并非就把我推入沮丧之中,而恰恰是我尴尬的求职生活的开始。虽然我现在已经不是当年那个活蹦乱跳满口牛逼 的朋克不停的咒骂生活,但是要我说一下最近对生活的感受。基本上也全是消极和烦躁。于是本着叙旧的原因,我从事起了酗酒的生活。我这些年变化是在天翻地覆,一些老哥们们已经到了在碌碌人群中对我视而不见的程度。尽管大伙还是压抑着惊奇出于礼节把我如今知书达理文静英俊夸赞一番,但是只要几杯酒下肚,他们还是立刻表达出对于原来那个整日顶着鸡冠头穿着军大衣少年的无比怀念。例如前几天喝完酒我在大家上找厕所,他们惊诧地说我原来都是掏出来就尿现在怎么变得这么装模作样。尿完接茬,酒过三巡,真言既出,简而言之就是你他妈现在怎么这么功利世俗大狗逼。说者无心听者有意,他们说的我面红耳赤,好不尴尬。类似的场景在这段时间不止一次的闪现过,最近我撤回北京,忙着和一些逐渐梳理的朋友回复联系。认识他们最短也要五六年的时间,长的则要追述到遥远的上个世纪。正所谓三岁看大七岁看老,除我以外的朋友们大都有序可循,无非是姑娘们隆起的胸部和哥们们堆积起来的肚子。我从外貌到心灵的巨大变化但凡见到的当时就震惊了。酒桌话题基本都是追述过去开始,然后使用展望未来为终。展望未来,唉呦,小树啊~谈起未来我的心儿就碎了。为了难免我现在心碎而死,咱还是先追述过去。   
  记得早好几年还在高中的时候,我可是一个朋克,本着自暴自弃醉生梦死的生活态度,整天迟到早退打架滋事在学校晃荡,不过父母都是知识分子脑容量大,给咱生得一个还算机灵的头脑,因此在学校即便不是排前面的手里的那根茅草,至少也是手脖子上的那块稀泥。除了要命的英语,似乎各学科都拿过什么狗屁年级第一。记得年级组长每次考试结束总喜欢开个总结大会教育大多数同学。”不好好学习你们找不到工作,找不到工作你们就没有未来。”相对应的,则是考上大学你就咋地咋地皮piangpiang的牛逼了啊哈。不对,一定有什么地方不对,我上了大学,学的还说的过去,可是小时候老师们许诺的那些美好全然没了踪影,自己过去的理想和愿望也早就变了模样,令人沮丧的变化早已发生,可是我却找不到蛛丝马迹的开始的头绪。这就跟放风筝似的,放出去的时候是一福娃妮妮,收回来的时候转手变成了草尼玛,可是线头就是一根。却不知道问题出在哪。 
  想当年咱进了大学,一开始我亢奋激动,热衷于学生活动以及校园生活,不明不白参与了一票校园活动,阴差阳错还混成了个什么学生干部,校园小忙人,至今在我抽屉的最底层还留着学生会的表彰和聘书,上面沾满了鼻涕孜然以及诸如此类岁月的痕迹。如果我但凡再上劲一些,相比现在也版定能成了高层,可是我十分厌烦惧怕和学校的party委书记发生关系,赶紧跳离学生活动,转而磨练起了专业的文学创作学习中,作为一个学编剧的孩子,大师们据说也全是从枪手做起。本来南京影视公司稀少价钱也低,但是咱吃得苦中苦方为人上人,打车比稿酬还高,也跑了一家又一家的公司写了不少动画片和情景剧。 
  抛掉剧本剧本那段时间一直有一个美好的想法就是借着拍片泡妞,于是咱也动力十足的拍了一个又一个DV,片子尽管放出来丢人现眼,但是光看一张张海报也是颇有成就。好歹学的是戏剧影视文学,咱还东混西混写出了一个四幕话剧。虽然女演员被我们导演捷足先登,但是咱拉钱排练准备公演也忙得不亦乐乎。无奈天有不测风云浪花淘尽英雄,我那充满了先锋和尖锐现实的剧目被人家学校party委书记淡定的和谐。这些年但凡想起因为英语和政治而引发的事情要是放到希腊戏剧,简直是来自奥林皮斯山的诅咒。 
  说起诅咒每人都要经历,只是内容不尽相同,我家老爷子年轻时想成为一个海明威,杰克伦敦这类的作家,想必年轻时也度过了波澜起伏自作自受的文艺生涯。据我妈说为了成为一个伟大作家的崇高使命感,咱爸放弃了大好的山西倒煤海南倒楼的大好时机,也放弃了中央参政以及调任地方成为节度使的美好仕途,一门心思放在了文学事业上,但是结果虽然成为了一个作家,却还是没有成为一个伟大作家。 
  为了悲剧不再第二代身上重演,我爸从我十岁起就不停地在我面前诋毁文学,妄图把我打造成一个工程师或者小资本家,但是诅咒就是诅咒,一切努力却没有阻止他的儿子我在十年后的某个夏天在南京也想要成为一个著名作家。那时我已不住在学校,住在南京郊区的一座山里,房子坐落在半山腰,房东有一个种植者很多乔木的庭院,以及两条和我一样无所事事的大狗。那段时间第一次感受到南国气候连绵的阴郁,一个月见不到几天阳光,配合着天气我罹患抑郁,整天坐在阁楼上面对着深郁的大山,沉着脸看一些怨天尤人的小说和电影,因为出入不便一次买上很多的速食和廉价红酒,晚上杜康解忧伴着虫鸣写着不知道何时能完成的鸿篇巨著。当时我有了咱爸的前车之鉴深知文艺烁金,创作销骨,对自己未来做出了无数的悲惨推测,形象的说法比如取不着媳妇草不着逼,生不起儿子买不起房。但是不管怎么说,万般悲惨的境地里,我绝对想不到自己在几年后会找不到工作。 
  文学创作如同跑步,作为自娱自乐强身健体仅需要热情与坚持,但是倘若想要成为刘翔,需要的恐怕就是天资。我倒没有桂冠的梦想,只要能够跑在大多数人前面就算是知足。按说知足常乐,加上哥们天资中等偏上,加以时日还是有希望成为一个三流作家。不过青春的热情转移得到很迅速。一些热闹的事业显然比文学更具有现实主义泡妞功效,咱开始计划是文学事业娱乐三不误,但是逐渐声色犬马的娱乐和社会生活还是挤掉了伟大的文学,刨去挥霍的光阴,总计跟了两个剧组,自己办了一个还算成功的摇滚演出,策划了一写可有可无的文化活动,甚至还不明不白骑车去了一趟越南。再往后,再往后就是现在这操行了。咦,一直到这,虽然自作自受来回折腾,但是基本上还是按照最初的设想发展的,较之当时的情景,虽然小错不断,但大方向始终还是本着自强不息厚德载物的路数去的。为什么会变成今天的局面?我实在想不清楚。 
  去年底的时候身边的哥们们纷纷开始考研工作,一些过来人也劝我也为未来做个打算,那时候我也琢磨起未来要干点什么,其实我不是一直琢磨么,我要当个牛逼的艺术人士。但是首先牛逼这件事情不那么容易,艺术这件事情难以把握,那么还是捡个最容易的吧,好歹成一个正经八百的人士。作为一个人士,因为我觉得高学历体面而且安逸,于是以为自身智商超群考了一把研。话说去年年底经济危机初现风采,哥们们劝我不如趁着早点搞个工作,我当时也琢磨了一下,要来了身边几人的简历学着参考一把,可自己的简历还没做完我倒立刻坦然了,比起别人玩命作假撒谎的简历,我倒要把一些可有可无的东西删除来显得节俭。作为一个还算深入社会的小青年,大学生就业难的现实也不是一年两年才知道,但我一直以为找不着工作的应该是没有任何实践经验的书呆子,应该是四年在宿舍网吧和炮房混日子的花花公子,应该是呆头呆脑县城以下出来的死板青年,不管怎么看,我一个写过剧本,跟过剧组,混过电视台,自己拍片写小说都有实物可循,还是学生干部还办演出做活动有社会经验的综合型人才不至于找不着工作吧,而且咱哥们连容都整了头发也正经了眼镜也换了,按说没有什么问题了吧。没错,我学校是不是最一流的,但是南艺好歹也是中国专业最周全的综合性艺术大学,没错咱英语四级考试时候忙着跟人谈剧本拍片忘了考试,但是我自己在国外光靠喷英语玩了十多天也全须全吲凯旋而归,一般的英语交谈说明书什么的也可以应付,再不济,还他妈有金山词霸呢。 
  嘴上没毛办事不牢,考研之前我一激动刮了胡子伤了真气,英语的诅咒再次显灵,这回牛逼 了,等到真开始着手找工作的时候才发现,一切和自己想的完全是两码子事情。 
  首先说说编剧剧组这类事情,主要靠的是人脉,而人脉其实也就是几个月的事情,而咱荒废南京4年,北京这边行情人际完全没有什么接触,再者说整个行业世风日下,编剧生涯状况堪忧。而且我始终认为,我也许能成为一个优秀编剧,但是对生活的感悟至少也是十年八年以后的事情,目前还得给眼吧前找个安身立命的地方。 
  话说跟专业有关的人艺这种地方,需要的是一个老老实实干一辈子的人,我这么一个锋芒人员人家觉得我不踏实。一般满街都是的草台广告影视公司吧,从人用人单位角度其实人家需要的只是一个八流民办大学的打字员或者小跑堂,感觉小庙装不下我这么一个大肚佛,光是开口的香油钱就得是人家野和尚的好几倍,虽然我其实就是想讨个温饱,但是换位思考也觉得是这么个道理。而且从我这来说,片是拍了不少,文艺活动也策划了好几个,但是虽然是山寨活动咱干的也都是纵观全局的高层,什么后期啊剪辑啊这种技术活都是指挥别人做的,要是真让我自己亲历亲为,其实也是银样镴枪头。 
  再说牛逼的大公司大机构大学教员外企白领,一来英语八级资深工作经验海外留学硕士学历这种硬性条框就掐吧住了咱的咽喉,二来单位越牛逼起步就越是基层,比如拉赞助,跑业务。虽然学校里面咱是干的不错,但那是活动不是商业活动还有一南京著名艺术院校在后面撑腰呢,而且虽说编剧是脑子不错条理清晰,可要是真拿咱学编剧的语言组织能力头做业务,绝对谁都比不过卖楼的和做安利的。简而言之就是虽然咱有一些在同类毕业生里面难得的优势,可是放到社会的大海里面却要么不值一提,要么无穷施展,再说本来就是资历尚欠,姜还是老得辣,咱的本事还差得远呢。 唉,那我他妈现在该干什么,我现在彻底五迷三道了。 
  说起拍片和写作,虽然我的心在这,但是一来冷暖自知,咱最近还没成熟到能出好作品的本事,而来本身这就不是一个指着吃饭的事情。 
  说到高学历这个事业,目前成绩倒是可以调剂到石河子大学,甚至还可以享受到奖学金以及安家费。但是到这么一所边疆著名的以农业畜牧学妇产科为主打,受教育的机会的应该是留给西北部的维族大哥,艺术己经被我亵渎了,我还是放种牛们一条生路。而继续考研虽然也还可以,但是在浩瀚的人生里面终归是一条缓兵之计,考研者事情耽误工夫伤身子,再加上今年英语算上分数线的下降和自主提档的分数其实英语就差了一分,再学一年着实扯淡。最重要的是,就跟原来万般设想也没想到我能沦落到待业一样,如今地球又不为咱旋转,且不说英语是咱从小的诅咒不一定能解咒,万一面试时候又遇见一party委书记双管齐下那不还是虾米。我一直以为,在众多比较容易的事情中,拖延时间是最牛逼 的一种方法,而且考虑到人艺面试时候一大堆硕士博士姐姐照样跟咱抢一个饭碗还不地咱的表现,我实在对设想自己作为一个27岁的没有什么当鸭吃软饭姿色的艺术学研究生生存状况感到恐惧。出国么我压根就不考虑,作为一个胡同串子知识分子在自己而个地盘都混不下去了就别去糟蹋毛子了吧。 
  而工作吧,也是一片尴尬,但凡我想去的行业都去不了,目前我自己找的愿意让我去上班的待遇不算却全无任何专业性可言,卖楼,超市自行车店长,以及升到金钻石级别遥遥无期的传销员工。而咱妈虽然是个party委小书记,但是认识的朋友都是早些年国有企业的江湖人士,介绍来的工作大都是围绕着红星二锅头,北大荒的土豆以及北京锅炉二厂的阀门。这些倒并非因为不体面或者不安稳而不能做,只是实在想不到与这几年看的库斯图里卡吉姆贾姆许卡尔维诺有什么联系。 
  唉。最近我算是明白了什么叫做人穷志短,马瘦毛长,何以解忧,唯有杜康。回想起我那不算漫长但是却着实波澜起伏的人生,我曾自鸣得意的痛斥生活,我曾怨天尤人的推卸环境,我对失败的人无情嘲讽,我也曾羡慕和嫉妒他人。我曾没心没肺伤害过亲朋挚爱,也曾不分是非的错看了势利小人。我曾悲观失望,我曾满怀欣喜。我曾不畏惧一切,我也曾体会坠落。我怀念造纸厂幼儿园的豆沙包,怀念宣武体育场的小学足球赛,怀念陶然亭的冬季长跑,怀念琉璃厂的高中哥们,我怀念南京图书馆里心动的姑娘,怀念下关一块钱三个的肉包子,怀念古堡里踩响的失真,怀念南京那一圈乱七八糟的人。尽管我用尽了浑身解数想要超越生活,但是当长大成人春去冬来的时候,咱还是得坦然面对。 
  工作还是得找,日子还是得过,字还是得写,钱还是得挣,姑娘还是得勾搭,哥们义气还是不能扔了。最重要的是不要忘却最初的理想–做一个成功的艺术人士,尽管我知道,从小到大的理想大都难以实现。但是理想么,只对难以实现的才有意义。 

ps:如果本文无意中冒犯到了谁请在心中默念楼主牛逼 以换来内心平和 
  如果有人看完后觉得文笔履历尚够赏碗饭吃本人不甚感激。 

==该帖由 猛吃雪糕 分类为 精彩帖 
 
 

其实 我刚开始学计算机语言看不懂 但是 觉得LZ写的不是很认真,做 的不简洁,不 工整
真是的,积分我不都了
回帖是一种美德!每天回帖即可获得 10 分可用分
安全,和可读性,可维护性,以及代码重用性也不高
不安全也不高效啊,而且要是改动的话也不方便改啊,不清楚
学习学习
学习一下,
恩很好学习了啊 
up
引用 199 楼 r_swordsman 的回复:

LZ的问题主要是安全性和可读性,安全性会造成数据库、服务器被控制, 
可读性如果会造成其他同事理解错误、或者书写错误,也将造成数据错误 

引用 23 楼 goga21cn 的回复:
按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”; 

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用S…

感谢的紧!
看来得复习复习基础知识了!

来学习了!!1
路过,学习啦!我一个新手看不出来。。。呵呵
感觉可读性不高啊。。。。。。。。。。。
不安全,
可读性不佳,
执行效率低,
维护成本高,
也不好看啊,
接分啦!
太长了 CSDN 弄个分页吧
呵呵
跟c中的gets()函数一样的安全问题,对不对?
这样子的代码谁愿意读谁是疯子。。。可读性差,错都不知道错哪了
不安全 可读性差
1.ToString()没有考虑空值处理
2.注入式攻击

同意这个观点:)

安全!????
接分来了
不易维护.  不安全
up
分分    
一不安全,容易被注入式攻击 
二效率低,处理速度慢
来报到了...
来看看啊
学习一下~~~~~~
xin新人以后多关照
新人来学习,感觉看到一大片的连续代码就头疼。
加多or 1=1会怎么样呢?
不安全也不高效啊,而且要是改动的话也不方便改啊,不清楚
学习~~~~~~~~~~~~~~~~~
学习中,
学习,就是学习
jf…… 
只有存储过程和参数化才能阻止sql注入吗,直接写的话有什么方法也可以呢
不好修改  安全性不高   
回帖是一种美德
学习一下~~~~~~
不懂 拿分
路过 学习 顺便回帖
个人认为安全问题
当然改动页面的话,这个也会出问题
感觉很乱啊
学习
用存储过程吧!!
存储过程
好长的SQL语句啊 · · 
   还得加强学习才行
好深奥啊 要努力学习
多点技巧.少点花样
1.用参数
2.不安全,比如回滚
有没有更直观的啊?
顶上
不容易维护。
并且安全性低。
好的程序并不一定是高效的,但必须是高安全性的。
只能顶了,。。。
mark
up
安全性不高
学习了
呵呵,学习啦!
UP!~~~~~~
回帖是一种美德!每天回帖即可获得 10 分可用分!
第一有:SQL注入的危险!
第二:这样写太麻烦!
第三:不利于维护!
第四:读取速度受限!
我好像一直是这样写的。。。。。。。。。
有什么问题啊?
主要就是SQL注入,阅读修改都不方便
up
那么多人都说了  也就不多解释了  就是安全性问题  SQL注入
学习~~
1、没有判定空值
2、如果有单引号之类的
3、容易被人sql注入
4、可读性也不好
  新人报道,学习下下
  不知道还有分拿没
靠,都是牛人啊
引用 23 楼 goga21cn 的回复:

按照LZ的意思应该强调的不是安全方面的问题吧! 

string是比较特殊的类型,按照string不可变性 

C# codestring  str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力! 

使用StringBuilder或String.Format就不存在这种现象! 

C# codestring str = String.Format(“{0}{1}{2}”,”a”,”b”,”c”);

不对请指出,谢谢

其实String在拼接使用的情况只要不是太多的拼接(在100个拼接内)还是比StringBuilder高效的..创建StringBuilder所使用的内存是很大的,滥用StringBuilder是不行的噢

学习学习
安全性 目前考虑的还很少
Learning
应该是
1,不便于维护 
2,sql注入
会被攻击
不方便修改
ding
顶!
UP!~~~~
我也是新人阿,呵呵…………..
空值等异常情况没考虑
读不懂
我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱
学习了。。。

lz的代码最好采用参数传递,防sql注入。

UP
读写不方便,不利于程序的修改
有点明白了,
学习了 存储过程还是好哈
新手学习了,接分 谢谢
安全的问题
1. sql注入不安全
2. StringBuilder对象创建字符串和拼接字符串性能好些
3. 代码繁琐,难以维护
收藏,学习!~
我挺推荐这样写的,这样可以早日被老板辞掉,然后去洗马桶。
引用 303 楼 xxc3303 的回复:

引用 23 楼 goga21cn 的回复:
按照LZ的意思应该强调的不是安全方面的问题吧!

string是比较特殊的类型,按照string不可变性

C# codestring str=”a”+”b”+”c”;

内存中会存在”a”、”b”、”c”、”ab”、”abc”几个对象,而除了”abc”都是临时对象,会增大GC的压力!

使用StringBuilder或Stri……

StringBuilder的内存开销并非你说的那么大。另外,100个拼接的话,可以用StringBuilder了。

楼主既然是送新人,为什么自己不总结一下不推荐这样写的原因,都是其他人说,我们新手都不知哪个对!
我也不知itliyi写得是否比较正规的写法,楼主最好在本贴写一个这段语句的更正写法,方便新手学习!
引用 2 楼 kamboo 的回复:

1.ToString()没有考虑空值处理
2.注入式攻击

说的很经典

每天回帖会有回报的。
注入式攻击吧!
1、结构混乱,CodeBehide直接访问数据库
2、未用参数,太容易被注入式攻击了
3、“((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0]))”这样的代码,没有任何判断校验,页面随便调整一下就会报空指针异常
4、大量的字符串拼接,性能低下
5、“bind();”,方法命名不规范,方法名首字母要大写
6、“GridView1”,这种命名实在不可取
7、SQL语句中关键字要大写
存储过程,简单明了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明[散分]送新人,为什么不推荐这样写,这样写有啥问题?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!