【问题标题】:How to access a returned field from a stored procedure by name in C#如何在 C# 中按名称访问存储过程中返回的字段
【发布时间】:2014-10-15 14:33:22
【问题描述】:

我需要确保从存储过程中获取正确的命名字段,并且我找到的所有示例都通过索引而不是名称访问读取器对象。如何确保从存储过程中返回的字段是绝对正确的字段。

          rdrLogon = myCommand.ExecuteReader()

        If rdrLogon.HasRows Then
            While rdrLogon.Read()
                'userID
                If rdrLogon(0) Is DBNull.Value Then
                    userID = "NULL"
                Else
                    userID = Convert.ToString(rdrLogon(0))
                End If

而不是 rdrLogon(0) 或 (1) 我想使用名称?有人告诉我使用 ExecuteScalar,但我找不到引用字段名称的适当示例。 提前致谢。

这是对经典 asp 的转换,他们是如何做到的: If Not RS_UserAdd.BOF or Not RS_UserAdd.EOF then rspCk=(RS_UserAdd.Fields.Item("userCk").Value) End If

【问题讨论】:

  • 我不确定你的问题,但你可以做rdrLogon["YourFieldName"]
  • 我收到“预期标识符”语法错误,您确定吗?
  • 存储过程返回的结果集的模式是否不确定?
  • @Jodrell 担心是合理的;事情可能会改变;例如 - 有人编辑 proc 并在中间添加一列(因为它与一些相关数据相关联);或者查询使用*,在这种情况下,所有赌注都关闭。我什至知道多租户环境,其中列在不同数据库上的顺序不同,具体取决于该列是否已改装到现有数据库(显然是最后一列),而不是在香草中创建数据库(它可能会处于更“自然”的位置)
  • @MarcGravell,我同意它更灵活,只要不更改列名。我想你可以检查已知的别名。 (事实上​​,我想我在十多年前就写过一些类似的代码。)

标签: .net vb.net stored-procedures


【解决方案1】:

选项(此处使用 C# 语法):

userID = rdrLogon["UserID"];

int colIndex = rdrLogon.GetOrdinal("UserID");
...
userID = rdrLogon.GetString(colIndex);

不过,就我个人而言,我只是通过“dapper”进行绑定:

var users = connection.Query<User>(
    "procName", args, commandType.StoredProcedure).ToList();

dapper 总是按名称绑定。也为您节省了大量不必要的代码。

【讨论】:

  • 对不起各位 vb.net 我有几个不同类型的应用程序
  • @Lyle 可以随意翻译它——它在 VB 中的工作原理基本相同;在我的辩护中,您标记了问题 C# ;p
  • 这些例子是 ExecuteNonQuery 或 ExecuteScalar 的结果,你能提供更多上下文吗?
  • @Lyle 不,他们正在使用您的ExecuteReader 电话中的rdrLogon;如果您有多行和/或多列,ExecuteScalar 将无济于事 - 问题 suggests 存在多行 多列。同样,如果 sproc 是查询ExecuteNonQuery 也无济于事
  • 我正在尝试将其从经典 asp 转换过来,他们就是这样做的:如果不是 RS_UserAdd.BOF 或不是 RS_UserAdd.EOF,则 rspCk=(RS_UserAdd.Fields.Item("userCk" ).Value) 结束如果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多