1.定义了一个Product表,该表中的记录有一个State属性,利用该属性的不同值判断Product的状态。该表中存储的数据量比较大,两种不同状态记录数基本相同。我需要在C#中使用这个数据库,请问直接执行
SqlCommand sqlComm=...
string strSQL="Select * From Product Where State=State1 And Product_Id=xxx"
sqlComm.ExecuteNonQuery(strSQL)
和将这两种状态拆成ProductState1和ProductState2两个各自保存不同状态的记录的表,然后执行
if (sTableName=="ProductState1")
   strSQL="Select * From Product Where Product_Id=xxx"
else if (sTableName=="ProductState2")
   strSQL="Select * From Product Where Product_Id=xxx"
   sqlComm.ExecuteNonQuery(strSQL)
这两种方法那个更好一些?(主要是效率、可靠性和安全性三个方面)
2.在B/S结构应用程序中,下面的事务是否安全?
事务T1开始
  向表1添加一条记录(Insert 表1 Values ...)
  取得刚刚添加记录的主键ID1(Select ...)
  向表2添加一条记录(Insert 表2...)
  取得刚刚添加记录的主键ID2(Select...)
  将ID1,ID2添加进表3(Insert 表3..)
Commit事务
如果出错RollBack事务~~
请问在B/S结构的应用程序中事务T1安全吗?

解决方案 »

  1.   

    第二个问题补充一点
    表1,表2的主键是SqlServer自动生成的,初始值为10000,增值为1
      

  2.   

    1、依项目情况而定,从效率上来讲第二种稍优于第一种。2、似乎没问题。数据库的操作有区别C/S与B/S吗?
      

  3.   

    TO:问题一
    第二种效率稍微高一点...TO:问题二
    没有问题...楼主是担心什么?
      

  4.   

    1:效率应该有差别,因为这样的字段不方便建索引,建了也是基本上没有效率的
    2:
    2.在B/S结构应用程序中,下面的事务是否安全?
    事务T1开始
    向表1添加一条记录(Insert 表1 Values ...)
    取得刚刚添加记录的主键ID1(Select ...)
    向表2添加一条记录(Insert 表2...)
    取得刚刚添加记录的主键ID2(Select...)
    将ID1,ID2添加进表3(Insert 表3..)
    Commit事务
    这儿不只是b/s中.c/s中这样的事务也是逻辑上错误的向表1添加一条记录(Insert 表1 Values ...)
    取得刚刚添加记录的主键ID1(Select ...)
    这并发的过程中,用户1/2可能同时进行在insert操作,应该取得各自的insertedid
    而不是相同的select max(id) 这个概念等同于IDENT_CURRENT应该使用SCOPE_IDENTITY/@@IDENTITY
      

  5.   

    最好用SCOPE_IDENTITY,不要用@@identity,万一碰到trigger就不好啦