2016-09-14 91 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

我將更新代碼。 –