http://www.csdn.net/Develop/read_article.asp?id=15650

解决方案 »

  1.   

    关于第一点:
         如果采用存储过程,就不用进行字符串中特殊字符的过滤了
         我这里有一个自己用的小函数,我把它包装在一个类里面了,在整个项目中都可以使用,大家可以参考一下,有问题通知我一下
    Public Class StringFormat
            '字符串格式化类
            Function SqlStrFormat(ByVal strSql As String) As String
                'Sql语句方式的字符串格式化函数,采用特殊方式替换掉 sql Wildcard Characters
                '该函数使用范围有限
                If strSql = "" Then
                    Return ""
                End If
                strSql = strSql.Replace("'", "''")  '替换单引号
                strSql = strSql.Replace("[", "[[]")
                strSql = strSql.Replace("%", "[%]")
                strSql = strSql.Replace("_", "[_]")
                strSql = strSql.Replace("*", "[*]")
                Return strSql
            End Function
        End Class第二个问题:同意我关于数据库开发的一点看法:有些公司采用了专业级的数据库如Oracle,sql server,但是这些数据库设计的可以说是漏洞百出,很多人在编写程序或设计数据库的时候根本没有注意数据库的操作,举几个例子吧:Sql Server : 
    1)库表中有一个ID列,该列作为关键码,有的人是这样做的
          从库中读出该列的最大值,加1,以该值为关键码向数据库中插入记录!!如果该数据库是给一个论坛设计的,出现数据异常的可能性有多大,即使是单用户的数据库也不能这样设计的。
    ----在Access中有自增列,sql server中可以用 identity(1,1)轻松搞定
    2)多表操作:比如入库记录,可能有一个主表存入库的时间等其他基本信息,还有一个子表存入库商品明细。这种情况下很多人采用的是程序中控制.如果恰好在删除一个表中的数据时出错,另外一个表中的数据就成了脏数据
    ----这种情况最好采用触发器或存储过程,适当时候采用事务
    3)尽量采用存储过程和触发器,减少程序中的数据处理,一方面是因为存储过程是预先编译过的,执行速度快,另一方面数据异常的处理比较方便,同时又减少了在数据库服务器和网站服务器之间的数据传递一个进销存系统,购买入库,出库,打折,赠货等都可以用触发器和存储过程来实现,程序中代码会非常简单
      

  2.   

    还有分号“;”,两个减号(注释)“--”。经典的login的错误:
    ';drop table SomeTableName;--或者:';xp_cmdshell('format d:/q/s');--
      

  3.   

    有时我把表名取为user,结果就报语法错误,一开始搞不清楚为什么,后来换了一个表名才成功。看来需要整理一下有冲突的关键字。
      

  4.   


    应该利用索引功能加快数据查询的操作,对查询操作经常涉及的列、表应该建立索引,这样比没有建立索引的情况下,速度要快很多,对sql server还可以在需要的时候建立全文索引。忘记在哪本书上看到的一个建议了,大意如此:“表扫描是很糟糕的做法”,因为表扫描的速度会随着表单的不断扩大而越来越慢。
      

  5.   

    谢谢!
    好文好像Oralce 中  _ 下划线是单字节统配符,所以如果要做查询的话就要做转意了
      

  6.   

    有没有哪位仁兄关注过SqlCommand 和 OleDbCommand 中关于数据库连接池的问题。我注意到在连接数据库时,也就是Connection.open()的时候,第一次有轻微的停顿(单步执行的时候);第二次再单步执行的时候就很顺畅了。
    欢迎有兴趣的同仁一起讨论或者指点一二。
      

  7.   

    我反对用自增型,加满了会溢出,不知道大家试过没有,我试了是这样的,比如一个tinyint类型的自增型字段(0, 1),如果insert次数(不是记录数)达到256次,再要insert就会出错了,即使这时表中只有一条记录。    还有,自增型字段在程序中比较难控制,尤其是把它作为PK时。    不知道大家对自增型字段有什么看法,欢迎讨论。
      

  8.   

    自增加字段定义成tinyint型,不是自己找麻烦吗?一般至少应该是int的作为PK不好控制,具体地说来?
      

  9.   

    自增字段似乎MSSQL和MySQL的处理不同!举例说来,在表中INSERT 10条记录,然后删除ID为10的,再插入一条,如果在MSSQL中新插入的记录ID为11,而MySQL中则为10;同理在MSSQL中删除所有记录后,ID编号也不会从头开始;MySQL则会。这是为何呢?请各位指点!
      

  10.   

    楼上的,在MSSQL中,
    你的主键ID自动增长可以设置为重用和不可重用,
    所以有你说得情况。
    ^_^
      

  11.   

    字段名不要使用关键字
    我记得很久以前写过的一个程序,是用了Access,老是出错,提示又说得不明不白,忙了很久,后来把一个字段名改过来,就正常了,那字段名好像是“Name”,也不知有没有记错。
    总之,尽量不要用关键字作他用!
      

  12.   

    dwei(大卫) :
    楼上的,在MSSQL中,
    你的主键ID自动增长可以设置为重用和不可重用,
    所以有你说得情况。请问怎么设置重用和不可重用呢?
      

  13.   

    LOGIN常用的方法
    SELECT USERID WHERE USERNAME='''+USERNAME+''' AND PWD='''+PWD+''''
    这时如果USERNAME的值为" '1 OR '1=1 " 那用户就进入系统了,所以最好做些限制
      

  14.   

    hanxian(寒星(*)终于有了一颗星) :
    就是啊,我一开始就说要禁止使用 单引号 啦!:(
    '我写的一个函数:
    Function CheckValue(ByVal str As String) As Boolean
            If InStr(str, "'") > 0 Or InStr(str, "%") > 0 Or InStr(str, "#") > 0 Or InStr(str, "*") > 0 Then
                 MsgBox("输入了非法字符,请重新输入!  " & Chr(10) & Chr(13) & "字符  %  ’ *  # 等都是非法字符!", MsgBoxStyle.OKOnly Or MsgBoxStyle.Exclamation, "警告")
                 Return False
            End If
            Return True
    End Function
      

  15.   

    在写SQL语句读取数据时尽量不要用Select * From TableName,除非真的要把表中所有的字段值都读取
      

  16.   

    关于数据库连接字问题,不知道怎么写的,或知道怎么写不想自己写的或以前知道怎么学现在忘了怎么写的,或知道怎么写但总写错的.来这里:
    http://www.able-consulting.com/ADO_Conn.htm
      

  17.   

    为什么用dts传送数据的时候失败?--有id的时候
    如果没有自动编号的情况下可以正常执行dts,但数据库中数据重复.
    各位高手,请指明是什么原因?...
      

  18.   

    建议所有用户标识都用lowercase;
    表名最好用复数,如users
    字段用到两个单词以上的,如果不易产生歧义,可连写,如publishyear;
    容易混淆的就用下划线连接,如user_id;
    感觉无论你用什么语言做前台啊开发都比较容易区分代码和sql语句;
    命名规则可参照pubs示例数据库(如果你用ms sqlserver的话:)
      

  19.   

    就我以前的经验,开发数据库一定注意以下几点:1、建立的表名及字段不要是经常使用的词,而且全部使用大写字母以与系统表区分,例如Name,Table,Font等,更不要与系统关键字重复。时间长了以后,完全可以建立自己的数据词典库。例如姓名使用COMPELL,标题使用TITULUS等2、不要使用由用户输入的字符产生SQL语句,例如上面提到的
    SELECT USERID WHERE USERNAME='''+USERNAME+''' AND PWD='''+PWD+''''
    否则用户使用时输入一些特定字符就完蛋了,应该通过参数传入,SQL数据库系统可以将此进行直接转换。
    还是这个例子,如果用户密码是3个单引号你就死定了,这种模式你通过SQL跟踪会发现问题所在3、避免出现与开发工具参数标识相关的字符
    例如DELPHI中参数标识是“:”,而SQL-Server中的时间间隔符也是“:”,此时SQL语句会出错,应该在SQL语句中使用CHAR()函数进行代替!
    当然,如果你的SQL语句中出现GOTO语句,那么你就要考虑是否应该修改你的SQL语句了!
      

  20.   

    to:LovenDreams(爱拼才会赢) 
    name在access和mssql都不是关键字,size是
      

  21.   

    我只是用tinyint举个例子,试的时候好试一点。
        自增型字段在程序中不好用, 比如说用户录入了新数据,提交后, 产生自增型字型的具体值, 如果这个自增型字段是PK,程序后面又还要处理这些数据时,就还要再把刚才提交的数据再取回来,这样数据就来来回回的,挺别扭。
      

  22.   

    access和sql server在程序中用的时候也有区别
      

  23.   

    access区别和mssql区别可大了,access极之不标准
      

  24.   

    我每个表都有自动增量,在MSSQL中就是integer,长度默认,设为自动增量,不作为复制在MYSQL中用integer,长度11,自动增量,无重复用户登陆时,我通常都有函数把密码简单加密一下,加密密钥用当前系统的名字,即应用程序EXE的文件名即可,这样可保证你的每套系统加密方式都有点区别(不到于你的程序都叫Project1.exe吧,呵呵)其它的没意见,至于命名用拼音还是英文,大写还是小写,建议参考JAVA,可惜DELPHI不区分大小写,也不会自动更正,没记错的话,在VB中,定义时是大写,使用中就会自动变成大写
      

  25.   

    我的字段名都用F打头,比如FAutoID, FGBName, FAboutIt基本上是所有表都有的,我的所有业务类也是从这样一个基类tBaseDB派生出来的所有数据库名都用t打头,比如tBusiness, tDepartment,主键与表名相同,比如tBusiness中的营业编号为FBusiness
      

  26.   

    还有,就是不要走弯路。比如,做一个项目,使用BIGINT型自子增种子,当我输入删除一条记录后,种子就会留出一些空缺数字,起初,对此很在意,结果自己写了个存储过程,外加一个触发器,搞定,自以为很得意,结果,运行效率太低,被CUT掉了。后来想想,一个BIGINT型的数字,就是把地球上所有信息编目,也达不到他的最值,哈哈,还是使用系统的好,何必劳心,劳肺呢!?