【发布时间】:2019-09-16 02:31:37
【问题描述】:
我创建了一个存储过程来为我的系统添加一个新用户。参数为:姓名、邮件和密码(全部为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
【问题讨论】:
-
向我们展示您如何从 .Net 应用程序调用 proc
-
你的
Select中没有FROM...SELECT @exist AS [exist], [id], [name], [mail] WHERE [mail]=@mail -
如果 Sp 在 SSMS 中工作正常,则检查您在从 asp 调用时传递的连接字符串(服务器名称、数据库名称)和 Sp 名称,如果它们正常,则检查 ru路过。
-
@WEI_DBA 帖子已更正。 SP 在我的数据库中是正确的。复制/粘贴问题... :-)
-
@TabAlleman [来自帖子的解释] 无论我尝试添加新邮件还是现有邮件,[exist] 总是返回 1。我尝试多次更改逻辑,但我总是得到结果错误。
标签: asp.net sql-server vb.net