public static readonly string ConnString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = Data\storage.mdb"
public static readonly string ChangePassword = "update users set userPassword=@userNewPassword where userName=@userName"OleDbConnection conn = new OleDbConnection(ConnString);
OleDbCommand cmd = new OleDbCommand(Constants.ChangePassword,conn);
OleDbParameter paramUserName = new OleDbParameter("@userName", userName);
cmd.Parameters.Add(paramUserName);
OleDbParameter paramUserNewPassword = new OleDbParameter("@userNewPassword", userNewPassword);
cmd.Parameters.Add(paramUserNewPassword);
try
                {
                    conn.Open();
                   cmd.ExecuteNonQuery();                
                    conn.Close();
                    return true;
                    
                }
                catch (OleDbException ex)
                {
                    return false;
                }请问 cmd.ExecuteNonQuery(),参数正确,怎么在数据库中无法更新,请各位大哥多多指教?小弟刚学c#不久

解决方案 »

  1.   

    谢谢!
    ex 没有报错,cmd.ExecuteNonQuery()返回的结果不关怎么样总是0,就是在数据库中无法更新,而sql语句在数据库中运行是没有错误的啊~
      

  2.   

    在数据库中没有找到与参数UserName一样的数据,UserName的类型String的话,OleDbParameter paramUserName = new OleDbParameter("@userName", userName.trim());试一试
      

  3.   

    加了,还是不行啊! 函数为:
    public bool ChangePassword(string userName, string userOldPassword, string userNewPassword)
            {
                if (!Login(userName, userOldPassword))
                {
                    return false;
                }
                else
                {
                    OleDbConnection conn = new OleDbConnection(Constants.ConnString);
                    OleDbCommand cmd = new OleDbCommand(Constants.ChangePassword, conn);
                    OleDbParameter paramUserName = new OleDbParameter("@userName", userName);
                    cmd.Parameters.Add(paramUserName);
                    OleDbParameter paramUserNewPassword = new OleDbParameter("@userNewPassword", userNewPassword);
                    cmd.Parameters.Add(paramUserNewPassword);
                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();
                        return true;                }
                    catch (OleDbException ex)
                    {
                        return false;
                    }
                    finally
                    {
                        if (conn.State == ConnectionState.Open)
                        {
                            conn.Close();
                        }
                    }
                }
            }调用:bool result = userDB.ChangePassword(GlobalInfo.UserName.Trim(), this.txtOldPassword.Text.Trim(), this.txtNewPassword.Text.Trim());请各位指点指点啦!谢谢!
      

  4.   

    我也碰到相同的问题,最后我还是把所有更新的操作换成了sql语句,up下。
      

  5.   

    Access不是SqlServer, SqlServer用具名参数 @ParaName 格式, Access是用参数索引吧 ?index
    格式
      

  6.   

    cmd.ExecuteNonQuery()  上述方法是不是不能用于acess数据库的更新和插入啊,急等高手指点!!
      

  7.   

    ExecuteNonQuery是可以用于Access数据库的
    代码上没看出什么问题
    应该是你设计上的问题吧
    另外,用Access数据库的mdb文件要放在debug目录下,在项目目录下没行的,请检查一下
      

  8.   

    谢谢!
    我将数据库文件放到了项目文件夹了,连接没有问题,程序中能查询操作,但就是不能更新和插入,不知道问题出在哪?而sql语句在acess查询中没有问题,无奈!
    请各位大哥继续指点迷津啊!
      

  9.   

    有没有可能是Access数据库权限的问题啊?
      

  10.   

    谢谢!
    我将数据库文件放到了项目文件夹了,连接没有问题,程序中能查询操作,但就是不能更新和插入,不知道问题出在哪?而sql语句在acess查询中没有问题,无奈!
    请各位大哥继续指点迷津啊!
    ===================================
    我说的是要放在debug目录下,放在项目目录下是不行的,但你说能查询,可能不是这个问题,不过还是copy一个mdb文件到debug中试试
    另外你可以中断一下
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    return true;
    一句一句看是不是有没执行的
    然后再试试用sql语句看看
      

  11.   

    这句出的问题:public static readonly string ChangePassword = "update users set userPassword=@userNewPassword where userName=@userName"
    改成
    public static readonly string ChangePassword = "update users set userPassword='@userNewPassword' where userName='@userName'";
    试试
      

  12.   

    谢谢 zoom3000s、laidon 以及dyjqk
    按你们的方法做了,可能不是这方面的问题,还不行啊
    进一步探索中......
      

  13.   

    public static readonly string ConnString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = Data\storage.mdb"
    public static readonly string ChangePassword = "update users set userPassword=? where userName=?"OleDbConnection conn = new OleDbConnection(ConnString);
    OleDbCommand cmd = new OleDbCommand(Constants.ChangePassword,conn);
    OleDbParameter paramUserNewPassword = new OleDbParameter("@userNewPassword", userNewPassword);
    cmd.Parameters.Add(paramUserNewPassword);
    OleDbParameter paramUserName = new OleDbParameter("@userName", userName);
    cmd.Parameters.Add(paramUserName);
    try
    {
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    return true;}
    catch (OleDbException ex)
    {
    return false;
    }Access不支持具名参数,注意Parameters集合中参数的顺序
      

  14.   

    谢谢!but:
    public static readonly string userLoginString = "select count(*) from users where userName = @userName and userPassword = @userPassword ";cmd.ExecuteNonQuery(); 能进行查询,说明acess能用具名参数
    对于参数顺序,我试了一下,还是没有解决啊!
      

  15.   

    你看看ACCESS数据库文件是不是只读的!
      

  16.   

    给楼主整理一下,希望能够帮上忙:
    1 检查数据库文件,是否为只读,若NTFS检查是否有权限问题
    2 检查数据库结构,是否存在外键或主键约束问题。可将该语句直接放入Access的查询中执行看是否正确。
    3 逐行调试程序语句,看执行cmd.ExecuteNonQuery()后有没有Exception内容其他应该没有什么问题了。补充一下,楼主的代码写得很乱
      

  17.   

    谢谢!
    都试了,还是不行啊!郁闷!看来我得换成sql server数据库啦
      

  18.   

    要是执行的查询语句 
    ExecuteNonQuery()函数是不行的该函数返回影响的行数
      

  19.   

    /// <summary>
            /// 新建用户资料
            /// </summary>
            /// <param name="sacc"></param>
            /// <param name="spw"></param>
            /// <param name="snanme"></param>
            /// <param name="slv"></param>
            /// <returns></returns>
            public bool saveUser(string sacc, string spw, string snanme, string slv,string dTime)
            {
                string sql = "";
                sql = "insert into [Admin]" +            "(user_name,user_acc,user_pw,user_lv,user_date)" +
                " values('" +
                    sacc + "','" +
                    spw + "','" +
                    snanme + "','" +
                    slv + "',#" +
                    dTime + "#)";            try
                {
                    this.ExecuteSql(sql);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }            return true;
            }        /// <summary>
            /// 执行SQL语句,返回影响的记录数
            /// </summary>
            /// <param name="SQLString"></param>
            /// <returns></returns>
            public int ExecuteSql(string SQLString)
            {
                using (OleDbConnection connection = new OleDbConnection(connectionString))
                {
                    using (OleDbCommand cmd = new OleDbCommand(SQLString, connection))
                    {
                        try
                        {
                            connection.Open();
                            int rows = cmd.ExecuteNonQuery();
                            return rows;
                        }
                        catch (System.Data.OleDb.OleDbException E)
                        {
                            throw new Exception(E.Message);
                        }
                    }
                }
            }--------------->
    调用:saveUser(TextBox1.text,TextBox2.text,TextBox3.text,TextBox4.text,TextBox5.text);
      

  20.   

    检查下SQL语句中是否有ACCESS关键字
      

  21.   

    我以前也遇到过相同的问题,就是Parameters集合中参数的顺序。不知道你的现象是不是和我的一样了。
    public static readonly string ConnString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = Data\storage.mdb"
    public static readonly string ChangePassword = "update users set userPassword=@userNewPassword where userName=@userName"OleDbConnection conn = new OleDbConnection(ConnString);
    OleDbCommand cmd = new OleDbCommand(Constants.ChangePassword,conn);
    OleDbParameter paramUserNewPassword = new OleDbParameter("@userNewPassword", userNewPassword);
    cmd.Parameters.Add(paramUserNewPassword);
    OleDbParameter paramUserName = new OleDbParameter("@userName", userName);
    cmd.Parameters.Add(paramUserName);
    try
                    {
                        conn.Open();
                       cmd.ExecuteNonQuery();                
                        conn.Close();
                        return true;
                        
                    }
                    catch (OleDbException ex)
                    {
                        return false;
                    }
      

  22.   

    好像把就是Parameters集合中参数的顺序跳过来都不行哦.
    public static  string ConnString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = data\storage.mdb";
            public static string ChangePassword = "update users set userPassword='@userNewPassword' where userName='@userName'";
             
      
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
              OleDbConnection conn = new OleDbConnection(ConnString);
               OleDbCommand cmd = new OleDbCommand(ChangePassword, conn);OleDbParameter paramUserNewPassword = new OleDbParameter("@userNewPassword", userNewPassword);
                cmd.Parameters.Add(paramUserNewPassword);
                OleDbParameter paramUserName = new OleDbParameter("@userName", userName);
                cmd.Parameters.Add(paramUserName);
                
                try
                {
                    conn.Open();
                    MessageBox.Show(cmd.ExecuteNonQuery().ToString());               
                    conn.Close();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show(ex.ToString());
                }
      

  23.   

    使用OleDbCommand连接ACCESS数据库的时候,SQL语句中的参数不能直接写参数名字,如"@userName",而应该将参数的名字改成"?",一律使用问号代表参数,并且在添加参数的时候,要注意SQL语句中参数的顺序.
    虽然你已经接帖了,我还是说一下这个问题.
      

  24.   

    TO:lilionline(一滴水的海),还是不行啊.
    public static  string ConnString = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = data\storage.mdb";
            public static string ChangePassword = "update users set userPassword=? where userName=?";
            
            private void button1_Click(object sender, EventArgs e)
            {
                OleDbConnection conn = new OleDbConnection(ConnString);
                OleDbCommand cmd = new OleDbCommand(ChangePassword, conn);
                //下面参数中"?"改成"@userNewPassword"也不行..
                OleDbParameter paramUserNewPassword = new OleDbParameter("?", userNewPassword);
                cmd.Parameters.Add(paramUserNewPassword);
                OleDbParameter paramUserName = new OleDbParameter("?", userName);
                cmd.Parameters.Add(paramUserName);
      

  25.   

    TO:gaoyingjun(高颖君) 
       你在Command里的参数不要用"?",把OleDbParameter paramUserNewPassword = new OleDbParameter("?", userNewPassword);改成OleDbParameter paramUserNewPassword = new OleDbParameter("@userPassword", userNewPassword);   SQL语句,就按照你现在的,写成:update users set userPassword=? where userName=?
       同时,你还有一个重要的错误,你的OleDbCommand的CommandType属性没有设置成StoredProcedure,你要在执行Execute方法前,加这样一句:
     cmd.CommandType = CommandType.StoredProcedure;