我正在尝试从我的CodeBehind中的DetailsView中的标签引用该文本,然后将其传递给存储过程。
我的DetailsView是DetailsView1,两个字段是lblDialID& lblCallbackID。我已将它们转换为TemplateFields。数据填充正确,但是当我试图抓取数据并通过它时,我没有得到任何结果。
存储过程没有执行它的操作,并且变量上的Response.Write不会产生任何结果所以假设我只是抓住空气稀薄:)
这里有什么指导吗?
Protected Sub lnkCBtoPUB_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim Conn As New SqlConnection("Data Source=SERVER;Initial Catalog=DATABASE;User ID=USER;Password=PASSWORD")
Dim MyCommand As New SqlCommand
Dim sDialID As Label = CType(DetailsView1.FindControl("lblDialID"), Label)
Dim sCallbackID As Label = CType(DetailsView1.FindControl("lblCallbackID"), Label)
Conn.Open()
MyCommand.Connection = Conn
MyCommand.CommandType = CommandType.StoredProcedure
MyCommand.CommandText = "spAlterAgentCallback"
MyCommand.Parameters.AddWithValue("@DialID", sDialID.Text)
MyCommand.Parameters.AddWithValue("@CallbackID", sCallbackID.Text)
MyCommand.ExecuteNonQuery()
Conn.Close()
Conn.Dispose()
MyCommand.Dispose()
End Sub
这是存储过程
ALTER PROCEDURE [dbo].[spAlterAgentCallback]
@DialID AS INT,
@CallBackID AS INT
AS
BEGIN
UPDATE DIAL
SET CBDATETIME = GETDATE(),
AgentID = '',
CRC = 'SCBR',
Notes = 'This Record Was Recently a Callback for Another Agent.'
WHERE DialID = @DialID
DELETE FROM CALLBACK WHERE CallBackID = @CallBackID
END
<> 这可能是因为我传递了一个字符串,但是SP将它作为INT吗?这应该不会造成问题吗?
谢谢!
答案 0 :(得分:1)
在您的AddWithValue中,您需要访问标签的Text属性,而不是将Label对象传递到proc中,您应该没问题。
所以:
MyCommand.Parameters.AddWithValue("@DialID", sDialID.Text)
MyCommand.Parameters.AddWithValue("@CallbackID", sCallbackID.Text)
如果你没有得到控件,它会抛出一个NullReferenceException。
修改强>
对于SP,您需要隔离问题发生的位置。尝试从SQL Management Studio运行SProc,提供.NET将传入的参数并确认proc正在运行。如果它确实有效,我会调试你的代码以确保值成为参数。 Integer类型无关紧要,因为.NET稍后会查找该类型。如果您想要安全,可以在将它们发送到Proc之前将它们解析为整数。
<强> EDIT2:强>
您可以尝试以这种方式使用隐藏字段:
(详情视图中的某处)
<asp:HiddenField ID="_CtlDialIDHidden" runat="server" Value='<%#Eval("DialID")%>' />
<asp:HiddenField ID="_CtlCallbackIDHidden" runat="server" Value='<%#Eval("CallbackID")%>' />
并在您的点击事件中
If Request.Form.AllKeys.Contains("_CtlDialIDHidden") Then
MyCommand.Parameters.AddWithValue("@DialID", Request.Form.Item(Request.Form.AllKeys.FirstOrDefault(Function(x As String) x.Contains("_CtlDialIDHidden"))))
End If
If Request.Form.AllKeys.Contains("_CtlCallbackIDHidden") Then
MyCommand.Parameters.AddWithValue("@CallbackID", Request.Form.Item(Request.Form.AllKeys.FirstOrDefault(Function(x As String) x.Contains("_CtlCallbackIDHidden"))))
End If
您可能必须查看源以查看传回的名称的确切内容,而不是使用lambda表达式。