最近碰到这样的问题:已存在的表,其中有加密的密码(原初始密码为11111),现要求把原初始密码随机生成,不使用原初始密码。为了导出方便,我决定用datagrid,然后导出到excel.
其思路有二种,一种通过先展示datagrid,然后再通过按钮生成随机码及加密密码,不过,客户操作比较烦琐;另一种 直接通过按钮生成表,包括密码及加密密码。
第二种方案的作法如下:在数据库users表增加一字段(没加密前的密码),在显示datagrid之前进行逻辑操作来生成随机密码及加密密码。
rndpwd.aspx.cs关键代码如下:
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack )
{
updatebase(); //生成随机密码
refreshGrid(); //通过datagrid展现页面
}
}
private void updatebase()
{
new BizLogic.Rndpwd().updatepwd();;
}
private void refreshGrid()
{
DataView dv;
components.DBUsers users=new components.DBUsers();
if (ViewState ["deptCode"].ToString()=="0")
{
dv=users.select_AllUsers1();
gridDeptUser.DataSource=dv;
}
else
{
dv=users.select_usersUnder_Deptcode_withSubDept (ViewState["deptCode"].ToString());
gridDeptUser.DataSource=dv;
}
gridDeptUser.DataBind();
}
其逻辑和数据层的关键代码如下,其思路先计算出有多少列,并记录第一条记录的id,然后通过for语句,对每一条记录进行更新,生成随机码函数的方法较多,这里仅提供一种:
public void updatepwd()
{
SqlConnection myConn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connectionString"]);
string sql="select * from users" ;
SqlDataAdapter myCommand=new SqlDataAdapter(sql ,myConn);
DataSet ds = new DataSet();
myCommand.Fill(ds);
DataView dv = ds.Tables[0].DefaultView;
for( int i = 0 ;i < dv.Count ; i++)
{
string deptcode=ds.Tables[0].Rows[i][0].ToString();
string rand=CreateRandomCode(5);
SqlConnection myConn1=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connectionString"]);
SqlCommand myCommand1=new SqlCommand("update users set rndpwd='"+rand+"',password='"+authPassword(rand)+"' where usercode='"+deptcode+"'",myConn1);
try
{
myCommand1.Connection.Open();
myCommand1.ExecuteNonQuery();
}
catch (Exception e)
{
throw new Exception("更新记录时产生错误,错误代码为:" + e.ToString());
}
finally
{
myCommand1.Dispose();
myConn1.Close();
myConn1.Dispose();
}
}
}
private string CreateRandomCode(int codeCount) //根据时间来生成随机函数,会有一定的重复,需改进。
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;
Random rand = new Random();
for(int i = 0; i < codeCount; i++)
{
if(temp != -1)
{
int s=i*temp*((int)DateTime.Now.Ticks);
int ss=s;
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if(temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
随机数类System.Random类提供以下方法用于产生各种满足不同要求的随机数,如表1所示:
表1 System.Random类提供的各种方法
编号 | 方法名称 | 功能描述 |
1 | Next() | 返回一个0~2147483647之间的整数 |
2 | Next(i) | 返回一个0~i之间的整数 |
3 | Next(i,j) | 返回一个i~j之间的整数 |
4 | Nextdouble() | 返回一个0~1之间的随机小数 |
5 | Nextdouble( byte()) | 用0~255之间的随机整数作为字节数组各元素的值。 |
使用随机数类System.Random必须先声明。如果要使用Nextbytes(byte())方法,在使用前也必须声明字节数组。
第一种方案,可通过显示出来的id,进行更新操作。未具体实现。