首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OleDbDataReader读取数据

使用OleDbDataReader读取数据
EN

Stack Overflow用户
提问于 2019-11-12 17:50:32
回答 1查看 30关注 0票数 1

我尝试在登录后获取字段(用户访问级别,字符串格式为1或2)的值

代码语言:javascript
复制
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中执行了代码,它完全没有问题,但在程序中,它显示“行/列没有数据存在”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-12 17:56:35

代码中的主要问题是您需要调用reader.Read()来从DataReader中获取任何内容。仅仅调用HasRows并不能将阅读器定位在查询的第一条记录上。

您的代码中还存在其他问题。像连接、命令和读取器这样的可处理对象应该在using语句中创建,以确保在使用后进行正确的处理,而且因为查询中只有一个字段,所以应该使用索引0来检索它,而不是1。

最后是最重要的一个。不应通过连接字符串来生成sql查询。通过这种方式,恶意用户可以在您的文本框中编写任何内容,甚至可以对您的数据库执行有效的sql命令。它被称为Sql注入,如果你搜索这些术语,你会发现关于它的非常详细的讨论。但是,为了避免这个问题(以及其他问题,如使用撇号解析输入),您可以使用如下所示的参数化查询。

代码语言:javascript
复制
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");
    } 
}    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58816021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档