#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 .