2016-09-14 89 views
0

要开始我会告诉你这一点。下一个问题对我来说很棘手,但是......这个存储过程用在两个不同的数据库中。两者都具有相同的数据,我们称它们为更旧和更新。代码或存储过程有问题

在较旧的存储过程工作正常,我什至得到了回报。但在新一代并不一样。

ALTER PROCEDURE dbo.actual_user 
    @user char(15) 
AS 
    SELECT 
     US.Usercode, US.UsercodeSQL, US.LastName, US.Name, US.Nivel, 
     CONVERT(int, US.Timestamp) TS, 
     S.DateChanged, S.TolPSW, S.LoginsTotals, S.LoginsUsed, 
     S.InitialDate, S.EndDate 
    FROM  
     System_Users US 
    INNER JOIN 
     Session_Users S ON US.UssercodeSQL = S.UssercodeSQL 
    WHERE 
     US.UsercodeSQL = user_id(@usuario) 
     AND S.UsercodeSQL = user_id(@usuario) 

当我运行一个像这样的EXEC(通过这种方式在两个数据库作品):

exec actual_user 'telc\u124453' 

我得到这样的输出:

Usercode      UsercodeSQL LastName      Name       Nivel TS   DateChanged   TolPSW   LoginsTotals LoginsUsed  InitialDate  EndDate 
----------------------------- ----------- ------------------------------ ------------------------------ ------ ----------- ----------------------- --------------- ------------- ------------ ----------------------- ----------------------- 
FESPE       15   Brond       Manny       NULL 16838419 2007-04-16 16:57:00  30    10   0   NULL     NULL 

但我的代码m使用不适用于较新的数据库。就是这样。

这是我的新代码。它适用于较旧的数据库,但较新的数据库不适用。可能SqlServer的版本不工作原因user_id来自存储过程,我不知道。

Public Function UsuarioActual(ByVal datoUsuario As String) As DSUsuario.UsuarioActualRow 

    Dim ds As New DSUsuario 
    Dim dt As New DataTable 
    Dim sqlConn As SqlConnection = New SqlConnection() 
    Dim sqlAdp As SqlDataAdapter 

    Try 
     sqlConn = MyBase.GetConnection 
     Dim command As New SqlCommand("Usuario_Actual", sqlConn) 
     command.CommandType = CommandType.StoredProcedure 
     command.Parameters.AddWithValue("@usuario", datoUsuario) 
     sqlAdp = New SqlDataAdapter(command) 
     sqlAdp.Fill(dt) 

    Catch ex As Exception 

     proc = "UsuarioActual" 
     ERROR 

     epn = New FactEspExceptions(ex, TipoExcepcion.ErrorBD, proc, Nothing, ex.Message) 

     epn = New FactEspExceptions(ex, TipoExcepcion.ErrorBD, proc) 
     epn.AuditarError() 
     Throw epn 

    Finally 
     sqlConn.Close() 
     sqlConn = Nothing 
    End Try 

    If ds.UsuarioActual.Rows.Count > 0 Then 
     Return ds.UsuarioActual.Rows(0) 
    Else 
     Return Nothing 
    End If 

End Function` 

编辑1: 当代码运行,上了年纪的DB它的工作原理。但是,当它在较新的数据库上运行时,它不会。我不知道它是关于权限,execSP还是缺失的东西。所以在我看来,我可以说问题出在SP上。

编辑2: 从代码运行我得不到输出。 这是从两个DB上的EXEC运行的错误。

过程 'actual_user' 不具有任何参数和参数被供给

编辑3:代码更新。

+0

你能更准确地说'不行'吗? – peterG

+0

@peterG对不起,正在努力。更新。谢谢! –

+0

不要执行''EXEC actual_user'“+ usuTelecom +”'“'。这允许SQL注入。使用'SqlParameter'。另外,为什么'CHAR(15)'而不是'VARCHAR(15)'?此外,即使编辑,你仍然不说_what_不起作用。有错误吗?如果是这样,请发布完整的错误消息。你只是没有结果?如果是这样,请检查两个数据库的默认排序规则,因为这可能会改变字符串比较的工作方式。否则,请在该问题中添加更多详细信息。 –

回答

0
Dim comando As String = "EXEC actual_user" 


    Try 
     sqlConn = MyBase.GetConnection 

     Dim com As SqlCommand = New SqlCommand() 

     com.CommandText = comando 
     com.Connection = sqlConn 
     com.CommandType = CommandType.StoredProcedure 
     com.Parameters.AddWithValue("@User", usuTelecom) 

你得到错误的原因是没有参数被传递。这将传递有问题的参数。

我不明白你的存储过程中的一件事是为什么有一个@usuario变量似乎没有声明。不过,我认为你已经剥离了一些东西。

+0

我将更新代码。 –