.net中更新已存在表字段的解决方法

最近碰到这样的问题:已存在的表,其中有加密的密码(原初始密码为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,进行更新操作。未具体实现。

你可能感兴趣的:(sql,.net,Excel,F#,J#)