【问题标题】:reading data with OleDbDataReader使用 OleDbDataReader 读取数据
【发布时间】:2020-03-08 00:08:35
【问题描述】:

我正在尝试在登录后获取字段的值(用户访问级别为字符串格式的 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 中执行了代码,一切都很好 但在程序中,它说“行/列不存在数据”

【问题讨论】:

  • 您需要先调用 reader.Read() 才能尝试阅读任何内容

标签: c# .net database ms-access


【解决方案1】:

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

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

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

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");
    } 
}    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2017-01-27
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多