我的第一个实战项目之后台编码

     由于这个软件比较小,数据量在几十W的级别,也算是特别小的那种,所以我的后台编码工作相对而言就简单了许多,就是一些简单SQL语句,由于自己的数据库方面的知识、掌握的有限,5K的代码写下来之后才发现中间都没有用 触发器、存储过程,更别提什么这样那样的索引和一些更高级的东东了。

大侠们莫笑,就是这样简单的一项工作,我都错误百出、还经常在同一个地方跌倒,因此才不由的感慨、实践的重要,课堂永远是课堂,它永远无法全析现实中的点滴。

         也许是我没有什么文学方面的素养吧,对文字没有太多的感觉,所以还是闲字少写,直接总结一下、这段时期的感受及所学吧。

          每当想起这段时间、感触颇深的应该就算是调试错误了,由于这是第一次做这样的实战项目吧,刚开始总是有一种“捉刺猬”的感觉——无从下手,而且错误百出,并且还从中发现了一点:整个项目中没有太多的技术难点,出现错误地方大多数都是一些细节上的问题,都是一些平时没有引起重视、容易忽略掉的问题。所以做软件应该细心一点,平时就应该多总结经验教训,争取下次不再犯同样的错误。

         近期出现的几个错误如下:
          1、读取数据库中的数据时,当所读取出来数据类型为string类型时,忘记了加 Trim();方法。
          原因如下:为了保证数据能够保存到数据库表中,在建立数据库表的时候通常会将字段的长度设置的比实际录入的数据的长度略长一些,这样以来就会导致在读取数据的时候会导致读取出的数据比实际数据 在尾部多出了多余空格。如果、不将这些空格去掉,这颗定时炸弹可能随时都会爆炸哦,到时候可别怪我没提醒你哟。如上所说:正确的书写格式如下:string strName = datarow["Name"].ToString().Trim();


          2、SQL插入特殊字符时的SQL语句错误。
          错误形式如下:string strSql = string.Format("INSERT INTO FixedProduct(FixedProductID,FixedProductName)
SELECT '{0}','{1}' ",@"1000",@"jkl;'[]/!#¥%……*)——?》《:“}{|.,");
这个问题从表明上看起来并不是很严重,但是如果不处理好特殊字符 (如:单引号),那么当用户输入了单引号之后 毫无疑问,你的SQL语句就会执行失败。所以为了安全起见 在后台有必要将单引号进行特殊处理 如:屏蔽,转化等等。
     具体的原因不用分析了吧,很明显是SQL语句语法错误。 但是如果用户确实需要输入这么些特殊字符那该这么办呢?我现在有两种比较简单的两种方式:(1)使用参数。(2)将数据转成DataTable 、DataRow ,然后使用SqlBulkCopy 对象将 DataTable 、DataRow 等 直接写入数据库。

更多的关于SqlBulkCopy 的连接 (1)快速复制数据 (2)极速插入数据

     3、事务DbTransaction的使用

说到事务就不得不提一提事务的处理过程,深层次的东东 晚辈一点也不懂就简单的说一下表面上的吧,事务的大概的处理过如下:

1、事务一开始执行 最先进入“事务待命”状态。

2、在“事务待命”状态下,记录事务改变的数据库记录。此改变不能直接改变数据库中的记录,必须在同时用一个顺序的“事务日志”在一边进行记录,同时要对需要改变的原始记录进行加锁,让其他用户无法读和写。如果记录已经别其他用户加锁,则报错。

3、在“事务待命”下,如果用户给出Commit Transaction 命令,则进入“事务拷贝”状态,拷贝所有的加锁记录成备份。

4、当“事务拷贝”状态结束之后, 则进入“事务更新”状态,用“事务日志”中的记录一一更新实际的数据库记录。

5、在“事务更新”状态结束之后,则进入“事务结束”状态,释放所有记录锁、抛弃“事务日志”和备份的原有数据库记录。

鉴于事务的特性,我经常将DbTransaction 在 Using中使用,其中的代码块也就出现了如下大致结构:

using(DbTransaction t = new DbTransaction )
{
    try
    {
         ///其他代码…
         Command1.Transaction = t;
         Command1.ExecuteNonQuery();

         Command2.ExecuteNonQuery();

    }catch(DbException dbex )
    {
        t.RollBack();
        //MessageBox(dbex.Message);
       throw …//抛出异常
    }
    catch(Exception ex)
    {
        t.RollBack();
        //MessageBox(ex.Message);
        throw …//抛出异常
    }
    t.Commit();//  执行Commit Transaction 命令  提交事务
}

在如上的代码结构中,如果Command2访问了【包括读或者写】Command1所加锁的记录,则会报错。

另外:
(1)SELECT 语句【读记录】 但 不会对记录加锁。
(2)UPDATE 语句、DELETE 语句及INSERT 语句 都是【写记录】 并且同时会对记录加锁。

还有一点:执行事物的代码块里最好加上Try Catch语句,并且尽可能将可能的Exception 扑捉完全,因为如果在代码块中发生了未捕捉的到异常,程序就有可能出现重复执行事务的死循环,导致应用程序关闭。当然这里的死循环是否是由于事务引起的,我暂时还未能完全确定。

     4、DataGridView【Windows应用程序中】应用数字做索引。

          在做这个软件的时候还出现了一个意想不到的问题,就是在DGV中 使用数字做索引在本机【XP SP2环境】下调试没有问题,但是换到了Server2000的操作系统下 就出现了问题——索引项发生了改变。
          所以,这次吸取经验教训、以后能用字符串做索引的情况下、 尽可能用字符串做索引,无论是在DGV中还是在其他的地方,一定要记住。


暂时就想起这么多来,今天就写到这吧,改天继续。

我的第一个实战项目之前期准备

posted @ 2010-08-07 21:28  把爱延续  阅读(459)  评论(0编辑  收藏  举报