Отличный вывод хранимой процедуры в SSMS и ASP.NET - PullRequest
0 голосов
/ 26 апреля 2019

Я создал хранимую процедуру для включения нового пользователя для моей системы.Параметры: Имя, Почта и Пароль (все varchar).Хранимая процедура сначала проверяет, находится ли почта в базе данных.Если нет, то информация добавляется в таблицу.В конце выдается таблица с пользовательскими данными.

CREATE PROCEDURE [dbo].[user_new]
    (@name VARCHAR(50), 
     @mail VARCHAR(50),
     @password VARCHAR(100)
)
AS
BEGIN           
    SET NOCOUNT ON

    DECLARE @exist INT

    SELECT @exist = COUNT([id]) 
    FROM [dbo].[User] 
    WHERE [mail] = @mail

    IF @exist = 0
        INSERT INTO [dbo].[User] ([name], [mail], [password]) 
        VALUES (@name, @mail, @password)

    SELECT 
        @exist AS [exist], [id], [name], [mail] 
    FROM 
        [dbo].[User] 
    WHERE 
        [mail] = @mail
END
GO

Когда я выполняю хранимую процедуру в SSMS, все работает нормально: когда я вставляю новое письмо, поле [exist] возвращает 0.Когда я вставляю письмо, которое уже существует, поле [exist] возвращает 1. Пока все хорошо.

Когда я выполняю хранимую процедуру из моего приложения .NET (в котором работает много других вызововхорошо), ошибка происходит: неважно, если я пытаюсь добавить новое или существующее письмо, [exist] всегда возвращает 1. Я несколько раз пытался изменить логику, но всегда получал неправильный результат.

Вот код .NET:

Public Function api_v2_player_new(<FromBody> s As User) As Object
    Dim arrParameters(,) As String = {{"@name", s.Name}, {"@mail", s.Mail}, {"@password", s.Password}}
    Dim dtc As Data.DataTableCollection = SQL.Execute("dbo.user_new", arrParameters)
    Return SQL.toJson(dtc(0))
End Function

Public Class SQL
    Public Shared Function runStoredProcedure(ByVal cmd As SqlCommand) As Data.DataTableCollection
        Dim spName As String = cmd.CommandText.ToString
        cmd.CommandTimeout = 120
        Dim cs As String = System.Configuration.ConfigurationManager.ConnectionStrings("csKickerliga").ConnectionString
        Dim connection As SqlConnection = Nothing
        connection = New SqlConnection(cs)
        Dim dt As DataTable = New DataTable()
        cmd.Connection = connection
        connection.Open()
        Dim adp As New SqlDataAdapter(cmd)
        Dim ds As DataSet = New DataSet()
        cmd.ExecuteNonQuery()
        adp.Fill(ds, spName)
        Return ds.Tables
        connection.Close()
    End Function

    Shared Function Execute(spName As String, arrParameters(,) As String) As Data.DataTableCollection
        Dim cmd As SqlCommand = New SqlCommand(spName)
        cmd.CommandType = CommandType.StoredProcedure
        With cmd.Parameters
            For i = 0 To (arrParameters.Length / 2) - 1
                .AddWithValue(arrParameters(i, 0), arrParameters(i, 1))
            Next
        End With
        Dim dtc = runStoredProcedure(cmd)
        Return dtc
    End Function

    Shared Function toJson(dt As DataTable) As List(Of Object)
        Dim oList As New List(Of Object)
        Dim o As New Dictionary(Of String, Object)
        Dim data As Object

        For Each r As DataRow In dt.Rows
            o = New Dictionary(Of String, Object)
            For Each c As DataColumn In dt.Columns
                If IsNumeric(r(c.ColumnName)) Then
                    If Not r(c.ColumnName).ToString.Contains(".") Then
                        data = CInt(r(c.ColumnName))
                    Else
                        data = r(c.ColumnName).ToString
                    End If
                Else
                    data = r(c.ColumnName).ToString
                End If
                o.Add(c.ColumnName, data)
            Next
            oList.Add(o)
        Next
        Return oList
    End Function
End Class

1 Ответ

0 голосов
/ 26 апреля 2019

Нашел проблему. Код выполнял хранимую процедуру дважды:

cmd.ExecuteNonQuery()
adp.Fill(ds, spName)

Поэтому при повторном запуске запись уже существовала, поскольку она была создана при первом запуске. Я удалил одну из строк, и теперь она работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...