今天尝试开发用户登录模块!结果失败了,用Access开发,本来希望能实现ORM映射的,但是发现用在用户登录这一块太复杂。而且如果要管理用户,添加删除修改,用DataTable存储查询结果,并将数据源绑定到DataGridView明显更加方便!可能是我没有习惯吧!
这里参考了一个五层设计:数据操作层,对象,关系对象映射、业务、界面。感觉还是比较复杂,不过好处不言而喻。而且这样都能够使编程傻瓜化!
http://www.cnblogs.com/BudEasyCode/archive/2012/03/03/2378227.html
明天继续弄!(19:58:06)
用别人写的类不习惯,应该有两方面原因:别人写的类不能完全满足要求,写的不太合理;其二就是自己用的太少。
把登录的代码写在MainForm_Load事件中还是写在Program中Main主函数中?我现在也不知道到底哪一种好。似乎应该写在Main函数中。不过如果写一个Controller,将登录和主窗体作为他的变量,通过Controller函数了控制应该会容易很多吧!MVC这样的机制还是应该学习一下的。(09:16:27)
OleDbDataAdaper.Update(DataSet ds,TableName name) 总是报"Insert Into 的语句语法错误",解决方法。 http://www.cnblogs.com/chorrysky/archive/2008/12/24/712042.html
OleDbDataAdapter oleSub=new OleDbDataAdapter(sql,oleCn);
OleDbCommandBuilder cb1=new OleDbCommandBuilder(oleSub);
cb1.QuotePrefix="[";
cb1.QuoteSuffix="]";(16:46:03)
这里写两段代码希望比较一下下面的几种登录方法:
1. 初始化MainForm的Load事件是验证登录
2. 在Main函数中验证登录,如果登录成功运行Application.Run(New MainFrom());否则return;
3. Main函数中运行Application.Run(new Login());在Login的登录按钮点击时验证,成功则Login窗体Hide()接着MainForm.show();
这三种方法都需要将用户的登录信息传入主窗体,进而定制用户菜单。
那种用户登录的方式更好。首先是数据库Users表设计,(如果是基于角色的权限管理,显然还应该有两张表即角色表、角色功能对照表和功能表这里先不搞那么复杂):
字段名称 | 字段描述 | 字段类型 | |
User_id | 用户编号 | int | |
User_name | 用户名 | VarChar(64) | |
PassWord | 用户密码 | VarChar(64) | |
Role | 角色 | int |
|
第一种方法分析:因为在MainForm执行Load事件之前,构造函数已经执行(通过执行InitialComponent函数实现),所以通过IDE设计的主窗体的用户界面已经存在,用户登录会受影响。不过如果通过配置文件构造窗体,这个应该也能够满足要求,显示给用户一个空的主窗体。
第二种方法代码:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
OleDbMeans.OleConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\Floor.mdb";
#region 登录
login m_login = new login();
if (m_login.ShowDialog() != DialogResult.OK)
{
return;
}
#endregion
Splasher.Show();
Application.Run(new MainFrm(m_login.User));
Splasher.Close();
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using WinDbMeans;
using System.Data.OleDb;
namespace HouseMange
{
public partial class login : Form
{
user m_User = new user();
public user User
{
get { return m_User; }
//set { m_User = value; }
}
//private bool IsSuccess = false;//登录是否成功
//public bool IsLoginSuccess
//{
// get { return IsSuccess; }
////set { IsSuccess = value; }
//}
public login()
{
InitializeComponent();
}
private void login_Load(object sender, EventArgs e)
{
}
private void Login_in_Click(object sender, EventArgs e)
{
OleDbMeans m_OleDbMeans = new OleDbMeans();
m_OleDbMeans.Open();
if (textName.Text != "" && textPass.Text != "")
{
OleDbDataReader temDR = m_OleDbMeans.SelectInfo("select * from Users where User_name='" + textName.Text.Trim() + "' and PassWord='" + textPass.Text.Trim() + "'");
bool ifcom = false;
if (temDR != null && temDR.HasRows)
{
ifcom = temDR.Read();
}
if (ifcom)
{
m_User.UserName = textName.Text;
m_User.UserType = temDR.GetString(2);
m_OleDbMeans.Close();
//IsSuccess = true;
this.DialogResult = DialogResult.OK;
}
else
{
labelX1.Text="提示:用户名或密码错误!";
textName.Text = "";
textPass.Text = "";
}
m_OleDbMeans.Close();
}
else
{
labelX1.Text = "提示:请将登录信息添写完整!";
}
}
private void button2_Click(object sender, EventArgs e)
{
//IsSuccess = false;
this.DialogResult= DialogResult.Cancel;
}
}
public class user
{
//private string userId;
//public string UserId
//{
// get { return userId; }
// set { userId = value; }
//}
private string userName;
public string UserName
{
get { return userName; }
set { userName = value; }
}
private string userType;
public string UserType
{
get { return userType; }
set { userType = value; }
}
}
}
第三种方法代码:在《C#项目开发案例全程实录》一书中大量使用了这一方法。
这种方法因为MainFrom是Login窗体的一个局部变量,所以在主窗体退出时,Login窗体仍然没有销毁,所以需要强制退出!
下面参考别人的做法:(15:02:09)
http://www.cnblogs.com/singlex/archive/2011/12/05/2276961.html
http://www.cnblogs.com/voodooq/archive/2004/08/31/38002.html
http://www.cnblogs.com/iambetter/archive/2012/01/14/2322156.html
http://www.cnblogs.com/ou444/archive/2011/09/13/2174911.html