作者nanaon (Nanaon)
看板C_Sharp
标题[问题] client传送同一参数至server互盖问题
时间Wed May 1 14:57:07 2013
抱歉因为才殊学浅 不太懂这是哪个范畴的问题 若以下太多赘述请见谅
我们打算用winform在一个开发已久的旧系统上 加上一个记录client端行为的功能
类似於clinet端至server查询资料一次
我们就要在server上记录每个client的使用者名称 以及他们查了什麽资料
用的是三层式的网路架构
也就是clinet端安装我们的应用程式 透过dll连到server端去执行功能
目前连线程式是共用的 所有class及method及变数等等都宣告为static
(所以要新加任何东西都只能用static)
先假定Client呼叫的方式为ServerClass.QueryData(Sql, Connection , ClientInfo)
为了不修改到前端程式 我们也不能增减QueryData的参数
而我们取得client端资讯的方式主要是透过ClientInfo这个参数
这个变数在进到QueryData後 会被存在一个全域的static变数中 供其他function使用
(真正记录查询资料的是另一个function, 且这个function不能直接被QueryData呼叫)
ClientInfo的class内容大约可以简略如下:
class ClientInfo
{
public string UserID
{ get { return GetUserID(); } set { SetUserID(value); } }
public string UserName
{ get { return GetUserName(); } set { SetUserName(value); } }
..... // 还有一堆其他client相关资讯
}
我们的想法是 因为目前client程式端呼叫前会先把UserID和UserName这些变数指定好
我们只要在共用的ServerClass.QueryData把这个资讯取出来存就好了
但因为server是同一台的关系
若两个以上clint同时在server执行QueryData
ClientInfo里面的资料会有互相覆盖的情况!!
就像是假设UserID_A查询了A资料 然後UserID_B查询了B资料
分开执行时会正常纪录为:
UserID_A DataA
UserID_B DataB
但若同时执行,有可能变成:
UserID_A DataA
UserID_A DataB
或
UserID_B DataA
UserID_B DataB
也就是没办法正确的记录UserA和UserB存取了什麽资料
我们有想过会不会是变数都是static 会一直被盖掉
但我们的function又只能宣告static
不知道是否有人有其他解法 来防止互盖的情况呢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.128.153.200
※ 编辑: nanaon 来自: 140.128.153.200 (05/01 15:01)
※ 编辑: nanaon 来自: 140.128.153.200 (05/01 15:12)
1F:→ Abbee:我不知道你资料结构是什麽,我也是用static的DataTable记,没 05/01 20:18
2F:→ Abbee:此问题 05/01 20:18
3F:推 shawnlian:在查询资料的func需要再比对当前的clientinfo是谁。 05/02 16:11
4F:推 Litfal:client还好,但你不该在Server用static存放资料,除非你确 05/11 14:36
5F:→ Litfal:定是要共用的。 05/11 14:36
6F:→ Litfal:另外修改Server端的运算给Instance应该没关系吧... 05/11 14:38