从存储过程中检索数据
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 中的数据