首页 > 代码库 > 流水号获取的解决方案

流水号获取的解决方案

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

解决方案一

  在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     }
View Code

    2、流水号的接口

1   public interface ISequence2     {3         int GetNext(string strFlag);4     }
View Code

 第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             else108             {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                         try133                         {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                             try145                             {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                         finally161                         {162                             conn.Close();163                         }164 165                     }166                   167                 }168             }169             else170             {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             try185             {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             finally203             {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             try218             {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             finally236             { 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             try254             {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             finally279             {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             try298             {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             finally321             {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             try336             {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             finally354             {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             try370             {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             try400             {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             try439             {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             finally462             {463                464             }465             return dt;466         }467 468        469     }
View Code

    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     }
View Code

    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  //如果数据库交互出现问题得不到标志码的流水号,或创建不了标志码。则返回-226            {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     }
View Code

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

  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             try108             {109                 RemotingChannelType[] channeltypes = RemotingServerInfo.GetChannelTypeFromString(ChannelType);110 111                 if (channeltypes != null && channeltypes.Length > 0)112                 {113                     RemotingServerInfo remotinginfo = new RemotingServerInfo114                         (Port, CallType, RemotingServerName, channeltypes);115 116                     RemotingEventInfo eventinfo = new RemotingEventInfo117                         (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     }
View Code

  第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     }
View Code

  第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         else16 17         {18 19             //失败20 21       }
View Code

 

  

 

    

流水号获取的解决方案