Я создал хранимую процедуру для включения нового пользователя для моей системы.Параметры: Имя, Почта и Пароль (все 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