我尝试在登录后获取字段(用户访问级别,字符串格式为1或2)的值
OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dsms.accdb");
connection.Open();
OleDbDataReader reader = null;
OleDbCommand command = new OleDbCommand("SELECT AL From Users WHERE Username='" + textusername.text + "'", connection);
reader = command.ExecuteReader();
if( reader.HasRows)
{
MessageBox.Show("success","status");
label1.Text = reader.GetString(1);
}
else
MessageBox.Show("failur", "status");
connection.Close();我确实在Access中执行了代码,它完全没有问题,但在程序中,它显示“行/列没有数据存在”
发布于 2019-11-12 17:56:35
代码中的主要问题是您需要调用reader.Read()来从DataReader中获取任何内容。仅仅调用HasRows并不能将阅读器定位在查询的第一条记录上。
您的代码中还存在其他问题。像连接、命令和读取器这样的可处理对象应该在using语句中创建,以确保在使用后进行正确的处理,而且因为查询中只有一个字段,所以应该使用索引0来检索它,而不是1。
最后是最重要的一个。不应通过连接字符串来生成sql查询。通过这种方式,恶意用户可以在您的文本框中编写任何内容,甚至可以对您的数据库执行有效的sql命令。它被称为Sql注入,如果你搜索这些术语,你会发现关于它的非常详细的讨论。但是,为了避免这个问题(以及其他问题,如使用撇号解析输入),您可以使用如下所示的参数化查询。
using(OleDbConnection connection = new OleDbConnection(.....))
using(OleDbCommand command = new OleDbCommand("SELECT AL From Users WHERE Username=@name", connection);
{
connection.Open();
command.Parameters.Add("@name", OleDbType.VarWChar).Value = txtusername.text;
using(OleDbDataReader reader = command.ExecuteReader())
{
if( reader.Read())
{
MessageBox.Show("success","status");
label1.Text = reader.GetString(0);
}
else
MessageBox.Show("failur", "status");
}
} https://stackoverflow.com/questions/58816021
复制相似问题