编写OracleMembershipProvider,让SharePoint2007使用Oralce中的用户数据实现Form验证。 (第四天)
继续完善代码,以下代码与之前的比较多了如下特性:
* 所有属性均可在web.config中配置
* 数据库操作异常写入日志
* 多了一个LogTools类,用于日志相关操作
* 自定义多个属性增加灵活性,比如可以用任意表名,
* 确定了表结构,并给出Oracle下的表创建语句( 使用本语句需要做简单修改,替换用户和表空间名)
(因为调试部署费时,所以代码均未经过测试,待代码编写完整后再测试)
随着编写的深入,从起初的只想学习一下MemshipProvider知识,变成了现在的要写一个实用的OracleMemshipProvider,这一切离不开关注本blog的朋友们,希望有兴趣的朋友参与进来,编写出基于其他数据库平台的MemshipProvider。比如:MySQLMemshipProvider等。
* 所有属性均可在web.config中配置
* 数据库操作异常写入日志
* 多了一个LogTools类,用于日志相关操作
* 自定义多个属性增加灵活性,比如可以用任意表名,
* 确定了表结构,并给出Oracle下的表创建语句( 使用本语句需要做简单修改,替换用户和表空间名)
(因为调试部署费时,所以代码均未经过测试,待代码编写完整后再测试)
OracleMembershipProvider
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web;
5using System.Web.Security;
6using System.Data;
7using System.Data.OleDb;
8using System.Collections;
9using System.Configuration;
10
11/**//*表创建语句 (创建于:Oracle 8i)
12 CREATE TABLE "ANTUUSER"."SHAREPOINTUSERS"("PKID" VARCHAR2(50)
13 NOT NULL, "USERNAME" VARCHAR2(255) NOT NULL, "APPLICATIONNAME"
14 VARCHAR2(255) NOT NULL, "EMAIL" VARCHAR2(128) NOT NULL,
15 "COMMENT" VARCHAR2(255) NOT NULL, "PASSWORD" VARCHAR2(128) NOT
16 NULL, "PASSWORDQUESTION" VARCHAR2(255) NOT NULL,
17 "PASSWORDANSWER" VARCHAR2(255) NOT NULL, "ISAPPROVED" NUMBER(1)
18 NOT NULL, "LASTACTIVITYDATE" DATE NOT NULL, "LASTLOGINDATE" DATE
19 NOT NULL, "LASTPASSWORDCHANGEDATE" DATE NOT NULL, "CREATIONDATE"
20 DATE NOT NULL, "ISONLINE" NUMBER(1) NOT NULL, "ISLOCKEDOUT"
21 NUMBER(1) NOT NULL, "LASTLOCKEDOUTDATE" DATE NOT NULL,
22 "FAILEDPWDATTEMPTCOUNT" NUMBER(5) NOT NULL,
23 "FAILEDPWDATTEMPTWINSTART" DATE NOT NULL,
24 "FAILEDPWDANSWERATTEMPTCOUNT" NUMBER(5) NOT NULL,
25 "FAILEDPWDANSWERATTEMPTWINSTART" DATE NOT NULL)
26 */
27namespace BoooLee
28{
29 public class OracleMembershipProvider : MembershipProvider
30 {
31 //OracleTools
32 private OracleTools OT = null;
33
34 //自定义属性
35 private string _UsersTableName;
36 //Oracle数据库连接串
37 private string _ConnectionString;
38 //是否允许事件日志
39 private bool _EnableEventLog;
40
41 //MembershipProvider接口属性,用于存放config.web中的MembershipProvider配置属性。
42 //使用自定义成员资格提供程序的应用程序的名称。
43 private string _ApplicationName;
44 //指示成员资格提供程序是否配置为允许用户重置其密码。
45 private bool _EnablePasswordReset;
46 //指示成员资格提供程序是否配置为允许用户检索其密码。
47 private bool _EnablePasswordRetrieval;
48 //获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
49 private int _MaxInvalidPasswordAttempts;
50 //获取有效密码中必须包含的最少特殊字符数。
51 private int _MinRequireNonAlphanumericCharacters;
52 //获取密码所要求的最小长度。
53 private int _MinRequiredPasswordLength;
54 //获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
55 private int _PasswordAttemptWindow;
56 //获取一个值,该值指示在成员资格数据存储区中存储密码的格式。
57 private MembershipPasswordFormat _PasswordFormat;
58 //获取用于计算密码的正则表达式。
59 private string _PasswordStrengthRegularExpression;
60 //获取一个值,该值指示成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。
61 private bool _RequiresQuestionAndAnswer;
62 //获取一个值,指示成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。
63 private bool _RequiresUniqueEmail;
64
65 /**//*
66 摘要:
67 初始化提供程序。
68
69 参数:
70 config: 名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。
71 name: 该提供程序的友好名称。
72 */
73 public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
74 {
75 base.Initialize(name, config);
76
77 //读取MembershipProvider接口属性配置
78 _ApplicationName = GetConfigValue(config["ConnectionString"],System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
79 _EnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["EnablePasswordReset"], "false"));
80 _EnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["EnablePasswordRetrieval"], "false"));
81 _MaxInvalidPasswordAttempts=Convert.ToInt32(GetConfigValue(config["MaxInvalidPasswordAttempts"],"5");
82 _MinRequireNonAlphanumericCharacters=Convert.ToInt32(GetConfigValue(config["MinRequiredNonAlphanumericCharacters"],"1");
83 _MinRequiredPasswordLength=Convert.ToInt32(GetConfigValue(config["MinRequiredPasswordLength"],"7");
84 _PasswordAttemptWindow=Convert.ToInt32(GetConfigValue(config["PasswordAttemptWindow"],"10");
85 _PasswordFormat=(MembershipPasswordFormat)GetConfigValue(config["PasswordFormat"],MembershipPasswordFormat.Clear);
86 _PasswordStrengthRegularExpression=GetConfigValue(config["PasswordStrengthRegularExpression"],""));
87 _RequiresQuestionAndAnswer=Convert.ToBoolean(GetConfigValue(config["RequiresQuestionAndAnswer"],"false"));
88 _RequiresUniqueEmail=Convert.ToBoolean(GetConfigValue(config["RequiresUniqueEmail"],"true"));
89
90 //读取自定义属性
91 ConnectionStringSettings ConnectionStringSetting=ConfigurationManager.ConnectionStrings[config["ConnectionString"]];
92 _ConnectionString=ConnectionStringSetting.ConnectionString;
93 _UsersTableName=GetConfigValue(config["UsersTableName"],"SHAREPOINTUSERS");
94 _EnableEventLog=Convert.ToBoolean(GetConfigValue(config["EnableEventLog"],"true"];
95 //初始化OT
96 OT = new OracleTools();
97 OT.ConnectionString = _ConnectionString;
98
99 //为OT分配日志记录器
100 LogTools lt = new LogTools();
101 lt.EventLog = "Application";
102 lt.EventSource = "OracleMembershipProvider";
103 OT.LogTool = lt;
104 OT.EnableEventlog=_EnableEventLog;
105 }
106
107 /**//*
108 摘要:
109 使用自定义成员资格提供程序的应用程序的名称。
110
111 返回值:
112 使用自定义成员资格提供程序的应用程序的名称。
113 */
114 public override string ApplicationName
115 {
116 get
117 {
118 return _ApplicationName;
119 }
120 set
121 {
122 ;
123 }
124 }
125
126 /**//*
127 摘要:
128 处理更新成员资格用户密码的请求。
129
130 参数:
131 newPassword: 指定的用户的新密码。
132 oldPassword: 指定的用户的当前密码。
133 username: 为其更新密码的用户。
134
135 返回值:
136 如果密码更新成功,则为 true;否则为 false。
137 */
138 public override bool ChangePassword(string username, string oldPassword, string newPassword)
139 {
140 string SqlString = "";
141
142 //更改用户密码
143 if (UserExist(username,oldPassword)>0)
144 {
145 SqlString = string.Format("update {0} set password={1} where username='{2}' and password='{3}'",_TableName, newPassword, username, oldPassword);
146 return OT.RunSqlNonQuery(SqlString);
147 }
148
149 return false;
150 }
151
152 /**//*
153 摘要:
154 处理更新成员资格用户的密码提示问题和答案的请求。
155
156 参数:
157 newPasswordQuestion: 指定的用户的新密码提示问题。
158 newPasswordAnswer: 指定的用户的新密码提示问题答案。
159 username: 要为其更改密码提示问题和答案的用户。
160 password: 指定的用户的密码。
161
162 返回值:
163 如果成功更新密码提示问题和答案,则为 true;否则,为 false。
164 */
165 public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
166 {
167 string SqlString = "";
168
169 //更改用户密码问题和密码答案
170 if (UserExist(username,password)>0)
171 {
172 SqlString = string.Format("update {0} set question={1} , answer={2} where username='{3}' and password='{4}'", _TableName,newPasswordQuestion, newPasswordAnswer, username, password);
173 return OT.RunSqlNonQuery(SqlString);
174 }
175
176 return false;
177 }
178
179 /**//*
180 摘要:
181 将新的成员资格用户添加到数据源。
182
183 参数:
184 isApproved: 是否允许验证新用户。
185 passwordAnswer: 新用户的密码提示问题答案。
186 username: 新用户的用户名。
187 providerUserKey: 成员资格数据源中该用户的唯一标识符。
188 password: 新用户的密码。
189 passwordQuestion: 新用户的密码提示问题。
190 email: 新用户的电子邮件地址。
191 status: 一个 System.Web.Security.MembershipCreateStatus 枚举值,指示是否已成功创建用户。
192
193 返回值:
194 一个用新创建的用户的信息填充的 System.Web.Security.MembershipUser 对象。
195 */
196 public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
197 {
198 //TODO 实现创建用户代码
199 throw new Exception("The method or operation is not implemented.");
200 }
201
202 /**//*
203 摘要:
204 从成员资格数据源删除一个用户。
205
206 参数:
207 username: 要删除的用户的名称。
208 deleteAllRelatedData: 如果为 true,则从数据库中删除与该用户相关的数据;如果为 false,则将与该用户相关的数据保留在数据库。
209
210 返回值:
211 如果用户被成功删除,则为 true;否则为 false。
212 */
213 public override bool DeleteUser(string username, bool deleteAllRelatedData)
214 {
215 string SqlString = "";
216
217 //删除用户
218 if (UserExist(username)>0)
219 {
220 SqlString = string.Format("delete from {0} where username='{1}'",_TableName, username);
221 return OT.RunSqlNonQuery(SqlString);
222 }
223
224 return false;
225 }
226
227 /**//*
228 摘要:
229 指示成员资格提供程序是否配置为允许用户重置其密码。
230
231 返回值:
232 如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认为 true。
233 */
234 public override bool EnablePasswordReset
235 {
236 get
237 {
238 return _EnablePasswordReset;
239 }
240 }
241
242 /**//*
243 摘要:
244 指示成员资格提供程序是否配置为允许用户检索其密码。
245
246 返回值:
247 如果成员资格提供程序配置为支持密码检索,则为 true,否则为 false。默认为 false。
248 */
249 public override bool EnablePasswordRetrieval
250 {
251 get
252 {
253 return _EnablePasswordRetrieval;
254 }
255 }
256
257 /**//*
258 摘要:
259 获取一个成员资格用户的集合,这些用户的电子邮件地址包含要匹配的指定电子邮件地址。
260
261 参数:
262 totalRecords: 匹配用户的总数。
263 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
264 emailToMatch: 要搜索的电子邮件地址。
265 pageSize: 要返回的结果页的大小。
266
267 返回值:
268 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
269 */
270 public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
271 {
272 string SqlString = "";
273 MembershipUserCollection muc = new MembershipUserCollection();
274 totalRecords = UserExistByMail(emailToMatch);
275 if (totalRecords>0)
276 {
277 SqlString = string.Format("select * from {0} where email='{1}'", _TableName,emailToMatch);
278 muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
279 }
280 return muc;
281 }
282
283 /**//*
284 摘要:
285 获取一个成员资格用户的集合,这些用户的用户名包含要匹配的指定用户名。
286
287 参数:
288 totalRecords: 匹配用户的总数。
289 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
290 usernameToMatch: 要搜索的用户名。
291 pageSize: 要返回的结果页的大小。
292
293 返回值:
294 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
295 */
296 public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
297 {
298 string SqlString = "";
299 MembershipUserCollection muc = new MembershipUserCollection();
300 totalRecords = UserExist(usernameToMatch);
301 if (totalRecords > 0)
302 {
303 SqlString = string.Format("select * from {0} where username='{1}'", _TableName,usernameToMatch);
304 muc=ToMembershipUserCollection( OT.RunSqlDataTable(SqlString));
305 }
306 return muc;
307 }
308
309 /**//*
310 摘要:
311 获取数据源中的所有用户的集合,并显示在数据页中。
312
313 参数:
314 totalRecords: 匹配用户的总数。
315 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
316 pageSize: 要返回的结果页的大小。
317
318 返回值:
319 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
320 */
321 public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
322 {
323 string SqlString = "";
324 MembershipUserCollection muc = new MembershipUserCollection();
325 totalRecords = UsersTotalRecords();
326 if (totalRecords > 0)
327 {
328 SqlString =string.Format( "select * from {0}",_TableName);
329 muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
330 }
331 return muc;
332 }
333
334 /**//*
335 摘要:
336 获取当前访问该应用程序的用户数。
337
338 返回值:
339 当前访问该应用程序的用户数。
340 */
341 public override int GetNumberOfUsersOnline()
342 {
343 //TODO 获取在线人数
344 throw new Exception("The method or operation is not implemented.");
345 }
346
347 /**//*
348 摘要:
349 从数据源获取指定用户名所对应的密码。
350
351 参数:
352 username: 为其检索密码的用户。
353 answer: 用户的密码提示问题答案。
354
355 返回值:
356 指定用户名所对应的密码。
357 */
358 public override string GetPassword(string username, string answer)
359 {
360 string SqlString = "";
361 string password="";
362 if (UserExist(username) > 0)
363 {
364 SqlString = string.Format("select password from {0} where username='{1}' and answer='{2}'", _TableName,username, answer);
365 password = OT.RunSqlScalar(SqlString);
366 }
367 return password;
368 }
369
370 /**//*
371 摘要:
372 从数据源获取用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
373
374 参数:
375 username: 要获取其信息的用户名。
376 userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
377
378 返回值:
379 用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
380 */
381 public override MembershipUser GetUser(string username, bool userIsOnline)
382 {
383 string SqlString = "";
384 MembershipUser mu = null;
385
386 if (UserExist(username) > 0)
387 {
388 SqlString = string.Format("select * from {0} where username='{1}'", _TableName,username);
389 mu=ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
390 }
391
392 return mu;
393 }
394
395 /**//*
396 摘要:
397 根据成员资格用户的唯一标识符从数据源获取该用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
398
399 参数:
400 providerUserKey: 要获取其信息的成员资格用户的唯一标识符。
401 userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
402
403 返回值:
404 用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
405 */
406 public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
407 {
408 string SqlString = "";
409 MembershipUser mu = new MembershipUser();
410
411 if (UserExist(username) > 0)
412 {
413 SqlString = string.Format("select * from {0} where provideruserkey='{1}'", _TableName,providerUserKey.ToString());
414 mu = ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
415 }
416
417 return mu;
418 }
419
420 public override string GetUserNameByEmail(string email)
421 {
422 throw new Exception("The method or operation is not implemented.");
423 }
424
425 public override int MaxInvalidPasswordAttempts
426 {
427 get
428 {
429 return _MaxInvalidPasswordAttempts;
430 }
431 }
432
433 public override int MinRequiredNonAlphanumericCharacters
434 {
435 get
436 {
437 return _MinRequireNonAlphanumericCharacters;
438 }
439
440 }
441
442 public override int MinRequiredPasswordLength
443 {
444 get
445 {
446 return _MinRequiredPasswordLength;
447 }
448 }
449
450 public override int PasswordAttemptWindow
451 {
452 get
453 {
454 return _PasswordAttemptWindow;
455 }
456 }
457
458 public override MembershipPasswordFormat PasswordFormat
459 {
460 get
461 {
462 return _PasswordFormat;
463 }
464 }
465
466 public override string PasswordStrengthRegularExpression
467 {
468 get
469 {
470 return PasswordStrengthRegularExpression;
471 }
472 }
473
474 public override bool RequiresQuestionAndAnswer
475 {
476 get
477 {
478 return RequiresQuestionAndAnswer;
479 }
480 }
481
482 public override bool RequiresUniqueEmail
483 {
484 get
485 {
486 return RequiresUniqueEmail;
487 }
488 }
489
490 public override string ResetPassword(string username, string answer)
491 {
492 throw new Exception("The method or operation is not implemented.");
493 }
494
495 public override bool UnlockUser(string userName)
496 {
497 throw new Exception("The method or operation is not implemented.");
498 }
499
500 public override void UpdateUser(MembershipUser user)
501 {
502 throw new Exception("The method or operation is not implemented.");
503 }
504
505 public override bool ValidateUser(string username, string password)
506 {
507 throw new Exception("The method or operation is not implemented.");
508 }
509
510非MembershipProvider成员#region 非MembershipProvider成员
511
512 /**//*
513 摘要:
514 判断用户是否存在
515
516 参数:
517 username:用户名
518
519 返回值:
520 找到用户返回true,没有找到用户false
521 */
522 private int UserExist(string username)
523 {
524 string SqlString = "";
525 string r = "";
526 int Count = 0;
527
528 SqlString = string.Format("select count(*) from {0} where username='{1}'", _TableName,username);
529 r = OT.RunSqlScalar(SqlString);
530 try
531 {
532 Count = int.Parse(r);
533 }
534 catch (Exception)
535 {
536 Count = 0;
537 }
538
539 return Count;
540 }
541
542 /**//*
543 摘要:
544 判断用户是否存在
545
546 参数:
547 username:用户名
548 password:用户密码
549
550 返回值:
551 找到用户的用户数。
552 */
553 private int UserExist(string username, string password)
554 {
555 string SqlString = "";
556 string r = "";
557 int Count = 0;
558
559 SqlString = string.Format("select count(*) from {0} where username='{1}' and password='{2}'",_TableName, username,password);
560 r = OT.RunSqlScalar(SqlString);
561 try
562 {
563 Count = int.Parse(r);
564 }
565 catch (Exception)
566 {
567 Count = 0;
568 }
569
570 return Count;
571 }
572
573 /**//*
574 摘要:
575 判断用户是否存在
576
577 参数:
578 email:用户名
579
580 返回值:
581 找到用户的用户数。
582 */
583 private int UserExistByMail(string email)
584 {
585 string SqlString = "";
586 string r = "";
587 int Count = 0;
588
589 SqlString = string.Format("select count(*) from {0} where email='{1}'", _TableName,email);
590 r = OT.RunSqlScalar(SqlString);
591 try
592 {
593 Count = int.Parse(r);
594 }
595 catch (Exception)
596 {
597 Count = 0;
598 }
599
600 return Count;
601 }
602
603 /**//*
604 摘要:
605 转换用户数据表为MembershipUserCollection
606
607 参数:
608 userstable:用户表
609
610 返回值:
611 返回包含用户数据的MembershipUserCollection。
612 */
613 private MembershipUserCollection ToMembershipUserCollection(DataTable userstable)
614 {
615 MembershipUserCollection muc = new MembershipUserCollection();
616
617 foreach (DataRow dr in userstable.Rows)
618 {
619 muc.Add(ToMembershipUser(dr));
620 }
621
622 return muc;
623 }
624
625 /**//*
626 摘要:
627 获得用户总数
628
629 返回值:
630 返回用户数。
631 */
632 private int UsersTotalRecords()
633 {
634 string SqlString = "";
635 string r = "";
636 int Count = 0;
637
638 SqlString = string.Format("select count(*) from {0}",_TableName);
639 r = OT.RunSqlScalar(SqlString);
640 try
641 {
642 Count = int.Parse(r);
643 }
644 catch (Exception)
645 {
646 Count = 0;
647 }
648
649 return Count;
650 }
651
652 /**//*
653 摘要:
654 转换用户数据表为MembershipUserCollection
655
656 参数:
657 usersrecord:用户记录
658
659 返回值:
660 返回包含用户数据的MembershipUser。
661 */
662 private MembershipUser ToMembershipUser(DataRow usersrecord)
663 {
664 MembershipUser mu = new MembershipUser();
665 try
666 {
667 mu.UserName = usersrecord["username"];
668 mu.Email = usersrecord["email"];
669 mu.PasswordQuestion = usersrecord["question"];
670 }
671 catch (Exception)
672 {
673 }
674 return mu;
675 }
676
677 /**//*
678 摘要:
679 获取配置文件
680
681 参数:
682 ConfigValue:配置文件中的参数设置
683 DefaultValue:缺省值
684
685 返回值:
686 如果ConfigValue值有效则返回ConfigValue,否则返回DefaultValue。
687 */
688 private string GetConfigValue(string ConfigValue, string DefaultValue)
689 {
690 if (string.IsNullOrEmpty(ConfigValue))
691 return DefaultValue;
692 return ConfigValue;
693 }
694#endregion
695
696 }
697}
698
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web;
5using System.Web.Security;
6using System.Data;
7using System.Data.OleDb;
8using System.Collections;
9using System.Configuration;
10
11/**//*表创建语句 (创建于:Oracle 8i)
12 CREATE TABLE "ANTUUSER"."SHAREPOINTUSERS"("PKID" VARCHAR2(50)
13 NOT NULL, "USERNAME" VARCHAR2(255) NOT NULL, "APPLICATIONNAME"
14 VARCHAR2(255) NOT NULL, "EMAIL" VARCHAR2(128) NOT NULL,
15 "COMMENT" VARCHAR2(255) NOT NULL, "PASSWORD" VARCHAR2(128) NOT
16 NULL, "PASSWORDQUESTION" VARCHAR2(255) NOT NULL,
17 "PASSWORDANSWER" VARCHAR2(255) NOT NULL, "ISAPPROVED" NUMBER(1)
18 NOT NULL, "LASTACTIVITYDATE" DATE NOT NULL, "LASTLOGINDATE" DATE
19 NOT NULL, "LASTPASSWORDCHANGEDATE" DATE NOT NULL, "CREATIONDATE"
20 DATE NOT NULL, "ISONLINE" NUMBER(1) NOT NULL, "ISLOCKEDOUT"
21 NUMBER(1) NOT NULL, "LASTLOCKEDOUTDATE" DATE NOT NULL,
22 "FAILEDPWDATTEMPTCOUNT" NUMBER(5) NOT NULL,
23 "FAILEDPWDATTEMPTWINSTART" DATE NOT NULL,
24 "FAILEDPWDANSWERATTEMPTCOUNT" NUMBER(5) NOT NULL,
25 "FAILEDPWDANSWERATTEMPTWINSTART" DATE NOT NULL)
26 */
27namespace BoooLee
28{
29 public class OracleMembershipProvider : MembershipProvider
30 {
31 //OracleTools
32 private OracleTools OT = null;
33
34 //自定义属性
35 private string _UsersTableName;
36 //Oracle数据库连接串
37 private string _ConnectionString;
38 //是否允许事件日志
39 private bool _EnableEventLog;
40
41 //MembershipProvider接口属性,用于存放config.web中的MembershipProvider配置属性。
42 //使用自定义成员资格提供程序的应用程序的名称。
43 private string _ApplicationName;
44 //指示成员资格提供程序是否配置为允许用户重置其密码。
45 private bool _EnablePasswordReset;
46 //指示成员资格提供程序是否配置为允许用户检索其密码。
47 private bool _EnablePasswordRetrieval;
48 //获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
49 private int _MaxInvalidPasswordAttempts;
50 //获取有效密码中必须包含的最少特殊字符数。
51 private int _MinRequireNonAlphanumericCharacters;
52 //获取密码所要求的最小长度。
53 private int _MinRequiredPasswordLength;
54 //获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
55 private int _PasswordAttemptWindow;
56 //获取一个值,该值指示在成员资格数据存储区中存储密码的格式。
57 private MembershipPasswordFormat _PasswordFormat;
58 //获取用于计算密码的正则表达式。
59 private string _PasswordStrengthRegularExpression;
60 //获取一个值,该值指示成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。
61 private bool _RequiresQuestionAndAnswer;
62 //获取一个值,指示成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。
63 private bool _RequiresUniqueEmail;
64
65 /**//*
66 摘要:
67 初始化提供程序。
68
69 参数:
70 config: 名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。
71 name: 该提供程序的友好名称。
72 */
73 public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
74 {
75 base.Initialize(name, config);
76
77 //读取MembershipProvider接口属性配置
78 _ApplicationName = GetConfigValue(config["ConnectionString"],System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
79 _EnablePasswordReset = Convert.ToBoolean(GetConfigValue(config["EnablePasswordReset"], "false"));
80 _EnablePasswordRetrieval = Convert.ToBoolean(GetConfigValue(config["EnablePasswordRetrieval"], "false"));
81 _MaxInvalidPasswordAttempts=Convert.ToInt32(GetConfigValue(config["MaxInvalidPasswordAttempts"],"5");
82 _MinRequireNonAlphanumericCharacters=Convert.ToInt32(GetConfigValue(config["MinRequiredNonAlphanumericCharacters"],"1");
83 _MinRequiredPasswordLength=Convert.ToInt32(GetConfigValue(config["MinRequiredPasswordLength"],"7");
84 _PasswordAttemptWindow=Convert.ToInt32(GetConfigValue(config["PasswordAttemptWindow"],"10");
85 _PasswordFormat=(MembershipPasswordFormat)GetConfigValue(config["PasswordFormat"],MembershipPasswordFormat.Clear);
86 _PasswordStrengthRegularExpression=GetConfigValue(config["PasswordStrengthRegularExpression"],""));
87 _RequiresQuestionAndAnswer=Convert.ToBoolean(GetConfigValue(config["RequiresQuestionAndAnswer"],"false"));
88 _RequiresUniqueEmail=Convert.ToBoolean(GetConfigValue(config["RequiresUniqueEmail"],"true"));
89
90 //读取自定义属性
91 ConnectionStringSettings ConnectionStringSetting=ConfigurationManager.ConnectionStrings[config["ConnectionString"]];
92 _ConnectionString=ConnectionStringSetting.ConnectionString;
93 _UsersTableName=GetConfigValue(config["UsersTableName"],"SHAREPOINTUSERS");
94 _EnableEventLog=Convert.ToBoolean(GetConfigValue(config["EnableEventLog"],"true"];
95 //初始化OT
96 OT = new OracleTools();
97 OT.ConnectionString = _ConnectionString;
98
99 //为OT分配日志记录器
100 LogTools lt = new LogTools();
101 lt.EventLog = "Application";
102 lt.EventSource = "OracleMembershipProvider";
103 OT.LogTool = lt;
104 OT.EnableEventlog=_EnableEventLog;
105 }
106
107 /**//*
108 摘要:
109 使用自定义成员资格提供程序的应用程序的名称。
110
111 返回值:
112 使用自定义成员资格提供程序的应用程序的名称。
113 */
114 public override string ApplicationName
115 {
116 get
117 {
118 return _ApplicationName;
119 }
120 set
121 {
122 ;
123 }
124 }
125
126 /**//*
127 摘要:
128 处理更新成员资格用户密码的请求。
129
130 参数:
131 newPassword: 指定的用户的新密码。
132 oldPassword: 指定的用户的当前密码。
133 username: 为其更新密码的用户。
134
135 返回值:
136 如果密码更新成功,则为 true;否则为 false。
137 */
138 public override bool ChangePassword(string username, string oldPassword, string newPassword)
139 {
140 string SqlString = "";
141
142 //更改用户密码
143 if (UserExist(username,oldPassword)>0)
144 {
145 SqlString = string.Format("update {0} set password={1} where username='{2}' and password='{3}'",_TableName, newPassword, username, oldPassword);
146 return OT.RunSqlNonQuery(SqlString);
147 }
148
149 return false;
150 }
151
152 /**//*
153 摘要:
154 处理更新成员资格用户的密码提示问题和答案的请求。
155
156 参数:
157 newPasswordQuestion: 指定的用户的新密码提示问题。
158 newPasswordAnswer: 指定的用户的新密码提示问题答案。
159 username: 要为其更改密码提示问题和答案的用户。
160 password: 指定的用户的密码。
161
162 返回值:
163 如果成功更新密码提示问题和答案,则为 true;否则,为 false。
164 */
165 public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
166 {
167 string SqlString = "";
168
169 //更改用户密码问题和密码答案
170 if (UserExist(username,password)>0)
171 {
172 SqlString = string.Format("update {0} set question={1} , answer={2} where username='{3}' and password='{4}'", _TableName,newPasswordQuestion, newPasswordAnswer, username, password);
173 return OT.RunSqlNonQuery(SqlString);
174 }
175
176 return false;
177 }
178
179 /**//*
180 摘要:
181 将新的成员资格用户添加到数据源。
182
183 参数:
184 isApproved: 是否允许验证新用户。
185 passwordAnswer: 新用户的密码提示问题答案。
186 username: 新用户的用户名。
187 providerUserKey: 成员资格数据源中该用户的唯一标识符。
188 password: 新用户的密码。
189 passwordQuestion: 新用户的密码提示问题。
190 email: 新用户的电子邮件地址。
191 status: 一个 System.Web.Security.MembershipCreateStatus 枚举值,指示是否已成功创建用户。
192
193 返回值:
194 一个用新创建的用户的信息填充的 System.Web.Security.MembershipUser 对象。
195 */
196 public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
197 {
198 //TODO 实现创建用户代码
199 throw new Exception("The method or operation is not implemented.");
200 }
201
202 /**//*
203 摘要:
204 从成员资格数据源删除一个用户。
205
206 参数:
207 username: 要删除的用户的名称。
208 deleteAllRelatedData: 如果为 true,则从数据库中删除与该用户相关的数据;如果为 false,则将与该用户相关的数据保留在数据库。
209
210 返回值:
211 如果用户被成功删除,则为 true;否则为 false。
212 */
213 public override bool DeleteUser(string username, bool deleteAllRelatedData)
214 {
215 string SqlString = "";
216
217 //删除用户
218 if (UserExist(username)>0)
219 {
220 SqlString = string.Format("delete from {0} where username='{1}'",_TableName, username);
221 return OT.RunSqlNonQuery(SqlString);
222 }
223
224 return false;
225 }
226
227 /**//*
228 摘要:
229 指示成员资格提供程序是否配置为允许用户重置其密码。
230
231 返回值:
232 如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认为 true。
233 */
234 public override bool EnablePasswordReset
235 {
236 get
237 {
238 return _EnablePasswordReset;
239 }
240 }
241
242 /**//*
243 摘要:
244 指示成员资格提供程序是否配置为允许用户检索其密码。
245
246 返回值:
247 如果成员资格提供程序配置为支持密码检索,则为 true,否则为 false。默认为 false。
248 */
249 public override bool EnablePasswordRetrieval
250 {
251 get
252 {
253 return _EnablePasswordRetrieval;
254 }
255 }
256
257 /**//*
258 摘要:
259 获取一个成员资格用户的集合,这些用户的电子邮件地址包含要匹配的指定电子邮件地址。
260
261 参数:
262 totalRecords: 匹配用户的总数。
263 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
264 emailToMatch: 要搜索的电子邮件地址。
265 pageSize: 要返回的结果页的大小。
266
267 返回值:
268 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
269 */
270 public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
271 {
272 string SqlString = "";
273 MembershipUserCollection muc = new MembershipUserCollection();
274 totalRecords = UserExistByMail(emailToMatch);
275 if (totalRecords>0)
276 {
277 SqlString = string.Format("select * from {0} where email='{1}'", _TableName,emailToMatch);
278 muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
279 }
280 return muc;
281 }
282
283 /**//*
284 摘要:
285 获取一个成员资格用户的集合,这些用户的用户名包含要匹配的指定用户名。
286
287 参数:
288 totalRecords: 匹配用户的总数。
289 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
290 usernameToMatch: 要搜索的用户名。
291 pageSize: 要返回的结果页的大小。
292
293 返回值:
294 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
295 */
296 public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
297 {
298 string SqlString = "";
299 MembershipUserCollection muc = new MembershipUserCollection();
300 totalRecords = UserExist(usernameToMatch);
301 if (totalRecords > 0)
302 {
303 SqlString = string.Format("select * from {0} where username='{1}'", _TableName,usernameToMatch);
304 muc=ToMembershipUserCollection( OT.RunSqlDataTable(SqlString));
305 }
306 return muc;
307 }
308
309 /**//*
310 摘要:
311 获取数据源中的所有用户的集合,并显示在数据页中。
312
313 参数:
314 totalRecords: 匹配用户的总数。
315 pageIndex: 要返回的结果页的索引。pageIndex 是从零开始的。
316 pageSize: 要返回的结果页的大小。
317
318 返回值:
319 包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection 集合,这些对象从 pageIndex 指定的页开始。
320 */
321 public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
322 {
323 string SqlString = "";
324 MembershipUserCollection muc = new MembershipUserCollection();
325 totalRecords = UsersTotalRecords();
326 if (totalRecords > 0)
327 {
328 SqlString =string.Format( "select * from {0}",_TableName);
329 muc = ToMembershipUserCollection(OT.RunSqlDataTable(SqlString));
330 }
331 return muc;
332 }
333
334 /**//*
335 摘要:
336 获取当前访问该应用程序的用户数。
337
338 返回值:
339 当前访问该应用程序的用户数。
340 */
341 public override int GetNumberOfUsersOnline()
342 {
343 //TODO 获取在线人数
344 throw new Exception("The method or operation is not implemented.");
345 }
346
347 /**//*
348 摘要:
349 从数据源获取指定用户名所对应的密码。
350
351 参数:
352 username: 为其检索密码的用户。
353 answer: 用户的密码提示问题答案。
354
355 返回值:
356 指定用户名所对应的密码。
357 */
358 public override string GetPassword(string username, string answer)
359 {
360 string SqlString = "";
361 string password="";
362 if (UserExist(username) > 0)
363 {
364 SqlString = string.Format("select password from {0} where username='{1}' and answer='{2}'", _TableName,username, answer);
365 password = OT.RunSqlScalar(SqlString);
366 }
367 return password;
368 }
369
370 /**//*
371 摘要:
372 从数据源获取用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
373
374 参数:
375 username: 要获取其信息的用户名。
376 userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
377
378 返回值:
379 用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
380 */
381 public override MembershipUser GetUser(string username, bool userIsOnline)
382 {
383 string SqlString = "";
384 MembershipUser mu = null;
385
386 if (UserExist(username) > 0)
387 {
388 SqlString = string.Format("select * from {0} where username='{1}'", _TableName,username);
389 mu=ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
390 }
391
392 return mu;
393 }
394
395 /**//*
396 摘要:
397 根据成员资格用户的唯一标识符从数据源获取该用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
398
399 参数:
400 providerUserKey: 要获取其信息的成员资格用户的唯一标识符。
401 userIsOnline: 如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
402
403 返回值:
404 用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
405 */
406 public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
407 {
408 string SqlString = "";
409 MembershipUser mu = new MembershipUser();
410
411 if (UserExist(username) > 0)
412 {
413 SqlString = string.Format("select * from {0} where provideruserkey='{1}'", _TableName,providerUserKey.ToString());
414 mu = ToMembershipUser(OT.RunSqlDataTable(SqlString).Rows[0]);
415 }
416
417 return mu;
418 }
419
420 public override string GetUserNameByEmail(string email)
421 {
422 throw new Exception("The method or operation is not implemented.");
423 }
424
425 public override int MaxInvalidPasswordAttempts
426 {
427 get
428 {
429 return _MaxInvalidPasswordAttempts;
430 }
431 }
432
433 public override int MinRequiredNonAlphanumericCharacters
434 {
435 get
436 {
437 return _MinRequireNonAlphanumericCharacters;
438 }
439
440 }
441
442 public override int MinRequiredPasswordLength
443 {
444 get
445 {
446 return _MinRequiredPasswordLength;
447 }
448 }
449
450 public override int PasswordAttemptWindow
451 {
452 get
453 {
454 return _PasswordAttemptWindow;
455 }
456 }
457
458 public override MembershipPasswordFormat PasswordFormat
459 {
460 get
461 {
462 return _PasswordFormat;
463 }
464 }
465
466 public override string PasswordStrengthRegularExpression
467 {
468 get
469 {
470 return PasswordStrengthRegularExpression;
471 }
472 }
473
474 public override bool RequiresQuestionAndAnswer
475 {
476 get
477 {
478 return RequiresQuestionAndAnswer;
479 }
480 }
481
482 public override bool RequiresUniqueEmail
483 {
484 get
485 {
486 return RequiresUniqueEmail;
487 }
488 }
489
490 public override string ResetPassword(string username, string answer)
491 {
492 throw new Exception("The method or operation is not implemented.");
493 }
494
495 public override bool UnlockUser(string userName)
496 {
497 throw new Exception("The method or operation is not implemented.");
498 }
499
500 public override void UpdateUser(MembershipUser user)
501 {
502 throw new Exception("The method or operation is not implemented.");
503 }
504
505 public override bool ValidateUser(string username, string password)
506 {
507 throw new Exception("The method or operation is not implemented.");
508 }
509
510非MembershipProvider成员#region 非MembershipProvider成员
511
512 /**//*
513 摘要:
514 判断用户是否存在
515
516 参数:
517 username:用户名
518
519 返回值:
520 找到用户返回true,没有找到用户false
521 */
522 private int UserExist(string username)
523 {
524 string SqlString = "";
525 string r = "";
526 int Count = 0;
527
528 SqlString = string.Format("select count(*) from {0} where username='{1}'", _TableName,username);
529 r = OT.RunSqlScalar(SqlString);
530 try
531 {
532 Count = int.Parse(r);
533 }
534 catch (Exception)
535 {
536 Count = 0;
537 }
538
539 return Count;
540 }
541
542 /**//*
543 摘要:
544 判断用户是否存在
545
546 参数:
547 username:用户名
548 password:用户密码
549
550 返回值:
551 找到用户的用户数。
552 */
553 private int UserExist(string username, string password)
554 {
555 string SqlString = "";
556 string r = "";
557 int Count = 0;
558
559 SqlString = string.Format("select count(*) from {0} where username='{1}' and password='{2}'",_TableName, username,password);
560 r = OT.RunSqlScalar(SqlString);
561 try
562 {
563 Count = int.Parse(r);
564 }
565 catch (Exception)
566 {
567 Count = 0;
568 }
569
570 return Count;
571 }
572
573 /**//*
574 摘要:
575 判断用户是否存在
576
577 参数:
578 email:用户名
579
580 返回值:
581 找到用户的用户数。
582 */
583 private int UserExistByMail(string email)
584 {
585 string SqlString = "";
586 string r = "";
587 int Count = 0;
588
589 SqlString = string.Format("select count(*) from {0} where email='{1}'", _TableName,email);
590 r = OT.RunSqlScalar(SqlString);
591 try
592 {
593 Count = int.Parse(r);
594 }
595 catch (Exception)
596 {
597 Count = 0;
598 }
599
600 return Count;
601 }
602
603 /**//*
604 摘要:
605 转换用户数据表为MembershipUserCollection
606
607 参数:
608 userstable:用户表
609
610 返回值:
611 返回包含用户数据的MembershipUserCollection。
612 */
613 private MembershipUserCollection ToMembershipUserCollection(DataTable userstable)
614 {
615 MembershipUserCollection muc = new MembershipUserCollection();
616
617 foreach (DataRow dr in userstable.Rows)
618 {
619 muc.Add(ToMembershipUser(dr));
620 }
621
622 return muc;
623 }
624
625 /**//*
626 摘要:
627 获得用户总数
628
629 返回值:
630 返回用户数。
631 */
632 private int UsersTotalRecords()
633 {
634 string SqlString = "";
635 string r = "";
636 int Count = 0;
637
638 SqlString = string.Format("select count(*) from {0}",_TableName);
639 r = OT.RunSqlScalar(SqlString);
640 try
641 {
642 Count = int.Parse(r);
643 }
644 catch (Exception)
645 {
646 Count = 0;
647 }
648
649 return Count;
650 }
651
652 /**//*
653 摘要:
654 转换用户数据表为MembershipUserCollection
655
656 参数:
657 usersrecord:用户记录
658
659 返回值:
660 返回包含用户数据的MembershipUser。
661 */
662 private MembershipUser ToMembershipUser(DataRow usersrecord)
663 {
664 MembershipUser mu = new MembershipUser();
665 try
666 {
667 mu.UserName = usersrecord["username"];
668 mu.Email = usersrecord["email"];
669 mu.PasswordQuestion = usersrecord["question"];
670 }
671 catch (Exception)
672 {
673 }
674 return mu;
675 }
676
677 /**//*
678 摘要:
679 获取配置文件
680
681 参数:
682 ConfigValue:配置文件中的参数设置
683 DefaultValue:缺省值
684
685 返回值:
686 如果ConfigValue值有效则返回ConfigValue,否则返回DefaultValue。
687 */
688 private string GetConfigValue(string ConfigValue, string DefaultValue)
689 {
690 if (string.IsNullOrEmpty(ConfigValue))
691 return DefaultValue;
692 return ConfigValue;
693 }
694#endregion
695
696 }
697}
698
OracleTools
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Data;
5using System.Data.OleDb;
6
7namespace BoooLee
8{
9 class OracleTools
10 {
11 /**//// <summary>
12 /// 私有变量
13 /// </summary>
14 private string _ConnectionString = ""; //数据库连接串
15
16 /**//// <summary>
17 /// 日志记录器
18 /// </summary>
19 private LogTools _LogTools = null;
20
21 /**//// <summary>
22 /// 是否允许记录日志
23 /// </summary>
24 private bool _EnableEventLog = false;
25
26 /**//// <summary>
27 /// 是否允许记录日志
28 /// </summary>
29 public bool EnableEventlog
30 {
31 get
32 {
33 return _EnableEventLog;
34 }
35
36 set
37 {
38 _EnableEventLog = value;
39 }
40 }
41
42 /**//// <summary>
43 /// 日志记录器
44 /// </summary>
45 public LogTools LogTool
46 {
47 get
48 {
49 return _LogTools;
50 }
51
52 set
53 {
54 _LogTools = value;
55 }
56 }
57 /**//// <summary>
58 /// 数据库连接串
59 /// </summary>
60 public string ConnectionString
61 {
62 get
63 {
64 return _ConnectionString;
65 }
66
67 set
68 {
69 _ConnectionString=value;
70 }
71 }
72
73 /**//// <summary>
74 /// 运行无返回值的Sql语句。
75 /// </summary>
76 /// <param name="SqlString">指定要运行的Sql语句。</param>
77 /// <param name="Conn">指定数据库连接。</param>
78 /// <returns>成功返回true,失败返回false。</returns>
79 public bool RunSqlNonQuery(string SqlString)
80 {
81 OleDbConnection Conn=null;
82
83 try
84 {
85 using (OleDbCommand Command = new OleDbCommand())
86 {
87 Command.CommandText = SqlString;
88 Conn = GetConnection();
89 Conn.Open();
90 Command.Connection = Conn;
91 Command.ExecuteNonQuery();
92 }
93 return true;
94 }
95 catch (Exception ex)
96 {
97 if (_LogTools != null && _EnableEventLog)
98 _LogTools.WriteToEventLog(ex, string.Format("RunSqlNonQuery(\"{0}\")", SqlString));
99 return false;
100 }
101 finally
102 {
103 //关闭数据库连接
104 if (Conn != null && Conn.State==ConnectionState.Open)
105 Conn.Close();
106 }
107 }
108
109 /**//// <summary>
110 /// 运行返回一个值的Select语句。
111 /// </summary>
112 /// <param name="SqlString">指定要运行的Sql语句。</param>
113 /// <param name="Conn">指定数据库连接。</param>
114 /// <returns>成功返回Select语句结果,失败返回空字符串。</returns>
115 public string RunSqlScalar(string SqlString)
116 {
117 OleDbConnection Conn = null;
118
119 try
120 {
121 Conn = GetConnection();
122 Conn.Open();
123
124 using (OleDbCommand Command = new OleDbCommand())
125 {
126 Command.CommandText = SqlString;
127 Command.Connection = Conn;
128 return Command.ExecuteScalar().ToString();
129 }
130 }
131 catch (Exception ex)
132 {
133 if (_LogTools != null && _EnableEventLog)
134 _LogTools.WriteToEventLog(ex, string.Format("RunSqlScalar(\"{0}\")",SqlString));
135 return "";
136 }
137 finally
138 {
139 if (Conn != null && Conn.State == ConnectionState.Open)
140 Conn.Close();
141 }
142 }
143
144 /**//// <summary>
145 /// 运行返回DataTable的Sql语句。
146 /// </summary>
147 /// <param name="SqlString">指定要运行的Sql语句。</param>
148 /// <param name="Conn">指定数据库连接。</param>
149 /// <returns>成功返回Select语句结果DataTable。</returns>
150 public DataTable RunSqlDataTable(string SqlString)
151 {
152 OleDbConnection Conn = null;
153
154 try
155 {
156 using (OleDbDataAdapter DataAdapter = new OleDbDataAdapter())
157 {
158 Conn = GetConnection();
159 Conn.Open();
160 OleDbCommand SC = new OleDbCommand();
161 SC.CommandText = SqlString;
162 SC.Connection = Conn;
163 DataAdapter.SelectCommand = SC;
164 DataTable dt = new DataTable();
165 DataAdapter.Fill(dt);
166 return dt;
167 }
168 }
169 catch (Exception ex)
170 {
171 if (_LogTools != null && _EnableEventLog)
172 _LogTools.WriteToEventLog(ex, string.Format("RunSqlDataTable(\"{0}\")", SqlString));
173 return new DataTable();
174 }
175 finally
176 {
177 if (Conn != null && Conn.State == ConnectionState.Open)
178 Conn.Close();
179 }
180 }
181
182 /**//// <summary>
183 /// 返回一个OleDbConnection对象。
184 /// </summary>
185 /// <returns>成功返回的OleDbConnection对象,失败返回null。</returns>
186 public OleDbConnection GetConnection()
187 {
188 try
189 {
190 OleDbConnection result = new OleDbConnection();
191 result.ConnectionString = _ConnectionString;
192 return result;
193 }
194 catch (Exception ex)
195 {
196 if (_LogTools != null && _EnableEventLog)
197 _LogTools.WriteToEventLog(ex, "GetConnection()");
198 return null;
199 }
200 }
201 }
202}
203
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Data;
5using System.Data.OleDb;
6
7namespace BoooLee
8{
9 class OracleTools
10 {
11 /**//// <summary>
12 /// 私有变量
13 /// </summary>
14 private string _ConnectionString = ""; //数据库连接串
15
16 /**//// <summary>
17 /// 日志记录器
18 /// </summary>
19 private LogTools _LogTools = null;
20
21 /**//// <summary>
22 /// 是否允许记录日志
23 /// </summary>
24 private bool _EnableEventLog = false;
25
26 /**//// <summary>
27 /// 是否允许记录日志
28 /// </summary>
29 public bool EnableEventlog
30 {
31 get
32 {
33 return _EnableEventLog;
34 }
35
36 set
37 {
38 _EnableEventLog = value;
39 }
40 }
41
42 /**//// <summary>
43 /// 日志记录器
44 /// </summary>
45 public LogTools LogTool
46 {
47 get
48 {
49 return _LogTools;
50 }
51
52 set
53 {
54 _LogTools = value;
55 }
56 }
57 /**//// <summary>
58 /// 数据库连接串
59 /// </summary>
60 public string ConnectionString
61 {
62 get
63 {
64 return _ConnectionString;
65 }
66
67 set
68 {
69 _ConnectionString=value;
70 }
71 }
72
73 /**//// <summary>
74 /// 运行无返回值的Sql语句。
75 /// </summary>
76 /// <param name="SqlString">指定要运行的Sql语句。</param>
77 /// <param name="Conn">指定数据库连接。</param>
78 /// <returns>成功返回true,失败返回false。</returns>
79 public bool RunSqlNonQuery(string SqlString)
80 {
81 OleDbConnection Conn=null;
82
83 try
84 {
85 using (OleDbCommand Command = new OleDbCommand())
86 {
87 Command.CommandText = SqlString;
88 Conn = GetConnection();
89 Conn.Open();
90 Command.Connection = Conn;
91 Command.ExecuteNonQuery();
92 }
93 return true;
94 }
95 catch (Exception ex)
96 {
97 if (_LogTools != null && _EnableEventLog)
98 _LogTools.WriteToEventLog(ex, string.Format("RunSqlNonQuery(\"{0}\")", SqlString));
99 return false;
100 }
101 finally
102 {
103 //关闭数据库连接
104 if (Conn != null && Conn.State==ConnectionState.Open)
105 Conn.Close();
106 }
107 }
108
109 /**//// <summary>
110 /// 运行返回一个值的Select语句。
111 /// </summary>
112 /// <param name="SqlString">指定要运行的Sql语句。</param>
113 /// <param name="Conn">指定数据库连接。</param>
114 /// <returns>成功返回Select语句结果,失败返回空字符串。</returns>
115 public string RunSqlScalar(string SqlString)
116 {
117 OleDbConnection Conn = null;
118
119 try
120 {
121 Conn = GetConnection();
122 Conn.Open();
123
124 using (OleDbCommand Command = new OleDbCommand())
125 {
126 Command.CommandText = SqlString;
127 Command.Connection = Conn;
128 return Command.ExecuteScalar().ToString();
129 }
130 }
131 catch (Exception ex)
132 {
133 if (_LogTools != null && _EnableEventLog)
134 _LogTools.WriteToEventLog(ex, string.Format("RunSqlScalar(\"{0}\")",SqlString));
135 return "";
136 }
137 finally
138 {
139 if (Conn != null && Conn.State == ConnectionState.Open)
140 Conn.Close();
141 }
142 }
143
144 /**//// <summary>
145 /// 运行返回DataTable的Sql语句。
146 /// </summary>
147 /// <param name="SqlString">指定要运行的Sql语句。</param>
148 /// <param name="Conn">指定数据库连接。</param>
149 /// <returns>成功返回Select语句结果DataTable。</returns>
150 public DataTable RunSqlDataTable(string SqlString)
151 {
152 OleDbConnection Conn = null;
153
154 try
155 {
156 using (OleDbDataAdapter DataAdapter = new OleDbDataAdapter())
157 {
158 Conn = GetConnection();
159 Conn.Open();
160 OleDbCommand SC = new OleDbCommand();
161 SC.CommandText = SqlString;
162 SC.Connection = Conn;
163 DataAdapter.SelectCommand = SC;
164 DataTable dt = new DataTable();
165 DataAdapter.Fill(dt);
166 return dt;
167 }
168 }
169 catch (Exception ex)
170 {
171 if (_LogTools != null && _EnableEventLog)
172 _LogTools.WriteToEventLog(ex, string.Format("RunSqlDataTable(\"{0}\")", SqlString));
173 return new DataTable();
174 }
175 finally
176 {
177 if (Conn != null && Conn.State == ConnectionState.Open)
178 Conn.Close();
179 }
180 }
181
182 /**//// <summary>
183 /// 返回一个OleDbConnection对象。
184 /// </summary>
185 /// <returns>成功返回的OleDbConnection对象,失败返回null。</returns>
186 public OleDbConnection GetConnection()
187 {
188 try
189 {
190 OleDbConnection result = new OleDbConnection();
191 result.ConnectionString = _ConnectionString;
192 return result;
193 }
194 catch (Exception ex)
195 {
196 if (_LogTools != null && _EnableEventLog)
197 _LogTools.WriteToEventLog(ex, "GetConnection()");
198 return null;
199 }
200 }
201 }
202}
203
LogTools
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace BoooLee
6{
7 class LogTools
8 {
9 private string _eventSource = "";
10 private string _eventLog = "";
11
12
13 /**//// <summary>
14 /// 事件发生源
15 /// </summary>
16 public string EventSource
17 {
18 get
19 {
20 return _eventSource;
21 }
22
23 set
24 {
25 _eventSource = value;
26 }
27 }
28
29 /**//// <summary>
30 /// 日志名
31 /// </summary>
32 public string EventLog
33 {
34 get
35 {
36 return _eventLog;
37 }
38
39 set
40 {
41 _eventLog = value;
42 }
43 }
44
45 public void WriteToEventLog(Exception e, string action)
46 {
47 EventLog log = new EventLog();
48 log.Source = _eventSource;
49 log.Log = _eventLog;
50
51 string message = "数据源发生异常.\n\n";
52 message += "操作: " + action + "\n\n";
53 message += "异常: " + e.ToString();
54
55 log.WriteEntry(message);
56 }
57 }
58}
59
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace BoooLee
6{
7 class LogTools
8 {
9 private string _eventSource = "";
10 private string _eventLog = "";
11
12
13 /**//// <summary>
14 /// 事件发生源
15 /// </summary>
16 public string EventSource
17 {
18 get
19 {
20 return _eventSource;
21 }
22
23 set
24 {
25 _eventSource = value;
26 }
27 }
28
29 /**//// <summary>
30 /// 日志名
31 /// </summary>
32 public string EventLog
33 {
34 get
35 {
36 return _eventLog;
37 }
38
39 set
40 {
41 _eventLog = value;
42 }
43 }
44
45 public void WriteToEventLog(Exception e, string action)
46 {
47 EventLog log = new EventLog();
48 log.Source = _eventSource;
49 log.Log = _eventLog;
50
51 string message = "数据源发生异常.\n\n";
52 message += "操作: " + action + "\n\n";
53 message += "异常: " + e.ToString();
54
55 log.WriteEntry(message);
56 }
57 }
58}
59
随着编写的深入,从起初的只想学习一下MemshipProvider知识,变成了现在的要写一个实用的OracleMemshipProvider,这一切离不开关注本blog的朋友们,希望有兴趣的朋友参与进来,编写出基于其他数据库平台的MemshipProvider。比如:MySQLMemshipProvider等。