最近需要做个项目,把一个库存管理系统原有的SQL数据库变为ACCESS数据库。改了很多SQL变OLEDB,还是出现无法解决错误。代码如下:
      #region  用户登录
        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="P_str_UserName">用户名</param>
        /// <param name="P_str_UserPwd">用户密码</param>
        /// <returns>返回一个int类型的值</returns>
        public int UserLogin(string P_str_UserName, string P_str_UserPwd)
        {
            OleDbConnection Oledbcon = datacon.getcon();
            OleDbCommand aCommand = new OleDbCommand("proc_Login", Oledbcon);
            aCommand.CommandType = CommandType.StoredProcedure;
            aCommand.Parameters.Add("@UserName", OleDbType.VarChar, 20).Value = P_str_UserName;
            aCommand.Parameters.Add("@UserPwd", OleDbType.VarChar, 20).Value = P_str_UserPwd;
            OleDbParameter returnValue = aCommand.Parameters.Add("returnValue", OleDbType.Integer, 4);  
            returnValue.Direction = ParameterDirection.ReturnValue;
            Oledbcon.Open();
            try
            {
                aCommand.ExecuteScalar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
            finally
            {
                aCommand.Dispose();
                Oledbcon.Close();
                Oledbcon.Dispose();
            }
            int P_int_returnValue = (int)returnValue.Value;
            return P_int_returnValue;
        }
        #endregion红色两行代码提示报错。根据错误提示找到在frmLogin模块,红色部分。
       private void btnLogin_Click(object sender, EventArgs e)
        {
            int P_int_returnValue = doperate.UserLogin(cboxUName.Text.Trim(), txtPwd.Text.Trim());            if (P_int_returnValue == 100)
            {
                M_str_name = cboxUName.Text;
                M_str_pwd = txtPwd.Text.Trim();
                frmMain fmain = new frmMain();
                this.Hide();
                fmain.Show();
            }
            if (P_int_returnValue == -100)            {
                MessageBox.Show("用户名或密码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtPwd.Text = "";
                cboxUName.Focus();
            } 
        }报出错误为int P_int_returnValue = (int)returnValue.Value;未将对象引用设置到对象的实例。求解数据库编程语言C#

解决方案 »

  1.   

    doperate.UserLogin()
    把它贴出来
      

  2.   

    Access数据库和SQL数据库的数据类型有些是不一样的,有些SQL的数据类型在Access里面是不兼容的。需要去改数据类型。
      

  3.   

    工厂模式啊,兄弟,为什么要改以前的,直接添加acess的数据库访问层怎么样?
      

  4.   

        public partial class frmLogin : Form
        {
            public static string M_str_name;//记录登录用户名字
            public static string M_str_pwd;//记录登录用户密码
            public static string M_str_right;//记录登录用户的权限
            BaseClass.DataCon datacon = new SMS.BaseClass.DataCon();
            BaseClass.DataOperate doperate = new SMS.BaseClass.DataOperate();
            public frmLogin()
            {
                InitializeComponent();
            }
     
            private void frmLogin_Load(object sender, EventArgs e)
            {
                doperate.cboxBind("select UserName from tb_User", "tb_User", "UserName", cboxUName);
            }        private void btnLogin_Click(object sender, EventArgs e)
            {
                int P_int_returnValue = doperate.UserLogin(cboxUName.Text.Trim(), txtPwd.Text.Trim());
                if (P_int_returnValue == 100)
                {
                    M_str_name = cboxUName.Text;
                    M_str_pwd = txtPwd.Text.Trim();
                    frmMain fmain = new frmMain();
                    this.Hide();
                    fmain.Show();
                }
                if (P_int_returnValue == -100)
                {
                    MessageBox.Show("用户名或密码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    txtPwd.Text = "";
                    cboxUName.Focus();
                } 
            }
      

  5.   


    这个我也修改了哎。不过不知道修改的对不对。修改完之后是提示错误。我看到有个帖子是说:
    由于access不需要返回值。因此CreateCommand函数里面不需要如下部分:[csharp] view plaincopyprint?
    01.cmd.Parameters.Add(  
    02.            new SqlParameter("ReturnValue", SqlDbType.Int, 4,  
    03.            ParameterDirection.ReturnValue, false, 0, 0,  
    04.            string.Empty, DataRowVersion.Default, null));  
    cmd.Parameters.Add(
                new SqlParameter("ReturnValue", SqlDbType.Int, 4,
                ParameterDirection.ReturnValue, false, 0, 0,
                string.Empty, DataRowVersion.Default, null));        如果不把该部分去掉,依然照搬操作SQL的代码。将出现报错“异常详细信息: System.InvalidOperationException: System.Data.OleDb.OleDbDataAdapter 内部错误: 无效的参数访问器: 2 BADBINDINFO。”               如果碰到类似错误,不妨按照上述的把返回值注释掉。
    所以我就不知道修改什么了。。
      

  6.   


    因为我用到的access访问系统表操作比较简单。所以想换一下直接添加access数据库访问层不需要修改原来的SQL语句么??
      

  7.   

    要改一些语句, access的insert 要加into
      

  8.   


    我这里没有insert吧额现在就是用户登陆进去就提示System.Data.OleDb.OleDbDataAdapter 内部错误: 无效的参数访问器: 2 BADBINDINFO。”  然后错误就被定位到int P_int_returnValue = (int)returnValue.Value;未将对象引用设置到对象的实例。这个是需要改动些什么么??
      

  9.   

    sqlparameter好像是处理sqlserver的吧..你换成oledbParameter试试
      

  10.   

    sql语句先去access的查询分析器执行下。排除不是语句兼容问题再看程序不会开access的查询分析器 可以去百度
      

  11.   

    报出错误为int P_int_returnValue = (int)returnValue.Value;未将对象引用设置到对象的实例
    这个错误是说你那个reurnValue.Value 是空的。。跟踪下看看怎么来的
      

  12.   


    我查过了,SQL语句没有问题。继续求助。。