从存储过程中检索数据

Posted

技术标签:

【中文标题】从存储过程中检索数据【英文标题】:Retrieve Data from Stored Procedure 【发布时间】:2017-07-11 19:58:08 【问题描述】:

我在这里的存储过程调用似乎遇到了问题。我正在尝试从存储过程中获取我的所有信息,该存储过程将单个列返回到数据表中。我在这里遵循了大多数解决方案,但似乎无法弄清楚为什么它不起作用。我的数据表有一个主键约束,因为它有多个值。但是,根据我的阅读,这不是必需的,因为 SqlDataAdapter 上的 Fill 只会合并这些更改(如果有的话)?

到目前为止,这是我的代码:

Dim dtValues As New DataTable()

Dim dtCol As New DataColumn()
dtCol.ColumnName = "ReferenceID"
dtCol.DataType = GetType(SqlInt32)
dtCol.AllowDBNull = False

dtValues.Columns.Add(dtCol)
dtValues.PrimaryKey = dtCol

Public Shared Sub ExecStoredProc(ByVal ProcName As String, ByRef connection As SqlConnection, ByRef dtValues As DataTable, ByVal ParamArray args() As Object)
    Dim sqlCommand As New SqlCommand()

    For i = 0 To args.Length - 1 Step 2
        sqlCommand.Parameters.AddWithValue(CStr(args(i)), args(i + 1))
    Next

    sqlCommand.CommandText = ProcName
    sqlCommand.CommandType = CommandType.StoredProcedure
    sqlCommand.Connection = connection

    Dim sqlAdp As New SqlDataAdapter(sqlCommand)
    ' Fill the table to mess around with.
    sqlAdp.Fill(dtValues)

End Sub

但是,我得到的错误是:

未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。

我调用的存储过程很简单

Select ID 
From TableName 
Where Reference = @Reference

真的没有条件,我已经测试过,它返回了大约 19 条唯一记录。

任何帮助将不胜感激,谢谢!

【问题讨论】:

你在哪一行得到错误? 您创建了一个名为 ReferenceID 的列。然后你说它是你的数据表的主键,但你没有为它提供任何值。如果您使用存储过程来填充数据表,只需删除所有不必要的列定义。只需创建一个新的 DataTable,然后调用您的 Fill 方法。 @Fabulous 我得到这条线的错误(并捕获异常)在 sqlAdp.Fill 上。 @Sean 我知道它被设置为主键,但这并不意味着我不能设置主键而不是填充值,不是吗?不过看了MSDN上的Fill命令,好像Fill只会得到第一个结果? @SeanLange 我认为你是对的。我推迟发表评论,认为存储过程的参数可能没有获得值但错过了那一行。 Annnnnnnd 我很笨。您也完全正确地设置了主键。我最初返回了一个不同的名称Select ReferenceID as Item。更改它,添加主键,使用数据集而不是数据表(复制所有值),现在可以开始了。非常感谢您指出我的小错误! 【参考方案1】:

您正在表中定义一个名为“ReferenceID”的非空主键数据列:

Dim dtCol As New DataColumn()
dtCol.ColumnName = "ReferenceID"
dtCol.DataType = GetType(SqlInt32)
dtCol.AllowDBNull = False

但是,您的 sql 查询并未选择 1ReferenceID1 列,而是选择了名为 ID 的列:

Select ID 
From TableName 
Where Reference = @Reference

因此,当您填写表格时,您会收到错误消息:

未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。

因为违反了您在“ReferenceID”上设置的非空唯一约束。

将您的查询更改为:

Select ID as [ReferenceId]
From TableName 
Where Reference = @Reference

你应该被设置(假设ID是唯一的而不是空的)

【讨论】:

以上是关于从存储过程中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将表从存储过程检索到数据表?

从返回多个实际表的复杂存储过程中检索 asp.net MVC 中的数据

从 SQL Server 中检索各种存储过程的数据的单一方法,如何处理参数?

如何从 SQL Server 中的存储过程中检索参数列表

从存储过程中检索出参数?

使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)