VB.NET Ссылка на текст метки в DetailsView

#asp.net #sql #vb.net #syntax

#asp.net #sql #vb.net #синтаксис

Вопрос:

Я пытаюсь сослаться на текст из метки в DetailsView в моем CodeBehind, а затем передать его через хранимую процедуру.

Мой DetailsView — DetailsView1, а два поля — lblDialID и lblCallbackID . Я преобразовал их в TemplateFields. Данные заполняются правильно, но когда я пытаюсь получить данные и передать их, я не получаю никаких результатов.

Хранимая процедура выполняет не свое действие, а ответ.Запись в переменные не дает никаких результатов, поэтому предполагается, что я просто хватаю воздух 🙂

Какие-либо рекомендации здесь?

 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? Это не должно создавать проблемы, хотя?

Спасибо!

Ответ №1:

Похоже, что в вашем AddWithValue вам нужно получить доступ к текстовому свойству меток вместо передачи объекта Label в proc, и все должно быть в порядке.

Итак:

 MyCommand.Parameters.AddWithValue("@DialID", sDialID.Text)
MyCommand.Parameters.AddWithValue("@CallbackID", sCallbackID.Text)
  

Если бы вы не получали элементы управления, это вызвало бы исключение NullReferenceException.

Редактировать:

Что касается SP, вам нужно изолировать, где возникает проблема. Попробуйте запустить SProc из SQL Management Studio, указав параметры, которые .NET передаст и подтвердит, что процедура запущена. Если это сработает, я бы отладил ваш код, чтобы убедиться, что значения попадают в параметры. Целочисленный тип не должен иметь значения, потому что .NET ищет тип позже. Если вы хотите быть в безопасности, вы могли бы разобрать их на целые числа, прежде чем отправлять их в процесс.

ПРАВКА2:

Вы могли бы попробовать использовать скрытые поля таким образом:

(Где-нибудь в вашем detailsview)

 <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
  

Возможно, вам придется просмотреть исходный код, чтобы точно увидеть, какое имя передается обратно, вместо использования лямбда-выражений.

Комментарии:

1. Я внес соответствующие изменения, и я не могу получить желаемые результаты.

2. Хранимая процедура довольно проста. Я добавил описанную выше хранимую процедуру.

3. @RogueSpear00 Возможно ли, что вы привязываете представление сведений к данным до выполнения этого кода (например, при загрузке страницы)? В этом случае значения могут отсутствовать, когда вы переходите к их поиску. Если это находится в сообщении формы, попробуйте создать скрытые поля для хранения ваших значений и поиска их в запросе. Сформировать объект и передать эти значения в параметры SProc.

4. @RogueSpear00 Ваши селекторы для меток выглядят правильно. Если при отладке вы не видите значений для свойства label.text, хотя знаете, что оно там было, возможно, вы столкнулись с проблемой жизненного цикла страницы. Я не уверен, как выглядит остальная часть вашего кода, но вы могли бы использовать скрытые поля для сохранения данных, которые вы ищете. Подробнее о жизненном цикле страницы здесь: msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events С особым акцентом на события управления, события предварительной загрузки и события предварительной загрузки. Смотрите мою правку, чтобы понять, что я имею в виду со скрытыми полями.

5. Вы помещаете точки останова в метод lnkCBtoPUB_Click, и точки останова не срабатывают? Убедитесь, что установлен OnClick кнопки LinkButton. Обычно вы можете поместить предложение handles после метода, такого как lnkCBtoPUB_Click(ввод объекта в качестве отправителя, ввод e в качестве системы. EventArgs) обрабатывает lnkCBtoPUB_Click.Click , но поскольку он находится в detailsview, вы должны установить свойство OnClick .