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里的的处理函数。
                        

解决方案 »

  1.   

    1、那部分内容是在做服务端验证,目的是检测用户名是否为空和重复输入的密码是否和密码相同。
    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(); }
      

  2.   

    回 lr2651(戎 The Return Of The King) :
    对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()有什么用?
      

  3.   

    对3、 
    我捕获到异常的信息为:
    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看不懂,对“操作必须使用一个可更新的查询”是哪的错呢?
      

  4.   

    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");
    为什么还要加入这部分内容?
    ========================================
    这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把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);
    ......
      

  5.   

    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");
    为什么还要加入这部分内容?
    ========================================
    这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把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);
    ......
      

  6.   

    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");
    为什么还要加入这部分内容?
    ========================================
    这段代码是如果你的用户名的文本框中输入空串或者说没有输入,那就把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);
    ......
      

  7.   

    我这样写buttom的函数
    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