| 
 如下代码 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分 | 
 up~  | 
| 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分 | 
 看了..我还的在大脑里模拟按STRING拼字符..会死机.就没敢回  | 
| 
 
大家不必贴代码修正, 
只要讨论即可, 有不妥的,或不科学的,不够严谨的都可以说, 仅指出来即可,分均分,越全面越好 以自勉和提高  | 
|
| 1分 | 
 
SQL能注入式攻击的 
 | 
| 1分 | 
 支持个!  | 
| 
 
只摘了一部分,下面是完整版
 
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分 | 
 都写成这样了,还不是可读性问题…  | 
| 1分 | 
 
jf 
 | 
| 1分 | 
 
我也说下 
1,用Cells[X]的处理方法在列排列顺序改变后也得改动程序. 2,UI和数据处理建议分开. 3,直接拼SQL的方式容易被注入攻击,建议用参数.  | 
| 1分 | 
 
安全性不高! 
 | 
| 1分 | 
 
没有考虑安全性! 
 | 
| 1分 | 
 23楼正解  | 
| 1分 | 
 | 
| 1分 | 
 
代码安全性差 
 | 
| 1分 | 
 
jf 
 | 
| 1分 | 
 正解啊!  | 
| 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分 | 
 支持!如果语句太长,很不利于维护和查错了;  | 
| 1分 | 
 
可读性很差,并且要改起来太麻烦,时间久了估计自己看着都会晕乎的…… 
 | 
| 1分 | 
 
呵呵 学习学习 
 | 
| 1分 | 
 
不知道! 
这种情况应该是在要求多的时候才有需要区别。  | 
| 1分 | 
 
高手散分,新手接!激励自己~ 
 | 
| 1分 | 
 
这是啥呢 
 | 
| 1分 | 
 
可读性差 
 | 
| 1分 | 
 
如果碰到个垃圾老板,就这样写是正解了
 
如果老板还不错,这样写,对不起老板,更对不起下一个维护代码的同行  | 
| 1分 | 
 
dddddddddd 
 | 
| 1分 | 
 
不安全不灵活 
 | 
| 1分 | 
 
UP 
 | 
| 1分 | 
 
太难读了. 
给你 几个个建议,.    一个是写成这样的方式… delete from [Booking] where PatientID=@PatientID;    然后用SqlParamter[] params 数组 来传..  | 
| 1分 | 
 
帮定 & 接分 
 | 
| 1分 | 
 
谁教我哈sql注入及注入后是什么情况 
 | 
| 1分 | 
 
这样写最大的问题是 如果有特殊符号比如说是 ’ 单引号的话 就会出现错误。 所以不推荐这样写 最好是用参数代替! 
 | 
| 1分 | 
 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分 | 
 拿LZ的下面这句语句来说:  | 
| 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”: (“@Guardian_Name”,SqlDbType.VarChar).value=Guardian_Name; protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) [e.RowIndex].Value)); [3].Controls[0]).Text; [4].Controls[0]).Text; 由于网速问题,这段代码写了两次,不对的地方希望大家指正。  | 
| 1分 | 
 
建议用循环写. 
 | 
| 1分 | 
 
学习 
 | 
| 1分 | 
 
这个代码看晕维护的人 
 | 
| 1分 | 
 
学习。。。 
 | 
| 1分 | 
 同意  | 
| 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注入  | 
| 1分 | 
 
这个语句除了上面提到的一些缺点之外,还有一个非常重要的缺陷是数据库执行效率太低,每一条这样的语句数据库都需要重新分析,制订执行计划,不能重复使用。 
 | 
| 1分 | 
 
学习~~ 
 | 
| 1分 | 
 直接在名字这一列输入  | 
| 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分 | 
 加一点:思考方式还是以前的过程式编程.  | 
| 1分 | 
 
维护性不高 
 | 
| 1分 | 
 
ding,dui 
 | 
| 1分 | 
 
1.容易注入攻击 
2.可读性差 3.每一个拼接会在内存中产生一个对像,这样费内存效率也底下 4.不便于维护可读性差,刚开始写时可以知道写的是什么,过个一半年要改可就麻烦了.  | 
| 1分 | 
 
建议放在事物里,保证数据完整性。 
 | 
| 1分 | 
 对啊,我想lz要说的是这个问题吧。  | 
| 1分 | 
 严重同意  | 
| 1分 | 
 
路过,接分 
同时mark,学习学习  | 
| 1分 | 
 
DataGridView使用是最好用列的名字吧,要不改一列就会改很多 
 | 
| 1分 | 
 谢谢 学习了  | 
| 1分 | 
 
安全问题,这个我用测试软件测试过的 
一测一个准~~~ 存在injection 的风险  | 
| 1分 | 
 
LZ的问题主要是安全性和可读性,安全性会造成数据库、服务器被控制, 
可读性如果会造成其他同事理解错误、或者书写错误,也将造成数据错误 很明确地告诉你… str=”a”+”b”+”c”; 等价于 str=”abc”; 只有一个常量,即 “abc”; 我想你是把a,b,c,当变量 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的恐惧导致我在人艺最后的谈话中悲剧重演,人民艺术家事业中道崩卒。事后来我妈还真托人询问失败原因,我还以为是因为学历不够或者知识欠缺,这两点确实是我职业简历的弱项,结果人艺的传出来的意见却出乎意料,人家的结论是因为我的想法和反映太过强大,估计创作和创业更适合我的发展,即便录取说不定两年内就会跳槽。而人艺历史悠久,人民艺术家事业任重道远,需要年轻人用尽他们的一生来奋斗。  ps:如果本文无意中冒犯到了谁请在心中默念楼主牛逼 以换来内心平和  ==该帖由 猛吃雪糕 分类为 精彩帖   | 
|
| 
 
其实 我刚开始学计算机语言看不懂 但是 觉得LZ写的不是很认真,做 的不简洁,不 工整 
 | 
|
| 
 
真是的,积分我不都了 
 | 
|
| 
 
回帖是一种美德!每天回帖即可获得 10 分可用分 
 | 
|
| 
 
安全,和可读性,可维护性,以及代码重用性也不高 
 | 
|
| 
 
不安全也不高效啊,而且要是改动的话也不方便改啊,不清楚 
 | 
|
| 
 
学习学习 
 | 
|
| 
 
学习一下, 
 | 
|
| 
 
恩很好学习了啊  
 | 
|
| 
 
up 
 | 
|
| 
 感谢的紧!  | 
|
| 
 
来学习了!!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、可读性也不好  | 
|
| 
 
  新人报道,学习下下 
不知道还有分拿没  | 
|
| 
 
靠,都是牛人啊 
 | 
|
| 
 其实String在拼接使用的情况只要不是太多的拼接(在100个拼接内)还是比StringBuilder高效的..创建StringBuilder所使用的内存是很大的,滥用StringBuilder是不行的噢  | 
|
| 
 
学习学习 
安全性 目前考虑的还很少  | 
|
| 
 
Learning 
 | 
|
| 
 
好 
 | 
|
| 
 
应该是 
1,不便于维护 2,sql注入  | 
|
| 
 
会被攻击 
不方便修改  | 
|
| 
 
ding 
 | 
|
| 
 
顶! 
 | 
|
| 
 
UP!~~~~ 
 | 
|
| 
 
我也是新人阿,呵呵………….. 
 | 
|
| 
 
空值等异常情况没考虑 
 | 
|
| 
 
读不懂 
 | 
|
| 
 
我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱我需要钱 
 | 
|
| 
 
学习了。。。
 
lz的代码最好采用参数传递,防sql注入。  | 
|
| 
 
UP 
 | 
|
| 
 
读写不方便,不利于程序的修改 
 | 
|
| 
 
有点明白了, 
 | 
|
| 
 
学习了 存储过程还是好哈 
 | 
|
| 
 
新手学习了,接分 谢谢 
 | 
|
| 
 
安全的问题 
 | 
|
| 
 
1. sql注入不安全 
2. StringBuilder对象创建字符串和拼接字符串性能好些 3. 代码繁琐,难以维护  | 
|
| 
 
收藏,学习!~ 
 | 
|
| 
 
我挺推荐这样写的,这样可以早日被老板辞掉,然后去洗马桶。 
 | 
|
| 
 StringBuilder的内存开销并非你说的那么大。另外,100个拼接的话,可以用StringBuilder了。  | 
|
| 
 
楼主既然是送新人,为什么自己不总结一下不推荐这样写的原因,都是其他人说,我们新手都不知哪个对! 
我也不知itliyi写得是否比较正规的写法,楼主最好在本贴写一个这段语句的更正写法,方便新手学习!  | 
|
| 
 说的很经典  | 
|
| 
 
每天回帖会有回报的。 
 | 
|
| 
 
注入式攻击吧! 
 | 
|
| 
 
1、结构混乱,CodeBehide直接访问数据库 
2、未用参数,太容易被注入式攻击了 3、“((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0]))”这样的代码,没有任何判断校验,页面随便调整一下就会报空指针异常 4、大量的字符串拼接,性能低下 5、“bind();”,方法命名不规范,方法名首字母要大写 6、“GridView1”,这种命名实在不可取 7、SQL语句中关键字要大写  | 
|
| 
 
存储过程,简单明了 
 | 
|