【问题标题】:Different output from stored procedure in SSMS and ASP.NETSSMS 和 ASP.NET 中存储过程的不同输出
【发布时间】: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


【解决方案1】:

发现问题。代码执行了两次存储过程:

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

因此,在第二次运行时,该记录已经存在,因为它是在第一次运行时创建的。我删除了其中一条线,现在它可以工作了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多