我在做一个查询指定字段值的小.NET。
下面是我做的一个数据访问层封装的一个方法。    /// <summary>
    /// 用于执行按照主键进行的查询,并以DataRow离线的方式返回所查询的单条记录
    /// 主要用于根据主键获取单条记录和判断对应的主键是否已被占用
    /// </summary>
    /// <param name="cmdText"></param>
    /// <param name="cmdType"></param>
    /// <param name="isExist">用于判断是否有结果</param>
    /// <param name="cmdParameters"></param>
    /// <returns></returns>
    public static DataRow ExecuteReader(string cmdText, CommandType cmdType,
out Boolean isExist, List<SqlParameter> cmdParameters)
    {
        //打开连接
        Open();
        SqlCommand comm = new SqlCommand();
        comm.Connection = conn;
        comm.CommandText = cmdText;
        comm.CommandType = cmdType;
        if (cmdParameters != null)
        {
            foreach (SqlParameter para in cmdParameters)
                comm.Parameters.Add(para);
        }
        DataTable dataTable = new DataTable();
        SqlDataAdapter ad = new SqlDataAdapter();
        ad.SelectCommand = comm;
        ad.Fill(dataTable);
        comm.Parameters.Clear();
        comm.Dispose();
        Close();
        //利用DataTable内的记录条数判断是否查询出一条记录,有且只能有一条
        if (dataTable.Rows.Count == 1)
        {
            isExist = true;
            return dataTable.Rows[0];
        }
        else
        { isExist = false; }
        return null;
    }下面是我写的一个修改密码的操作,也是发生错误的地方。    protected void imgBtnModifyPwd_Click(object sender, ImageClickEventArgs e)
    {
        //提取用户输入
        string stroldPwd = txtOldPwd.Text.ToString();
        string strnewPwd = txtNewPwd.Text.ToString();
        //判断用户输入的原密码是否正确
        string strcomm = @"select * from admin where adminpwd=@adminpwdold";
        List<SqlParameter> paracomm = new List<SqlParameter>();
        paracomm.Add(DBHelper.CreateParameters("@adminpwdold",DbType.String,30,stroldPwd));
        Boolean blExist;
        DataRow dr = DBHelper.ExecuteReader(strcomm, CommandType.Text,out blExist, null);
        if (blExist==false)
        {
            lbMessage.Text = "您输入的旧密码不正确!";
        }
        else
        {
            //修改密码,更新新密码到数据库
            string strcomm_ = @"update admin set adminpwd=@adminpwd where adminid='admin'";
            List<SqlParameter> para = new List<SqlParameter>();
            para.Add(DBHelper.CreateParameters("@adminpwd",DbType.String,30,strnewPwd));
            Boolean blSuccess=DBHelper.ExecuteNonQuery(strcomm_,CommandType.Text,null);
            if(blSuccess==true)
            {
                lbMessage.Text = "修改密码成功";
            }
            else
            {
                lbMessage.Text = "发生错误";
            }
        }
错误信息:
Must declare the scalar variable "@adminpwdold". 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlClient.SqlException: Must declare the scalar variable "@adminpwdold".源错误: 
行 149:        SqlDataAdapter ad = new SqlDataAdapter();
行 150:        ad.SelectCommand = comm;
行 151:        ad.Fill(dataTable);
行 152:        comm.Parameters.Clear();
行 153:        comm.Dispose();
 源文件: e:\CSharp\Test\SLMS\App_Code\DBHelper.cs    行: 151 堆栈跟踪: 
[SqlException (0x80131904): Must declare the scalar variable "@adminpwdold".]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +925466
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +800118
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +186
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1932
   System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +31
   System.Data.SqlClient.SqlDataReader.get_MetaData() +62
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +1005
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +132
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +122
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +7
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +141
   System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162
   System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +107
   DBHelper.ExecuteReader(String cmdText, CommandType cmdType, Boolean& isExist, List`1 cmdParameters) in e:\CSharp\Test\SLMS\App_Code\DBHelper.cs:151
   ModifyPwd.imgBtnModifyPwd_Click(Object sender, ImageClickEventArgs e) in e:\CSharp\Test\SLMS\ModifyPwd.aspx.cs:33
   System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +86
   System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +115
   System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1746 
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.1433; ASP.NET 版本:2.0.50727.1433 我以前也用过封装的那个方法的。没有问题。不知道这次怎么回事?愁死我了。在线等人帮忙解决。非常紧迫。谢谢了先。

解决方案 »

  1.   

    你写错了,不需要转义符@ string strcomm = @"select * from admin where adminpwd=@adminpwdold"; string strcomm_ = @"update admin set adminpwd=@adminpwd where adminid='admin'";
      

  2.   


    protected void imgBtnModifyPwd_Click(object sender, ImageClickEventArgs e)
        {
            //提取用户输入
            string stroldPwd = txtOldPwd.Text.ToString();
            string strnewPwd = txtNewPwd.Text.ToString();
            //判断用户输入的原密码是否正确
            string strcomm = "select * from admin where adminpwd=@adminpwdold";
            List<SqlParameter> paracomm = new List<SqlParameter>();
            paracomm.Add(DBHelper.CreateParameters("@adminpwdold",DbType.String,30,stroldPwd));
            Boolean blExist;
            DataRow dr = DBHelper.ExecuteReader(strcomm, CommandType.Text,out blExist, null);
            if (blExist==false)
            {
                lbMessage.Text = "您输入的旧密码不正确!";
            }
            else
            {
                //修改密码,更新新密码到数据库
                string strcomm_ = "update admin set adminpwd=@adminpwd where adminid='admin'";
                List<SqlParameter> para = new List<SqlParameter>();
                para.Add(DBHelper.CreateParameters("@adminpwd",DbType.String,30,strnewPwd));
                Boolean blSuccess=DBHelper.ExecuteNonQuery(strcomm_,CommandType.Text,null);
                if(blSuccess==true)
                {
                    lbMessage.Text = "修改密码成功";
                }
                else
                {
                    lbMessage.Text = "发生错误";
                }
            }
      

  3.   


            public static DataRow ExecuteDataTable(string sql, params SqlParameter[] param)
            {
                DataTable dt = new DataTable();
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        if (param != null)
                        {
                            cmd.Parameters.AddRange(param);
                        }
                        SqlDataAdapter sda = new SqlDataAdapter(cmd);
                        sda.Fill(dt);
                        
                    }
                }
                return dt.Rows[0];
            }