啊,百度了下 Pojo Java Bean 的含義,感覺怪奇怪的。
考慮話換個名字:用C#模擬實現 數據庫實體 SqlPojo,但之前已經發了,就懶得改了,大概這意思就行。
然後昨晚在msdn上查了一下 泛型,哎喲我擦,以前以爲是 var 泛化類型,覺得是 php 那樣的弱化類型,結果發現原來是C++的Template模板。
好吧,根據這個修改了一下 DBHelper 的 Single 方法。
然後,我還沒事查了一下 MVC,沒了解清楚,簡單的實驗了下,做了 模型控制類 Control:
示例:UserControl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Collections;
using System.Data;
//namespace User
//{
/// <summary>
/// UserControl 的摘要說明
/// </summary>
public class UserControl
{
public UserControl()
{
//
// TODO: 在此處添加構造函數邏輯
//
}
private const string LoginTemplate = "Select * From [_Login] Where [UserName] = '{0}' AND [PassWord] = '{1}'";
private const string GetUserTemplate = "Select * From [_Login] Where [AuthStr] = '{0}'";
public static void CheckLogin(_Login user)
{
if (user == null || user.Uid == 0L)
{
throw new ActionFaildException(Constants.AR_Code_LoginError, "請先登錄.");
}
}
public static _Login Login(Hashtable param)
{
Constants.ParamCheck(new string[] { "UserName", "PassWord" }, param);
_Login login = new _Login();
string userName = param["UserName"].ToString();
string passWord = param["PassWord"].ToString();
string sql = string.Format(UserControl.LoginTemplate, userName, passWord);
login = (_Login)DBHelper.ExecuteQuery(sql, login);
if (login == null)
{
throw new ActionFaildException(Constants.AR_Code_WrongPassword, "賬號或密碼錯誤.");
}
else
{
return login;
}
}
public static int UpdateUserInfo(_Login user, Hashtable param)
{
UserControl.CheckLogin(user);
UserInfo info = new UserInfo();
info.LoadFromHashtable(param);
info.Uid = user.Uid;
return DBHelper.Update(info);
}
public static UserInfo Regist(Hashtable param)
{
Constants.ParamCheck(new string[] { "UserName", "PassWord" }, param);
// 插入 _Login 記錄
_Login login = new _Login();
login.LoadFromHashtable(param);
login.GroupCode = 1;
login.AuthStr = Guid.NewGuid().ToString();
DBHelper.Insert(login);
login = UserControl.Login(param);
// 插入 UserInfo 記錄
UserInfo info = new UserInfo();
info.LoadFromHashtable(param);
info.Uid = login.Uid;
DBHelper.Insert(info);
V_UserInfo v = new V_UserInfo();
v.Uid = info.Uid;
return (V_UserInfo)DBHelper.Single(v);
}
/// <summary>
/// 根據身份串獲取用戶
/// 身份串爲空 或 未知的身份串 則返回 null
/// </summary>
/// <param name="authStr">用戶身份串</param>
/// <returns></returns>
public static _Login GetUser(string authStr)
{
if (Constants.IsNull(authStr))
{
return null;
}
string sql = string.Format(UserControl.GetUserTemplate, authStr);
_Login login = new _Login();
return (_Login)DBHelper.ExecuteQuery(sql, login);
}
public static int ChangePassWord(_Login user, Hashtable param)
{
string passWord = Constants.GetParam(param, "PassWord");
string newPassWord = Constants.GetParam(param, "NewPassWord");
if (passWord.Equals(user.PassWord))
{
user.PassWord = newPassWord;
return DBHelper.Update(user);
}
else
{
throw new ActionFaildException(Constants.AR_Code_WrongPassword, "密碼錯誤.");
}
}
public static V_UserInfo GetMyInfo(_Login user)
{
UserControl.CheckLogin(user);
return UserControl.GetUserInfo(user.Uid);
}
private static V_UserInfo GetUserInfo(long uid)
{
V_UserInfo v = new V_UserInfo();
v.Uid = uid;
return (V_UserInfo)DBHelper.Single(v);
}
}
//}
哦,這還是舊版的。
貼一個新版的 DBHelper.Single 方法:
public static T Single<T>(string sql) where T : SqlPojo, new()
{
T t = new T();
DataRow dr = DBHelper.ExecuteQuery(sql);
t.LoadFromDataRow(dr);
return t;
}
where T : SqlPojo, new()
限定符,表示 T類型 派生自 SqlPojo 並且具有 空參的構造函數