请问在多用户环境下如何处理对Access数据库同时对同一条记录进行修改???

时间:2022-05-13 23:32:41
请问在多用户环境下如何处理对Access数据库同时对同一条记录进行修改???

18 个解决方案

#1


你想怎么控制? 允许还是不允许?

#2


当然允许了,不想丢失数据啊

#3


允許啊?那你最終想保留哪個人修改的結果呢?

#4


考虑TimeStamp,只有一人能成功更新

#5


可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。

#6


引用 5 楼 rtdb 的回复:
可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。

up

#7


我们是这样子做的

首先当读取一条数据时,就有一个静态类进行订记,这个类为远程对象
所有的用户都是通过远程对象来读取数据

当一个用户开始编辑时,先看服务器上有没有记录着其它的用户在编辑些记录
如果没有,就允许编辑,并在服务器上记下此用户编辑此记录

用户保存后,就将些记录告诉服务器


依此下去

#8


mark

#9


引用 6 楼 feifeiyiwen 的回复:
引用 5 楼 rtdb 的回复:
可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。 
 
up

#10


这样不就那个checkOut机制啊,跟楼上说的一样,不过这样有人编辑会很麻烦了

#11


这样不就那个checkOut机制啊,跟楼上说的一样,不过这样有人编辑会很麻烦了
哎。。。没有更好的办法

#12


ding

#13


我会用TimeStamp控制

TimeStamp.aspx.cs代码(C#),已调试通过:
       1using System;
       2using System.Collections;
       3using System.ComponentModel;
       4using System.Data;
       5using System.Drawing;
       6using System.Web;
       7using System.Web.SessionState;
       8using System.Web.UI;
       9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11
12using System.Text;
13using System.Data.SqlClient;
14using DataAccess;
15
16namespace TimeStamp
17{
18         /**//// <summary>
19         /// WebForm1 的摘要说明。
20         /// </summary>
21         public class TimeStamp : System.Web.UI.Page
22         {
23             protected System.Web.UI.WebControls.TextBox tbKey;
24             protected System.Web.UI.WebControls.TextBox tbValue;
25             protected System.Web.UI.WebControls.TextBox tbTimeStamp;
26
27             private DataTable dt;
28             protected System.Web.UI.WebControls.Button Button1;
29             protected System.Web.UI.WebControls.Label Label1;
30    
31             protected string ConnectString = "server=oylb;User ID=sa;Password=;database=TimeStamp;Connection Reset=FALSE";
32
33             private void Page_Load(object sender, System.EventArgs e)
34             {
35                 if (!IsPostBack)
36                 {
37                     BindData(1);
38                 }    
39             }
40
41             //取得数据
42             private void GetData(int kid)
43             {
44                 DataSet ds = new DataSet();
45
46                 String[] sArrayTableName = {"TimeStamp"};
47                 SqlHelper.FillDataset(ConnectString,CommandType.StoredProcedure,
48                                         "GetData",ds,sArrayTableName,
49                                             new SqlParameter("@KID",kid));
50
51                 dt = ds.Tables["TimeStamp"];
52
53                 //保存于Session,用于更新
54                 Session["TimeStamp"] = dt;
55             }
56
57             //绑定数据到控件
58             private void BindData(int kid)
59             {
60                 GetData(kid);
61
62                 Byte[] myByte;
63
64                 this.tbKey.Text = dt.Rows[0]["KID"].ToString();
65                 this.tbValue.Text = dt.Rows[0]["Name"].ToString();
66
67                 myByte = (System.Byte[])dt.Rows[0]["TimeStamp"];
68
69                 this.tbTimeStamp.Text = Encoding.ASCII.GetString(myByte,0,myByte.Length);
70             }
71
72             //更新数据
73             private bool UpdateData()
74             {
75                 dt = (DataTable)Session["TimeStamp"];
76            
77            &nb

sp;        DataRow row = dt.Rows[0];
78
79                row["Name"] = this.tbValue.Text.Trim();
80
81                dt.AcceptChanges();
82
83                int iEffect = SqlHelper.ExecuteNonQuery(ConnectString,"UpdateData",GetParam(row));
84
85                if (iEffect != 1)
86                {
87                    return false;
88                }
89
90                return true;
91            }
92
93            //根据datarow获取参数
94            private SqlParameter[] GetParam(DataRow row)
95            {
96                DataColumnCollection cols;
97
98                cols = row.Table.Columns;
99
100                int iBound = cols.Count;
101                
102                SqlParameter[] Params = new SqlParameter[iBound];
103                SqlParameter Param = new SqlParameter();
104
105                string strColumnName;
106                int iIndex = 0;
107
108                object oRowValue = null;
109
110                foreach(DataColumn col in cols)
111                {
112                    strColumnName = col.ColumnName;
113
114                    oRowValue = row[col];
115
116                    if (oRowValue == System.DBNull.Value)
117                    {
118                        oRowValue = DBNull.Value;
119                    }
120
121                    if (col.DataType.ToString() == "System.Byte[]")
122                    {
123                        //专门处理Timestamp
124                        Param = new SqlParameter("@"+strColumnName,SqlDbType.Timestamp, 8);
125                        Param.Direction = ParameterDirection.Input;
126                        Param.Value = oRowValue; 
127                    }
128                    else
129                    {
130                        Param = new SqlParameter();
131
132                        Param.ParameterName = "@"+strColumnName;
133                        Param.SqlDbType = GetColSqlDbType(col);
134                        Param.Direction = ParameterDirection.Input;
135                        Param.Value = oRowValue;
136                    }
137      &n

bsp;             
138                   Params[iIndex] = Param;
139                   iIndex ++;
140               }
141
142               return Params;
143           }
144
145           //转化类型
146           private SqlDbType GetColSqlDbType(DataColumn col)
147           {
148               string strType = col.DataType.ToString();
149
150               switch(strType)
151               {
152                   case "System.Int32":
153                       return SqlDbType.Int;
154                   case "System.DateTime":
155                       return SqlDbType.DateTime;
156                   case "System.Double":
157                       return SqlDbType.Decimal;
158                   case "System.String":
159                       return SqlDbType.Char;
160                   case "System.Byte[]":
161                       return SqlDbType.Timestamp;
162                   default:
163                       return SqlDbType.Char;
164               }
165           }
166           Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
167           override protected void OnInit(EventArgs e)
168           {
169               //
170               // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
171               //
172               InitializeComponent();
173               base.OnInit(e);
174           }
175        
176           /**//// <summary>
177           /// 设计器支持所需的方法 - 不要使用代码编辑器修改
178           /// 此方法的内容。
179           /// </summary>
180           private void InitializeComponent()
181           {    
182               this.Button1.Click += new System.EventHandler(this.Button1_Click);
183               this.Load += new System.EventHandler(this.Page_Load);
184
185           }
186           #endregion
187
188           private void Button1_Click(object sender, System.EventArgs e)
189           {
190               if (UpdateData())
191               {
192                   this.Label1.Text = "成功!";
193                   BindData(1);
194               }
195               else
196               {
197         &

nbsp;           this.Label1.Text = "失败!";
198              }
199          }
200      }
201}
202

上面用了sqlhelper

#14


http://download.csdn.net/source/613262

#15


zzxap,很好很强大

#16


学习

#17


不管怎样,先谢谢,我先试试

#18


我个人觉得如果允许多用户访问的话

第1个进入的用户, 可以编辑
在未完成编辑的时候, 其他用户只有只读属性, 但是提示有用户在编辑
在第1个用户编辑结束之后, 解开只读

#1


你想怎么控制? 允许还是不允许?

#2


当然允许了,不想丢失数据啊

#3


允許啊?那你最終想保留哪個人修改的結果呢?

#4


考虑TimeStamp,只有一人能成功更新

#5


可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。

#6


引用 5 楼 rtdb 的回复:
可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。

up

#7


我们是这样子做的

首先当读取一条数据时,就有一个静态类进行订记,这个类为远程对象
所有的用户都是通过远程对象来读取数据

当一个用户开始编辑时,先看服务器上有没有记录着其它的用户在编辑些记录
如果没有,就允许编辑,并在服务器上记下此用户编辑此记录

用户保存后,就将些记录告诉服务器


依此下去

#8


mark

#9


引用 6 楼 feifeiyiwen 的回复:
引用 5 楼 rtdb 的回复:
可以考虑使用CHECKOUT机制,一次只允许一人更改以避免数据丢失。 
 
up

#10


这样不就那个checkOut机制啊,跟楼上说的一样,不过这样有人编辑会很麻烦了

#11


这样不就那个checkOut机制啊,跟楼上说的一样,不过这样有人编辑会很麻烦了
哎。。。没有更好的办法

#12


ding

#13


我会用TimeStamp控制

TimeStamp.aspx.cs代码(C#),已调试通过:
       1using System;
       2using System.Collections;
       3using System.ComponentModel;
       4using System.Data;
       5using System.Drawing;
       6using System.Web;
       7using System.Web.SessionState;
       8using System.Web.UI;
       9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11
12using System.Text;
13using System.Data.SqlClient;
14using DataAccess;
15
16namespace TimeStamp
17{
18         /**//// <summary>
19         /// WebForm1 的摘要说明。
20         /// </summary>
21         public class TimeStamp : System.Web.UI.Page
22         {
23             protected System.Web.UI.WebControls.TextBox tbKey;
24             protected System.Web.UI.WebControls.TextBox tbValue;
25             protected System.Web.UI.WebControls.TextBox tbTimeStamp;
26
27             private DataTable dt;
28             protected System.Web.UI.WebControls.Button Button1;
29             protected System.Web.UI.WebControls.Label Label1;
30    
31             protected string ConnectString = "server=oylb;User ID=sa;Password=;database=TimeStamp;Connection Reset=FALSE";
32
33             private void Page_Load(object sender, System.EventArgs e)
34             {
35                 if (!IsPostBack)
36                 {
37                     BindData(1);
38                 }    
39             }
40
41             //取得数据
42             private void GetData(int kid)
43             {
44                 DataSet ds = new DataSet();
45
46                 String[] sArrayTableName = {"TimeStamp"};
47                 SqlHelper.FillDataset(ConnectString,CommandType.StoredProcedure,
48                                         "GetData",ds,sArrayTableName,
49                                             new SqlParameter("@KID",kid));
50
51                 dt = ds.Tables["TimeStamp"];
52
53                 //保存于Session,用于更新
54                 Session["TimeStamp"] = dt;
55             }
56
57             //绑定数据到控件
58             private void BindData(int kid)
59             {
60                 GetData(kid);
61
62                 Byte[] myByte;
63
64                 this.tbKey.Text = dt.Rows[0]["KID"].ToString();
65                 this.tbValue.Text = dt.Rows[0]["Name"].ToString();
66
67                 myByte = (System.Byte[])dt.Rows[0]["TimeStamp"];
68
69                 this.tbTimeStamp.Text = Encoding.ASCII.GetString(myByte,0,myByte.Length);
70             }
71
72             //更新数据
73             private bool UpdateData()
74             {
75                 dt = (DataTable)Session["TimeStamp"];
76            
77            &nb

sp;        DataRow row = dt.Rows[0];
78
79                row["Name"] = this.tbValue.Text.Trim();
80
81                dt.AcceptChanges();
82
83                int iEffect = SqlHelper.ExecuteNonQuery(ConnectString,"UpdateData",GetParam(row));
84
85                if (iEffect != 1)
86                {
87                    return false;
88                }
89
90                return true;
91            }
92
93            //根据datarow获取参数
94            private SqlParameter[] GetParam(DataRow row)
95            {
96                DataColumnCollection cols;
97
98                cols = row.Table.Columns;
99
100                int iBound = cols.Count;
101                
102                SqlParameter[] Params = new SqlParameter[iBound];
103                SqlParameter Param = new SqlParameter();
104
105                string strColumnName;
106                int iIndex = 0;
107
108                object oRowValue = null;
109
110                foreach(DataColumn col in cols)
111                {
112                    strColumnName = col.ColumnName;
113
114                    oRowValue = row[col];
115
116                    if (oRowValue == System.DBNull.Value)
117                    {
118                        oRowValue = DBNull.Value;
119                    }
120
121                    if (col.DataType.ToString() == "System.Byte[]")
122                    {
123                        //专门处理Timestamp
124                        Param = new SqlParameter("@"+strColumnName,SqlDbType.Timestamp, 8);
125                        Param.Direction = ParameterDirection.Input;
126                        Param.Value = oRowValue; 
127                    }
128                    else
129                    {
130                        Param = new SqlParameter();
131
132                        Param.ParameterName = "@"+strColumnName;
133                        Param.SqlDbType = GetColSqlDbType(col);
134                        Param.Direction = ParameterDirection.Input;
135                        Param.Value = oRowValue;
136                    }
137      &n

bsp;             
138                   Params[iIndex] = Param;
139                   iIndex ++;
140               }
141
142               return Params;
143           }
144
145           //转化类型
146           private SqlDbType GetColSqlDbType(DataColumn col)
147           {
148               string strType = col.DataType.ToString();
149
150               switch(strType)
151               {
152                   case "System.Int32":
153                       return SqlDbType.Int;
154                   case "System.DateTime":
155                       return SqlDbType.DateTime;
156                   case "System.Double":
157                       return SqlDbType.Decimal;
158                   case "System.String":
159                       return SqlDbType.Char;
160                   case "System.Byte[]":
161                       return SqlDbType.Timestamp;
162                   default:
163                       return SqlDbType.Char;
164               }
165           }
166           Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
167           override protected void OnInit(EventArgs e)
168           {
169               //
170               // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
171               //
172               InitializeComponent();
173               base.OnInit(e);
174           }
175        
176           /**//// <summary>
177           /// 设计器支持所需的方法 - 不要使用代码编辑器修改
178           /// 此方法的内容。
179           /// </summary>
180           private void InitializeComponent()
181           {    
182               this.Button1.Click += new System.EventHandler(this.Button1_Click);
183               this.Load += new System.EventHandler(this.Page_Load);
184
185           }
186           #endregion
187
188           private void Button1_Click(object sender, System.EventArgs e)
189           {
190               if (UpdateData())
191               {
192                   this.Label1.Text = "成功!";
193                   BindData(1);
194               }
195               else
196               {
197         &

nbsp;           this.Label1.Text = "失败!";
198              }
199          }
200      }
201}
202

上面用了sqlhelper

#14


http://download.csdn.net/source/613262

#15


zzxap,很好很强大

#16


学习

#17


不管怎样,先谢谢,我先试试

#18


我个人觉得如果允许多用户访问的话

第1个进入的用户, 可以编辑
在未完成编辑的时候, 其他用户只有只读属性, 但是提示有用户在编辑
在第1个用户编辑结束之后, 解开只读