流水号获取的解决方案

  流水号的获取在单机版的程序中只需要简单的递增就可以解决。但是在分布式系统中存在多个客户端同时请求同一个流水号的问题,如果处理不好容易导致多个客户端获得同一个流水号。

解决方案一

  在Oracle数据库中有专门的序列管理sequence,具体的介绍在网上可以找到很多。但是在实际使用中存在很多的问题:

    1、如果有很多个不同的序列,并且在需要根据时间变化(每天0点重置)时处理起来很麻烦。

    2、随时间增加数据库中的序列越来越多。

    3、在首次创建一个序列的时候需要激活后才能正常使用。

  所以果断放弃了这个方案。

解决方案二

  大体的思路:在数据库中专门建一个表存储各类的序列,在服务器端创建一个服务专门提供各类序列当前的流水号。客户端通过这个服务来获取序列,不能直接去数据库中查

  第1步:在数据库中专门创建一个新的表用来存储这些序列。表结构如下:

    1、FLAG(标志码 主键):代表序列的标志

    2、Sequence(当前的流水号):默认为0

    3、UpdateTime(更新时间):根据自己的需要来创建

  第2步:先创建一些接口

    1、数据服务的接口      

 1  public interface IDataOperator
 2     {
 3         int ExecuteNonQuery(List<string> list);
 4         int ExecuteNonQuery(string strSql);
 5         int ExecuteNonQuery(List<string> list, ref string strError);
 6         int ExecuteNonQuery(string strSql, ref string strError);
 7         T ExecuteScalar<T>(string strSql);
 8         T ExecuteScalar<T>(string strSql, ref string strError);
 9         DataSet GetDataSet(string strSql);
10         DataSet GetDataSet(string strSql, ref string strError);
11         DataTable GetDataTable(string strSql);
12         DataTable GetDataTable(string strSql, ref string strError);
13     }

    2、流水号的接口

1   public interface ISequence
2     {
3         int GetNext(string strFlag);
4     }

 第3步:在服务器端创建一个服务,这个服务有两个功能。我这边客户端和服务端的通信用的是Remoting技术。这里就不展示相关的代码了。

    1、做客户端的数据中转,直接和数据库服务器之间通信,

  1   public class SqlServer : MarshalByRefObject,IDataOperator
  2     {
  3         #region 私有字段
  4         private string strConn;
  5         #endregion
  6         /// <summary>
  7         /// 构造器
  8         /// </summary>
  9         public SqlServer ()
 10         {
 11                         strConn = string.Format(@"User ID={0};Password={1};Data Source={2};Pooling=true;Min Pool Size=0;Max Pool Size={3};",
 12                                    “”,
 13                                  “”,
 14                                   “”
 15                                  “”;
 16
 17         }
 18         /// <summary>
 19         /// 打开数据库连接
 20         /// </summary>
 21         /// <param name="strError">返回错误信息</param>
 22         /// <returns></returns>
 23         public bool OpenTest(ref string strError)
 24         {
 25             bool blResult = false;
 26             try
 27             {
 28                 using (SqlConnection conn = new SqlConnection(strConn))
 29                 {
 30                     conn.Open();
 31                     conn.Close();
 32                 }
 33                 blResult = true;
 34             }
 35             catch(Exception ex)
 36             {
 37                 strError = ex.Message;
 38             }
 39             return blResult;
 40         }
 41         /// <summary>
 42         /// 执行一个SQL语句集合返回操作成功数
 43         /// </summary>
 44         /// <param name="strsql"></param>
 45         /// <param name="parameter"></param>
 46         /// <returns></returns>
 47         public int   ExecuteNonQuery(List<string> list, ref string strError)
 48         {
 49             int intResult = 0;
 50             int i = 0;
 51             if (list.Count > 0)
 52             {
 53                 try
 54                 {
 55                     using (SqlConnection conn = new SqlConnection(strConn))
 56                     {
 57
 58                         conn.Open();
 59                         SqlTransaction tran = conn.BeginTransaction();
 60
 61                         try
 62                         {
 63                             using (SqlCommand cmd = conn.CreateCommand())
 64                             {
 65                                 cmd.Transaction = tran;
 66                                 for (i = 0; i < list.Count; i++)
 67                                 {
 68                                    cmd.CommandText = list[i].Trim();
 69                                     intResult+= cmd.ExecuteNonQuery();
 70                                 }
 71                                 tran.Commit();
 72                             }
 73
 74                         }
 75                         catch (Exception ex)
 76                         {
 77                             try
 78                             {
 79                                 intResult = -1;
 80                                 tran.Rollback();
 81
 82                                 strError =
 83                                     string.Format("{0}个操作回滚成功!{1}\r\n ErrSQL:\r\n   {2}",
 84                                       i, ex.Message, list[i]);
 85                             }
 86                             catch(Exception ex2)
 87                             {
 88                                 intResult = -2;
 89                                 strError =
 90                                       string.Format("{0}个操作回滚失败!{1}\r\n ErrSQL:\r\n   {2}",
 91                                         i, ex2.Message, list[i]);
 92                             }
 93                         }
 94                         finally
 95                         {
 96                             conn.Close();
 97                         }
 98                     }
 99                 }
100                 catch (SqlException ex)
101                 {
102
103                     strError = ex.Message;
104                 }
105
106             }
107             else
108             {
109                 strError = string.Format("ExecuteNonQuery(List<string> list):未传入需要执行的SQL语句");
110             }
111             return intResult;
112
113         }
114         /// <summary>
115         /// 执行一个SQL语句集合返回操作成功数
116         /// </summary>
117         /// <param name="strsql"></param>
118         /// <param name="parameter"></param>
119         /// <returns></returns>
120         public int  ExecuteNonQuery(List<string> list)
121         {
122             int intResult = 0;
123             int i = 0;
124             if (list.Count > 0)
125             {
126                 using (SqlConnection conn = new SqlConnection(strConn))
127                 {
128                     conn.Open();
129                     SqlTransaction tran = conn.BeginTransaction();
130                     using (SqlCommand cmd = conn.CreateCommand())
131                     {
132                         try
133                         {
134                             cmd.Transaction = tran;
135                             for (i = 0; i < list.Count; i++)
136                             {
137                                 cmd.CommandText = list[i].Trim();
138                                 intResult += cmd.ExecuteNonQuery();
139                             }
140                             tran.Commit();
141                         }
142                         catch (Exception ex)
143                         {
144                             try
145                             {
146                                 intResult = -1;
147                                 tran.Rollback();
148                                 PubLibrary.WriteTxt(
149                                     string.Format("{0}个操作回滚成功!{1}\r\n ErrSQL:\r\n   {2}",
150                                       i, ex.Message, list[i]));
151                             }
152                             catch (Exception ex2)
153                             {
154                                 intResult = -2;
155                                 PubLibrary.WriteTxt(
156                                       string.Format("{0}个操作回滚失败!{1}\r\n ErrSQL:\r\n   {2}",
157                                         i, ex2.Message, list[i]));
158                             }
159                         }
160                         finally
161                         {
162                             conn.Close();
163                         }
164
165                     }
166
167                 }
168             }
169             else
170             {
171                 PubLibrary.WriteTxt("ExecuteNonQuery(List<string> list):未传入需要执行的SQL语句");
172                 //throw new SystemException(string.Format("ExecuteNonQuery(List<string> list):未传入需要执行的SQL语句"));
173             }
174             return intResult;
175         }
176         /// <summary>
177         /// 返回操作成功数
178         /// </summary>
179         /// <param name="strSql"></param>
180         /// <returns></returns>
181         public int ExecuteNonQuery(string strSql)
182         {
183             int intResult = 0;
184             try
185             {
186                 using (SqlConnection conn = new SqlConnection(strConn))
187                 {
188                     conn.Open();
189                     using (SqlCommand cmd = conn.CreateCommand())
190                     {
191                         cmd.CommandText = strSql;
192
193                         intResult = cmd.ExecuteNonQuery();
194                     }
195                     conn.Close();
196                 }
197             }
198             catch (Exception ex)
199             {
200                 PubLibrary.WriteTxt(ex.Message);
201             }
202             finally
203             {
204                 //conn.Close();
205             }
206
207             return intResult;
208         }
209         /// <summary>
210         /// 返回操作成功数
211         /// </summary>
212         /// <param name="strSql"></param>
213         /// <returns></returns>
214         public int ExecuteNonQuery(string strSql, ref string strError)
215         {
216             int intResult =0;
217             try
218             {
219                 using (SqlConnection conn = new SqlConnection(strConn))
220                 {
221                     conn.Open();
222                     using (SqlCommand cmd = conn.CreateCommand())
223                     {
224                         cmd.CommandText = strSql;
225
226                         intResult = cmd.ExecuteNonQuery();
227                     }
228                     conn.Close();
229                 }
230             }
231             catch (Exception ex)
232             {
233                 strError = ex.Message;
234             }
235             finally
236             {
237
238
239             }
240
241             return intResult;
242
243         }
244         /// <summary>
245         /// 返回纪录集第一行第一列的数据
246         /// </summary>
247         /// <typeparam name="T"></typeparam>
248         /// <param name="strSql"></param>
249         /// <returns></returns>
250         public T ExecuteScalar<T>(string strSql)
251         {
252             T temp = default(T);
253             try
254             {
255                 using (SqlConnection conn = new SqlConnection(strConn))
256                 {
257                     conn.Open();
258                     using (SqlCommand cmd = conn.CreateCommand())
259                     {
260
261                         cmd.CommandText = strSql;
262
263                         object o = cmd.ExecuteScalar();
264                         if (o != null && o != DBNull.Value)
265                         {
266                             temp = (T)Convert.ChangeType(o, typeof(T));
267                         }
268                     }
269                     conn.Close();
270                 }
271
272
273             }
274             catch (SqlException ex)
275             {
276                 PubLibrary.WriteTxt(ex.Message);
277             }
278             finally
279             {
280
281             }
282             return temp;
283
284         }
285
286         /// <summary>
287         /// 返回纪录集第一行第一列的数据
288         /// </summary>
289         /// <typeparam name="T"></typeparam>
290         /// <param name="strSql"></param>
291         /// <param name="strError"></param>
292         /// <returns></returns>
293         public T ExecuteScalar<T>(string strSql, ref string strError)
294         {
295
296             T temp = default(T);
297             try
298             {
299                 using (SqlConnection conn = new SqlConnection(strConn))
300                 {
301                     conn.Open();
302                     using (SqlCommand cmd = conn.CreateCommand())
303                     {
304
305                         cmd.CommandText = strSql;
306
307                         object o = cmd.ExecuteScalar();
308                         if (o != null && o != DBNull.Value)
309                         {
310                             temp = (T)Convert.ChangeType(o, typeof(T));
311                         }
312                     }
313                     conn.Close();
314                 }
315             }
316             catch (SqlException ex)
317             {
318                 strError = ex.Message;
319             }
320             finally
321             {
322
323             }
324             return temp;
325         }
326         /// <summary>
327         /// 获取数据集
328         /// </summary>
329         /// <param name="strSql"></param>
330         /// <returns></returns>
331         public DataSet GetDataSet(string strSql)
332         {
333
334             DataSet ds = new DataSet();
335             try
336             {
337                 using (SqlConnection conn = new SqlConnection(strConn))
338                 {
339                     conn.Open();
340                     using (SqlCommand cmd = conn.CreateCommand())
341                     {
342                         cmd.CommandText = strSql;
343                         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
344                         adapter.Fill(ds);
345                     }
346                     conn.Close();
347                 }
348             }
349             catch (Exception ex)
350             {
351                 PubLibrary.WriteTxt(ex.Message);
352             }
353             finally
354             {
355
356             }
357             return ds;
358         }
359
360         /// <summary>
361         /// 获取数据集
362         /// </summary>
363         /// <param name="strSql"></param>
364         /// <param name="strError"></param>
365         /// <returns></returns>
366         public DataSet GetDataSet(string strSql,ref string strError)
367         {
368             DataSet ds = new DataSet();
369             try
370             {
371                 using (SqlConnection conn = new SqlConnection(strConn))
372                 {
373                     conn.Open();
374                     using (SqlCommand cmd = conn.CreateCommand())
375                     {
376                         cmd.CommandText = strSql;
377                         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
378                         adapter.Fill(ds);
379                     }
380                     conn.Close();
381                 }
382             }
383             catch (Exception ex)
384             {
385                 strError = ex.Message;
386             }
387
388             return ds;
389         }
390
391         /// <summary>
392         /// 获取第一张数据表
393         /// </summary>
394         /// <param name="strSql"></param>
395         /// <returns></returns>
396         public DataTable GetDataTable(string strSql)
397         {
398             DataTable dt = new DataTable();
399             try
400             {
401                 using (SqlConnection conn = new SqlConnection(strConn))
402                 {
403                     conn.Open();
404                     using (SqlCommand cmd = conn.CreateCommand())
405                     {
406                         cmd.CommandText = strSql;
407
408                         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
409                         DataSet ds = new DataSet();
410                         adapter.Fill(ds);
411                         if (ds != null && ds.Tables.Count > 0)
412                         {
413                             dt = ds.Tables[0];
414                         }
415                     }
416                     conn.Close();
417                 }
418
419             }
420             catch (Exception ex)
421             {
422                 PubLibrary.WriteTxt(ex.Message);
423             }
424
425
426             return dt;
427         }
428
429         /// <summary>
430         /// 获取第一张数据表
431         /// </summary>
432         /// <param name="strSql"></param>
433         /// <param name="strError"></param>
434         /// <returns></returns>
435         public DataTable GetDataTable(string strSql,ref string strError)
436         {
437             DataTable dt = new DataTable();
438             try
439             {
440                 using (SqlConnection conn = new SqlConnection(strConn))
441                 {
442                     conn.Open();
443                     using (SqlCommand cmd = conn.CreateCommand())
444                     {
445                         cmd.CommandText = strSql;
446                         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
447                         DataSet ds = new DataSet();
448                         adapter.Fill(ds);
449                         if (ds != null && ds.Tables.Count > 0)
450                         {
451                             dt = ds.Tables[0];
452                         }
453                     }
454                     conn.Close();
455                 }
456             }
457             catch (Exception ex)
458             {
459                 strError = ex.Message;
460             }
461             finally
462             {
463
464             }
465             return dt;
466         }
467
468
469     }

    2、创建流水号的类, “_nextTen += 10;//如果流水号获取很频繁这个值可以设大一点”这里相当于一个缓存机制,以减少对数据库的访问量。可以根据实际需求来增大或减少。这里要注意一点如果服务有重启会有部分流水号丢失。如果是对流水号的连续性要求高的最好设置为1,但是这样对数据库的访问量会非常大。会导致获取流水号的平均时间增加,我的测试(普通台式电脑做服务器同时有30个进程在获取同一个流水号)是在10个缓存的情况下平均时间是10ms以内。

  1 public class BCSequence
  2     {
  3         private string _strFlag;
  4        IDataOperator dataOperator;
  5        public BCSequence(IDataOperator dataOperator)
  6         {
  7             this.dataOperator = dataOperator;
  8         }
  9        public BCSequence(string strFlag, int intSequence, IDataOperator dataOperator)
 10        {
 11            this._strFlag = strFlag;
 12            this._intSequence = intSequence;
 13            this._nextTen = intSequence;
 14            this.dataOperator = dataOperator;
 15
 16        }
 17
 18         public string StrFlag
 19         {
 20             get { return _strFlag; }
 21             set { _strFlag = value; }
 22         }
 23         int _intSequence;
 24         int _nextTen
 25         {
 26             get;
 27             set;
 28         }
 29
 30
 31         /// <summary>
 32         /// 流水号保存不了则返回-1
 33         /// </summary>
 34         public int Next
 35         {
 36             get
 37             {
 38                 if (_intSequence >= _nextTen)
 39                 {
 40                     _nextTen += 10;//如果流水号获取很频繁这个值可以设大一点
 41                     if (SaveInfo() <= 0)
 42                     {
 43                         _nextTen -= 10;//保存失败必须将值变回10否则会出现重码的情况
 44                         return -1;
 45
 46                     }
 47                 }
 48                 _intSequence++;
 49                 return _intSequence;
 50             }
 51         }
 52         public int SaveInfo()
 53         {
 54             int intResult = -1;
 55             try
 56             {
 57                 string strSql = string.Format(@"Select Count(*) from  HT_Barcode_Sequence where Flag=‘{0}‘", StrFlag);
 58
 59                 intResult = dataOperator.ExecuteScalar<int>(strSql);
 60                if (intResult == 0)
 61                 {
 62                     strSql =
 63                         string.Format(@"Insert into HT_Barcode_Sequence(Flag,Sequence,Update_Time)values(‘{0}‘,{1},Now())",
 64                         _strFlag, _nextTen);
 65                 }
 66                 else
 67                 {
 68                     strSql =
 69                            string.Format(@"Update HT_Barcode_Sequence set Sequence={0},Update_Time=Now() where Flag=‘{1}‘",
 70                            _nextTen, _strFlag);
 71                 }
 72                 intResult = dataOperator.ExecuteNonQuery(strSql);
 73             }
 74             catch (Exception ex)
 75             {
 76                 //PubLibrary.WriteTxt(ex.Message);
 77             }
 78
 79             return intResult;
 80
 81         }
 82         public static BCSequence CreatSeq(string strFlag, IDataOperator dataOperator)
 83         {
 84             BCSequence BCSeq = null;
 85             try
 86             {
 87                 //PBSSQLServer pbssql = new PBSSQLServer();
 88                 string strSql = string.Format(@"Select Flag,Sequence,Update_Time from HT_Barcode_Sequence where Flag=‘{0}‘",
 89                     strFlag);
 90                 using (DataTable dt = dataOperator.GetDataTable(strSql))
 91                 {
 92                     if (dt != null && dt.Rows.Count > 0)
 93                     {
 94                         int intSequence = DataConvert.DbToInt(dt.Rows[0]["Sequence"]);
 95                         BCSeq = new BCSequence(strFlag, intSequence,dataOperator);
 96                     }
 97                     else
 98                     {
 99                         BCSeq = new BCSequence(strFlag, 0,dataOperator);
100                         if (BCSeq.SaveInfo() <= 0)
101                         {
102                             BCSeq = null;
103                         }
104                     }
105                 }
106             }
107             catch (Exception ex)
108             {
109                 //PubLibrary.WriteTxt(ex.Message);
110             }
111
112             return BCSeq;
113         }
114
115
116     }

    3、管理所有的流水号,客户端要获取流水号需要依靠这个服务

 1  public  class BarcodeSequence:MarshalByRefObject,ISequence
 2     {
 3
 4        public BarcodeSequence()
 5        {
 6
 7        }
 8        /// <summary>
 9        ///
10        /// </summary>
11        /// <param name="strFlag"></param>
12        /// <returns>返回相应标志码的流水号,如果数据库交互出现问题得不到标志码的流水号,或创建不了标志码。则返回-2</returns>
13        public int GetNext(string strFlag)
14        {
15            BCSequence bs = Get(strFlag);
16            if (bs == null)
17            {
18                bs = Creat(strFlag);
19                //将新创建的标志码类放入队列的工作交给创建器
20            }
21            if (bs != null)
22            {
23                return bs.Next;
24            }
25            else  //如果数据库交互出现问题得不到标志码的流水号,或创建不了标志码。则返回-2
26            {
27                return -2;
28            }
29        }
30        /// <summary>
31        /// 标志码生成器
32        /// </summary>
33        /// <param name="strFlag"></param>
34        /// <returns></returns>
35        public BCSequence Creat(string strFlag)
36        {
37            lock (PubLibrary.CreatObj)
38            {
39                BCSequence bs = Get(strFlag);
40                if (bs == null)
41                {
42                    bs= BCSequence.CreatSeq(strFlag,new SQLServer());
43
44                    if (bs != null)
45                    {
46                        PubLibrary.lstSeq.Add(bs);
47                    }
48                }
49                return bs;
50            }
51
52        }
53
54        /// <summary>
55        /// 获取标志码列表中对应的标志码
56        /// </summary>
57        /// <param name="strFlag">要查询的标志码</param>
58        /// <returns></returns>
59        public BCSequence Get(string strFlag)
60        {
61            BCSequence bs = null;
62            foreach (BCSequence bcbs in PubLibrary.lstSeq)
63            {
64                if (bcbs.StrFlag == strFlag)
65                {
66
67                    bs = bcbs;
68                    break;
69                }
70            }
71            return bs;
72        }
73
74     }

    还有一个静态类专门存储现在在使用的一些流水号列表等信息

  1   public class PubLibrary
  2     {
  3
  4         public static object CreatObj=new object();
  5         ///// <summary>
  6         ///// 提供给服务内部的类查询数据使用的SQLServer
  7         ///// </summary>
  8         //public static SQLServer pbsSQL = new SQLServer();
  9
 10         public static List<BCSequence> lstSeq = new List<BCSequence>();
 11
 12         public static void RegistRemotingObject()
 13         {
 14
 15             string strServicename = "";
 16             string strChannelType ="";
 17             int intChannelNo =Convert.ToInt32("");;
 18             string strCallType = "SingleCall";
 19             int intInitialLeaseTime = Convert.ToInt32("");
 20             int intSponsorshipTimeout =Convert.ToInt32("");
 21             int intRenewOnCallTime =Convert.ToInt32("");
 22             string strSeqServicename ="";
 23             string strSeqChannelType = "";
 24             int intSeqChannelNo = Convert.ToInt32("");
 25             string strSeqInfo = "";
 26             string strSeqCallType = "SingleCall";
 27             int intSeqInitialLeaseTime = Convert.ToInt32("");
 28             int intSeqSponsorshipTimeout = Convert.ToInt32("");
 29             int intSeqRenewOnCallTime = Convert.ToInt32("");
 30             try
 31             {
 32                 CreateRemotingObject<SQLServer>(intChannelNo, strCallType, strServicename, strChannelType, intInitialLeaseTime, intSponsorshipTimeout, intRenewOnCallTime);
 33                 PubLibrary.WriteTxt(string.Format("已经注册类型SQLServer {0},{1},{2},{4},{5},{6}",intChannelNo, strCallType, strServicename, strChannelType, intInitialLeaseTime, intSponsorshipTimeout, intRenewOnCallTime ));
 34
 35                 CreateRemotingObject<BarcodeSequence>(intSeqChannelNo, strSeqCallType, strSeqServicename, strSeqChannelType, intSeqInitialLeaseTime, intSeqSponsorshipTimeout, intSeqRenewOnCallTime);
 36                 PubLibrary.WriteTxt(string.Format("已经注册类型BarcodeSequence {0},{1},{2},{4},{5},{6}", intSeqChannelNo, strSeqCallType, strSeqServicename, strSeqChannelType, intSeqInitialLeaseTime, intSeqSponsorshipTimeout, intSeqRenewOnCallTime));
 37
 38             }
 39             catch (Exception ex)
 40             {
 41                 PubLibrary.WriteTxt(ex.Message);
 42             }
 43         }
 44
 45         /// <summary>
 46         /// 清除远程对象
 47         /// </summary>
 48         public static void ClearRemotingObject()
 49         {
 50             try
 51             {
 52              MES.EI.RemotingOperation.UnregisterChannel();
 53             }
 54             catch (Exception ex)
 55             {
 56                 PubLibrary.WriteTxt(ex.Message);
 57             }
 58         }
 59
 60         /// <summary>
 61         /// 以Append的模式往指定的文本文件写入文本信息
 62         /// </summary>
 63         /// <param name="Info" >信息</param>
 64         public static void WriteTxt(string Info)
 65         {
 66             string filename = Service.StartPath + "Error_" + System.DateTime.Now.ToString("yyyyMMdd") + ".txt";
 67
 68             if (filename.Substring(filename.Length - 3).ToUpper() == "TXT")
 69             {
 70                 lock (typeof(PubLibrary))
 71                 {
 72                     System.IO.FileStream s = System.IO.File.Open(filename, System.IO.FileMode.Append);
 73                     System.IO.StreamWriter w = new System.IO.StreamWriter(s);
 74                     w.WriteLine(System.DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss") + ":" + Info);
 75                     w.Close();
 76                 }
 77             }
 78             else
 79             {
 80                 throw new ApplicationException(filename + " isn‘t a txt file.");
 81             }
 82         }
 83         /// <summary>
 84         /// 把相关信息写入事件日志
 85         /// </summary>
 86         /// <param name="Info">信息</param>
 87         /// <param name="type">事件类型</param>
 88         public static void WriteEvent(string Info, System.Diagnostics.EventLogEntryType type)
 89         {
 90             Service.ServiceLog.WriteEntry(Info, type);
 91         }
 92
 93         /// <summary>
 94         /// 根据指定参数创建远程对象
 95         /// </summary>
 96         /// <typeparam name="T">Remoting服务的数据类型</typeparam>
 97         /// <param name="Port">端口</param>
 98         /// <param name="CallType">激活类型</param>
 99         /// <param name="RemotingServerName">远程服务名称</param>
100         /// <param name="ChannelType">通道类型</param>
101         /// <param name="InitialLeaseTime">租约的初始时间</param>
102         /// <param name="SponsorshipTimeout">等待主办方返回租约续订时间的时间</param>
103         /// <param name="RenewOnCallTime">对象重新调用时增加的生存期</param>
104         private static void CreateRemotingObject<T>(int Port, string CallType, string RemotingServerName, string ChannelType,
105             int InitialLeaseTime, int SponsorshipTimeout, int RenewOnCallTime)
106         {
107             try
108             {
109                 RemotingChannelType[] channeltypes = RemotingServerInfo.GetChannelTypeFromString(ChannelType);
110
111                 if (channeltypes != null && channeltypes.Length > 0)
112                 {
113                     RemotingServerInfo remotinginfo = new RemotingServerInfo
114                         (Port, CallType, RemotingServerName, channeltypes);
115
116                     RemotingEventInfo eventinfo = new RemotingEventInfo
117                         (HTPBSService.ServiceLog, System.Diagnostics.EventLogEntryType.Information,
118                         InitialLeaseTime, SponsorshipTimeout, RenewOnCallTime);
119
120                     RemotingOperation.CreateRemotingServerFullDeserialization<T>(remotinginfo, eventinfo);
121                 }
122             }
123             catch (System.Exception ex)
124             {
125                 PubLibrary.WriteTxt(
126                     string.Format("{0}:服务不能启动,因为{1} {2}", DateTime.Now.ToString(), ex.Message, ex.StackTrace));
127             }
128         }
129     }

  第4步:创建客户端

  1 public class SqlSequence :IClientSequence
  2     {
  3         ISequence se;
  4         private string strMachineNo;
  5         private int intChannelNo;
  6         private string strServiceName;
  7         /// <summary>
  8         /// 构造器
  9         /// </summary>
 10         /// <param name="MachineNo">服务器电脑名</param>
 11         /// <param name="ChannelNo">服务端口</param>
 12         /// <param name="ServiceName">服务名</param>
 13         public SqlSequence(string MachineNo, int ChannelNo, string ServiceName)
 14         {
 15             this.strMachineNo = MachineNo;
 16             this.intChannelNo = ChannelNo;
 17             this.strServiceName = ServiceName;
 18         }
 19        /// <summary>
 20        /// 打开到远程服务器的通道
 21        /// </summary>
 22        /// <returns></returns>
 23        public bool OpenRemoting()
 24        {
 25            try
 26            {
 27                RemotingClientInfo clientinfo;
 28                clientinfo = new RemotingClientInfo(strMachineNo,
 29                          intChannelNo,
 30                         strServiceName,
 31                         RemotingChannelType.Tcp);
 32                GetRemotingVoucher(ref clientinfo);
 33                se = RemotingOperation.CreateRemotingClient<ISequence>(clientinfo);
 34
 35                return true;
 36            }
 37            catch (Exception ex)
 38            {
 39                //PubLibrary.WriteTxt(ex.Message);
 40                return false;
 41            }
 42        }
 43
 44
 45        public bool GetNext(string strFlag, out int index, ref string strError)
 46        {
 47            bool blResult = false;
 48             index = -1;
 49             try
 50             {
 51                 index = se.GetNext(strFlag);
 52                 if (index != -1)
 53                 {
 54                     blResult = true;
 55                 }
 56                 else
 57                 {
 58                     strError = "服务端出现错误无法获取流水号";
 59                 }
 60             }
 61             catch (Exception ex)
 62             {
 63
 64                 if (ex.Message.Contains("由于目标计算机积极拒绝"))
 65                 {
 66
 67                     string strName = System.Net.Dns.GetHostEntry(ex.Message.Split(‘ ‘)[1].Split(‘:‘)[0]).HostName.Split(‘.‘)[0];
 68                     strError = "由于服务器[" + strName + "]上的喷码服务已停止\r\n\r\n暂时无法喷印,请联系管理员开启喷码服务";
 69                 }
 70                 else
 71                 {
 72                     strError = ex.Message;
 73                 }
 74
 75             }
 76            return blResult;
 77        }
 78        /// <summary>
 79        /// 指定远程连接时客户端信息
 80        /// </summary>
 81        /// <param name="clientinfo"></param>
 82        private void GetRemotingVoucher(ref RemotingClientInfo clientinfo)
 83        {
 84            //clientinfo.IsTrusty = true;
 85            //if (!clientinfo.IsTrusty)
 86            //{
 87            clientinfo.IsTrusty = false;
 88            clientinfo.UserName = "BMES";
 89            clientinfo.Password = "Battery123";
 90            clientinfo.Domain = "";
 91            //}
 92        }
 93
 94        /// <summary>
 95        /// 关闭远程通道
 96        /// </summary>
 97        public void CloseRemoting()
 98        {
 99
100            RemotingOperation.UnregisterChannel();
101
102            se = null;
103        }
104     }

  第5步:测试   

 1 SqlSequence BSeq = new SqlSequence(strSeqMachineName, intSeqChannel, strSeqServerName);
 2
 3     string strFlag ="";
 4
 5     int index = 0;
 6
 7    if( BSeq.GetNext(strFlag, out index, ref strError))
 8
 9          {
10
11             //成功
12
13       }
14
15         else
16
17         {
18
19             //失败
20
21       }

  

    

时间: 2024-08-02 16:45:43

流水号获取的解决方案的相关文章

依附大系统 【数据实时获取】解决方案

最近公司作为众多外部厂商之一,需要依托一个大型平台系统( 这里简称为Big-S) 给特定用户提供一些服务. 作为外部厂商开发的 Web 应用(这里简称 Small-S),需要提取 Big-S 中的基础数据,包括用户.组织结构.代码表......部分字段到本地数据表中. 融合 Small-S 自己特点,作为搭建 Small-S Web 项目的先决条件. Small-S 需要做到和 Big-S 的重点基础数据实时一致, 重点关注 Big-S 数据交互方面的以下特性. 1. Big-S 提供给外部厂商

javascript获取wx.config内部字段解决微信分享

转自:http://www.jb51.net/article/80679.htm 专题推荐:js微信开发_脚本之家 http://www.jb51.net/Special/879.htm 背景在微信分享开发的时候我们通常的流程是 <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourAppSecret"); $signPackage = $jssdk->

JavaScript获取URL参数方法总汇

现在做页面基本都用AJAX,因此导致操作很麻烦,每次都需要通过JS获取url中的参数值,网上所搜到很多资料,没一次能记住的,也不知道在哪个项目中使用过,现在又需要通过JS获取url参数,因此不能在偷懒了,为了方便自己也得做个资料总汇,不然每次都得找费事费力的,得不偿失.下边就列出老外所有通过JS获取url参数的方法(不断更新): 1.http://stackoverflow.com/questions/1403888/get-url-parameter-with-jquery 2.http://

安装WebLogic失败,出现”[VALIDATION] [ERROR]:INST-07004: Oracle 主目录(O) 位置包含一个或多个无效字符“解决方案

题如图 解决方案: 在管理员cmd窗口定位到jdk bin目录,然后输入以下命令 java -jar F:\java\fmw_12.2.1.3.0_wls_quick_Disk1_1of1\fmw_12.2.1.3.0_wls_quick.jar ORACLE_HOME=C:\ProgramFiles\Oracle1“ORACLE_HOME=”后输入的路径为你Oracle根路径 “F:\java\fmw_12.2.1.3.0_wls_quick_Disk1_1of1\fmw_12.2.1.3.0

Parameter &#39;email&#39; not found. Available parameters are [0, 1, param1, param2]解决方案

转自:https://blog.csdn.net/wdehxiang/article/details/77619569 原因: 传入多个值时,mybatis会自动将这些值转成类似map形式的值,以0,1,2…的序列为keyName. 这里我们需要先简单了解一下mybatis的传值机制.Mybatis现在可以使用的parameterType有基本类型和Java负责类型 基本数据类型:包含int,String,Date等.基本数据类型作为传参,只能传入一个.通过#{参数名}获取. 复杂数据类型:包含

TwinklingRefreshLayout 小而强大的刷新控件,自带顺滑的越界回弹,v1.04 版精心重构,完美发布啦!

TwinklingRefreshLayout v1.04 版精心重构,优化 UI.刷新及越界动画效果,修复众多 bug,完美发布! TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性.其主要特性有: 支持RecyclerView.ScrollView.AbsListView系列(ListView.GridView).WebView以及其它可

该伙伴事务管理器已经禁止了它对远程/网络事务的支持

原文地址 简介 当启动分布式的事务涉及 SQL Server 数据库引擎时,需要针对MSDTC进行一些配置.否则可能会出现以下错误:合作伙伴事务管理器已经禁用对远程/网络事务的支持. 解决方案 1.       双方启动MSDTC服务,方式为:命令行下service.msc,选择distributed link trackingclient ,右键启动,并且,右键->属性->启动类型改为手动. 2.       对dtc进行手动设置,方式如下:控制面板->管理工具->在[组件服务]

Visual Studio 下nuget命令的使用

从Visual Studio 2012版本开始默认集成了Nuget扩展,在Visual Studio 2010或以下的版本需要单独安装,安装方法如下: 1. "工具"→"扩展和更新...",弹出扩展管理面板 2. 左侧选择"联机",右侧搜索框输入"nuget",搜索可以点击安装,安装完成可能要重新启动Visual Studio 由于我这里使用的是Visual Studio 2015,因此跳过安装,这里主要是nuget命令使用的

angularJS directive详解

前言 最近学习了下angularjs指令的相关知识,也参考了前人的一些文章,在此总结下. 欢迎批评指出错误的地方. Angularjs指令定义的API AngularJs的指令定义大致如下 angular.module("app",[]).directive("directiveName",function(){     return{      //通过设置项来定义     }; }) 其中return返回的对象包含很多参数,下面一一说明 1.restrict (