【问题标题】:SqlDataReader does not have the correct columns countSqlDataReader 没有正确的列数
【发布时间】:2023-03-20 16:10:01
【问题描述】:

我正在使用 asp.net (webforms) 和 C# 设计一个网站。我有一个有 23 列的表。

在下面的代码中,reader 是一个 SqlDataReader,而 command 是一个 SqlCommand 对象。我正在使用以下代码从中输出查询结果:

command.CommandText = "SELECT * FROM devices WHERE device_level='" + ACCESS_LVL + "'" + "ORDER BY device_name";
reader = command.ExecuteReader();

然后我使用

循环遍历它
while(reader.Read());

输出结果。

但是访问某些列会导致索引超出范围异常(索引超过 17)。我的表有 23 列,但 reader.FieldCount 只返回 18。

调试代码时,我的本地计算机上没有发生此问题。只有当我将项目上传到我的网络服务器时才会发生这种情况。

使用 mylittleadmin 数据库管理面板(安装在远程服务器上)我可以看到所有 23 列。

【问题讨论】:

  • 请学习参数化你的 SQL。 "WHERE device_level='" + ACCESS_LVL + "'" 对注入开放,需要尽快更改。
  • 你也不应该使用SELECT *,而是列出你明确期望的列
  • 这很清楚地表明您的两个数据库在这些表中没有相同的列。
  • 不可能使用相同的查询在同一个数据库上查询同一张表并得到不同的列。
  • @SeanLange 如果您将其作为两个不同的登录名进行查询,并且存在特定于登录名的对象(意思是:两个不同架构中的对象 - 可能是 abolfa.devicesdbo.devices),则可以这样做

标签: c# asp.net sql-server sqldatareader


【解决方案1】:

这里的 SQL 服务器是正确的。如果 SELECT * FROM devices ... 返回 18 列,则:正在连接的数据库上的 devices 对象:有 18 列。听起来您已经让您的模式在不同的环境/数据库之间产生分歧。或者:您可能有多个登录名和特定于登录名的对象(即同一数据库中两个不同数据库模式中的对象),因此:当您查询它时 您会看到 一个 对象为devices - 当您作为应用程序帐户 查询它时,您会看到一个不同 对象。通常,这将是 dbo.devicesabolfa.devices(例如)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多