错误:类型’System.Data.OleDb.OleDbDataReader’没有定义构造函数

我试图用ms访问数据库更改密码选项….

请帮帮我…

这里的代码是:default.aspx.cs

protected void Button1_Click(object sender, EventArgs e) { try { OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["vhgroupconnection"].ConnectionString); myCon.Open(); string userid = txtuserid.Text; string oldpass = txtoldpass.Text; string newPass = txtnewpass.Text; string conPass = txtconfirmpass.Text; string q = "select user_id,passwd from register where user_id = @userid and passwd = @oldpass"; OleDbCommand cmd = new OleDbCommand(q, myCon); OleDbDataReader reader = new OleDbDataReader(); cmd.Parameters.AddWithValue("@userid", txtuserid.Text); cmd.Parameters.AddWithValue("@oldpass", txtoldpass.Text); reader = cmd.ExecuteReader(); reader.Read(); if (reader["user_id"].ToString() != String.Empty && reader["passwd"].ToString() != String.Empty) { if (newPass.Trim() != conPass.Trim()) { lblmsg.Text = "New Password and old password does not match"; } else { q = "UPDATE register SET passwd = @newPass WHERE user_id =@userid"; cmd = new OleDbCommand(q, myCon); cmd.Parameters.AddWithValue("@newPasss", txtnewpass.Text); cmd.Parameters.AddWithValue("@userod", txtuserid.Text); cmd.Parameters.AddWithValue("@passwd", txtoldpass.Text); int count = cmd.ExecuteNonQuery(); if (count > 0) { lblmsg.Text = "Password changed successfully"; } else { lblmsg.Text = "password not changed"; } } } } catch (Exception ex) { throw ex; } } 

还请检查…..

编译错误说明:在编译为此请求提供服务所需的资源期间发生错误。 请查看以下特定错误详细信息并相应地修改源代码。

编译器错误消息:CS0143:类型’System.Data.OleDb.OleDbDataReader’没有定义构造函数

来源错误:

 Line 36: OleDbCommand cmd = new OleDbCommand(q, myCon); Line 37: Line 38: OleDbDataReader reader = new OleDbDataReader(); Line 39: Line 40: 

正如错误信息所说; OleDbDataReader没有构造函数。

来自OleDbDataReader文档 ;

要创建OleDbDataReader ,必须调用OleDbCommand对象的ExecuteReader方法,而不是直接使用构造函数。

您可以使用返回OleDbDataReader ExecuteReader方法

 OleDbDataReader dr = cmd.ExecuteReader(); 

并且您需要调用ExecuteReader方法之前添加参数值。

也可以使用using语句来配置你的OleDbConnectionOleDbCommandOleDbDataReader类的;

 using(OleDbConnection myCon = new OleDbConnection(conString)) using(OleDbCommand cmd = myCon.CreateCommand()) { //Define your sql query and add your parameter values. using(OleDbDataReader dr = cmd.ExecuteReader()) { // } } 

正如Steve所提到的 , OleDbDataReader.Read方法返回boolean值( truefalse ),并逐行读取OleDbDataReader结果。 您可能需要考虑在while语句中使用此方法的结果。 例如;

 while(reader.Read()) { //Reads your results until the last row.. } 

最后,我强烈怀疑您将密码存储为纯文本。 不要那样做! 使用SHA-512哈希 。

正如MSDN明确指出的那样, To create an OleDbDataReader, you must call the ExecuteReader method of the OleDbCommand object, instead of directly using a constructor.

你无法使用new实例化它,这就是你正在做的事情,这就是你得到错误的原因。 删除有问题的行并将其更改为此以消除错误:

 OleDbDataReader reader = cmd.ExecuteReader(); 

此外,请记住using块来确保资源得到妥善处理。

 using(OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["vhgroupconnection"].ConnectionString)) { OleDbCommand cmd = new OleDbCommand(q, myCon); //Add parameters etc OleDbDataReader reader = cmd.ExecuteReader(); //Rest of the processing } 

问题 :您尝试通过调用new OleDbDataReader()来创建OleDbDataReader的新实例,而不是应该使用OleDbCommand.ExecuteReader()创建一个阅读器。

在下面的代码中, using语句(这应该确保连接关闭或读取器关闭OleDbDataReader的情况)。

 protected void Button1_Click(object sender, EventArgs e) { try { string sConnString = ConfigurationManager.ConnectionStrings["vhgroupconnection"].ConnectionString; using(OleDbConnection myCon = new OleDbConnection(sConnString)) { myCon.Open(); string userid = txtuserid.Text; string oldpass = txtoldpass.Text; string newPass = txtnewpass.Text; string conPass = txtconfirmpass.Text; string q = "select user_id,passwd from register where user_id = @userid and passwd = @oldpass"; OleDbCommand cmd = new OleDbCommand(q, myCon); cmd.Parameters.AddWithValue("@userid", txtuserid.Text); cmd.Parameters.AddWithValue("@oldpass", txtoldpass.Text); string sUserId = string.Empty; string sPass = string.Empty; using(OleDbDataReader reader = cmd.ExecuteReader()) { if(reader.Read()) //assumption: one record returned { sUserId = reader["user_id"].ToString(); sPass = reader["passwd"].ToString(); } } if (sUserId != string.Empty && sPass != string.Empty) { if (newPass.Trim() != conPass.Trim()) lblmsg.Text = "New Password and old password does not match"; else { q = "UPDATE register SET passwd = @newPass WHERE user_id =@userid"; cmd = new OleDbCommand(q, myCon); cmd.Parameters.AddWithValue("@newPass", txtnewpass.Text); cmd.Parameters.AddWithValue("@userid", txtuserid.Text); int count = cmd.ExecuteNonQuery(); if (count > 0) lblmsg.Text = "Password changed successfully"; else lblmsg.Text = "password not changed"; } } } } catch (Exception ex) { throw ex; } }