private void Button1_Click(object sender, System.EventArgs e)
{
conn = new OleDbConnection(ConfigurationSettings.AppSettings["cnFriends.ConnectionString"]);
cmd1=new OleDbCommand("select u_User from userinfo where u_User='"+u_user1.Text+"'",conn);
OleDbDataReader objDataReader ;
cmd1.Connection.Open();
objDataReader = cmd1.ExecuteReader();
if (objDataReader.Read() == true)
{
Response.Redirect("checkout.aspx");
lblMessage.Text = "对不起,该用户名已经被注册!";
return;
}
OleDbConnection con;
string OleDbsql;
OleDbCommand cmd;
StringBuilder sb=new StringBuilder();
ArrayList values=new ArrayList(); sb.Append("INSERT INTO [userinfo](u_User,u_pass,u_question,u_result,u_Email,u_Address,u_Oicq,u_icq,u_Occupation,u_Homepage,u_Signature,u_msn) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')");
s1=(FormsAuthentication.HashPasswordForStoringInConfigFile(u_pass1.Text.ToString().Trim(),"MD5"));
s2=s1.Substring(8,s1.Length-16);
values.Add(u_user1.Text);
values.Add(s2);
values.Add(u_question.Text);
values.Add(u_result.Text);
values.Add(u_Email.Text);
values.Add(u_Address.Text);
values.Add(u_Oicq.Text);
values.Add(u_icq.Text);
values.Add(u_Occupation.Text);
values.Add(u_Homepage.Text);
values.Add(u_Signature.Text);
if (u_msn.Checked)
values.Add(u_msn.Text);
else
values.Add(u_msn1.Text);
=================================================================================
if(u_user1.Text!=string.Empty)
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null"); if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");
为什么还要加入这部分内容?
================================================================================
OleDbsql=String.Format(sb.ToString(),values.ToArray());
能解释一下这个函数是如何工作的吗?
===================================================================================
con=new OleDbConnection(ConfigurationSettings.AppSettings["cnFriends.ConnectionString"]);
cmd=new OleDbCommand(OleDbsql,con);
con.Open();
bool doredirect=true; try
{
cmd.ExecuteNonQuery();
}
catch
{
doredirect=false;
this.lblMessage.Visible=true;
this.lblMessage.Text="Insert couldn't be performed.username may be already taken."; }
finally
{
con.Close();
}
............
.............我按照这些代码写了个自己的注册页面,编译的时候没有出错,执行却捕获到异常,执行了catch里的的处理函数。
{
conn = new OleDbConnection(ConfigurationSettings.AppSettings["cnFriends.ConnectionString"]);
cmd1=new OleDbCommand("select u_User from userinfo where u_User='"+u_user1.Text+"'",conn);
OleDbDataReader objDataReader ;
cmd1.Connection.Open();
objDataReader = cmd1.ExecuteReader();
if (objDataReader.Read() == true)
{
Response.Redirect("checkout.aspx");
lblMessage.Text = "对不起,该用户名已经被注册!";
return;
}
OleDbConnection con;
string OleDbsql;
OleDbCommand cmd;
StringBuilder sb=new StringBuilder();
ArrayList values=new ArrayList(); sb.Append("INSERT INTO [userinfo](u_User,u_pass,u_question,u_result,u_Email,u_Address,u_Oicq,u_icq,u_Occupation,u_Homepage,u_Signature,u_msn) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')");
s1=(FormsAuthentication.HashPasswordForStoringInConfigFile(u_pass1.Text.ToString().Trim(),"MD5"));
s2=s1.Substring(8,s1.Length-16);
values.Add(u_user1.Text);
values.Add(s2);
values.Add(u_question.Text);
values.Add(u_result.Text);
values.Add(u_Email.Text);
values.Add(u_Address.Text);
values.Add(u_Oicq.Text);
values.Add(u_icq.Text);
values.Add(u_Occupation.Text);
values.Add(u_Homepage.Text);
values.Add(u_Signature.Text);
if (u_msn.Checked)
values.Add(u_msn.Text);
else
values.Add(u_msn1.Text);
=================================================================================
if(u_user1.Text!=string.Empty)
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null"); if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");
为什么还要加入这部分内容?
================================================================================
OleDbsql=String.Format(sb.ToString(),values.ToArray());
能解释一下这个函数是如何工作的吗?
===================================================================================
con=new OleDbConnection(ConfigurationSettings.AppSettings["cnFriends.ConnectionString"]);
cmd=new OleDbCommand(OleDbsql,con);
con.Open();
bool doredirect=true; try
{
cmd.ExecuteNonQuery();
}
catch
{
doredirect=false;
this.lblMessage.Visible=true;
this.lblMessage.Text="Insert couldn't be performed.username may be already taken."; }
finally
{
con.Close();
}
............
.............我按照这些代码写了个自己的注册页面,编译的时候没有出错,执行却捕获到异常,执行了catch里的的处理函数。
2、那是字符串格式化函数,是以values.ToArray()的格式格式化sb
3、你可以把异常的信息抛出来看看啊
catch(Exception ex)
{
doredirect=false;
this.lblMessage.Visible=true;
this.lblMessage.Text="Insert couldn't be performed.username may be already taken.";
=====================================
声明个label lb
this.lb.text = ex.Message.ToString(); }
对1、在表单被提交之前不是已经有验证控件检查输入了吗?
另外,sb.Append()里,只设置了12个形参,而在
=================================================================================
if(u_user1.Text!=string.Empty)
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null");if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");================================================================================
之前已经填入12个值了啊,这里我就不懂了。
既然前面已经将加密的密码加到values 里,后面的验证和values.add()有什么用?
我捕获到异常的信息为:
System.Data.OleDb.OleDbException: 操作必须使用一个可更新的查询。 at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() at aa.register2.Bt_submit_Click(Object sender, EventArgs e) in d:\inetpub\wwwroot\aa\register2.aspx.cs:line 182看不懂,对“操作必须使用一个可更新的查询”是哪的错呢?
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null"); if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");
为什么还要加入这部分内容?
========================================
这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把null插到数据库中,密码部分一样. OleDbsql=String.Format(sb.ToString(),values.ToArray());
能解释一下这个函数是如何工作的吗?
====================================================
这个函数会把数组中索引为0的替换你的CommandText中{0}部分,其实就是一个占位符的替换.这种代码的写法不推荐使用,在.net里直接用OleDbParameter就可以了.OleDbCommand cmd=new OleDbCommand("insert into table (col1,..)values(@value1,..)",cnn);
cmd.Parameters.Add("@value1",txtName.Text);
......
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null"); if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");
为什么还要加入这部分内容?
========================================
这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把null插到数据库中,密码部分一样. OleDbsql=String.Format(sb.ToString(),values.ToArray());
能解释一下这个函数是如何工作的吗?
====================================================
这个函数会把数组中索引为0的替换你的CommandText中{0}部分,其实就是一个占位符的替换.这种代码的写法不推荐使用,在.net里直接用OleDbParameter就可以了.OleDbCommand cmd=new OleDbCommand("insert into table (col1,..)values(@value1,..)",cnn);
cmd.Parameters.Add("@value1",txtName.Text);
......
values.Add("'"+u_user1.Text+"'");
else
values.Add("Null"); if(u_pass1.Text==u_pass2.Text)
values.Add("'"+u_pass1.Text+"'");
else
values.Add("Null");
为什么还要加入这部分内容?
========================================
这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把null插到数据库中,密码部分一样. OleDbsql=String.Format(sb.ToString(),values.ToArray());
能解释一下这个函数是如何工作的吗?
====================================================
这个函数会把数组中索引为0的替换你的CommandText中{0}部分,其实就是一个占位符的替换.这种代码的写法不推荐使用,在.net里直接用OleDbParameter就可以了.OleDbCommand cmd=new OleDbCommand("insert into table (col1,..)values(@value1,..)",cnn);
cmd.Parameters.Add("@value1",txtName.Text);
......
private void Bt_submit_Click(object sender, System.EventArgs e)
{
conn=new System.Data.OleDb.OleDbConnection(ConfigurationSettings.AppSettings["strConn"]);
comminster=new System.Data.OleDb.OleDbCommand();
try
{
comminster.CommandText=
"insert into pmembers ("+
"PMB_NAME,PMB_PSWORD,PMB_TNAME,PMB_SEX,PMB_BORDDATE,PMB_MARRY,"+
"PMB_KMH,PMB_HUKOU,PMB_IDENTITY,PMB_PHONE,PMB_UNIVERSITY,PMB_SPECIALITY,"+
"PMB_EXPERIENCE,PMB_STATURE,PMB_WEIGHT,PMB_APPLYFOR,PMB_LANGUAGE,PMB_JOBRESUME,PMB_DESCRIBE"+
") values (@value1,@value2,@value3,@value4,@value5,@value6,@value7,@value8,@value9,@value10,@value11,@value12,@value13,@value14,@value15,@value16,@value17,@value18,@value19)";
comminster.Parameters.Add("@value1",Session["userName"].ToString());
str1=(FormsAuthentication.HashPasswordForStoringInConfigFile(Tb_psw.Text.ToString().Trim(),"MD5"));
str2=str1.Substring(8,str1.Length-16);
comminster.Parameters.Add("@value2",str2);
..........comminster=new System.Data.OleDb.OleDbCommand(comminster.CommandText,conn);
}
catch
{
Response.Redirect("error.aspx");
}
conn.Open();
try
{
comminster.ExecuteNonQuery();
}
catch(System.Data.OleDb.OleDbException oleException)
{
this.Lb_2.Text=oleException.ToString();
this.Lb_2.Visible=true;
}
finally
{
conn.Close();
}
}结果错误信息是:
System.Data.OleDb.OleDbException: 至少一个参数没有被指定值。 at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteNonQuery() at aa.register2.Bt_submit_Click(Object sender, EventArgs e) in d:\inetpub\wwwroot\aa\register2.aspx.cs:line 174