2012-02-24 137 views
1

我想通過使用ODBC連接的C#程序連接到SQL Server 2008數據庫。我正在向存儲過程發送一些數據以更新一些記錄。我想回到某種輸出消息來確保我的Proc正在運行。在我開始討論輸出消息之前,我的proc根據我的C#程序運行,它從未返回錯誤。但數據庫沒有更新。一旦我添加了代碼以允許輸出,我收到了一個錯誤,這是HY105的一些問題。這裏談到的代碼:從SQL Server 2008輸出到C#通過ODBC存儲過程

PROC-

ALTER PROCEDURE [dbo].[Proc] 
( @userid         char(10), 
@sql_userid       varchar(50), 
@user_encrypted_password  varchar(50), 
@user_old_sql_guid_password  varchar(50), 
@user_new_sql_guid_password  varchar(50), 
    @user_new_sql_guid_encrypted_password varchar(50), 
    @errmsg     int OUTPUT 

) 

as 

DECLARE @now   datetime, 
    @status   int, 
    @InProcErrMsg varchar(255) 

SET @userid = UPPER(@userid) 

BEGIN TRY 

EXEC ("ALTER LOGIN" + @sql_userid + "WITH PASSWORD = " + 
    @user_new_sql_guid_password + 
      " old_password = " + @user_old_sql_guid_password); 

SET @errmsg = 0 

IF @@ERROR = 0 
    BEGIN 
    UPDATE Table 
    Set  SERVER_OTHER = @user_new_sql_guid_encrypted_password 
    WHERE PC_LOGIN = @userid 
      and PC_OTHER = @user_encrypted_password 

    END 
SET @errmsg = 1 
End try 

begin catch 
if @@trancount > 0 
    rollback transaction 

select @InProcErrMsg = left("Proc: (" + cast(error_line() as varchar(10)) + ") " 
+ error_message(), 255) 
raiserror 50000 @InProcErrMsg 

end catch 

return 0` 

C# -

using (OdbcConnection databaseConnection = new OdbcConnection 
        ("Driver={SQLServer};Server=server;UID=id;PWD=pw;Database=db;")) 
    { 
    try 
     { 
     OdbcCommand SQLUserUpdateCommand = new OdbcCommand 
      ("{? = CALL USP_PHD_SQLUSER_UPDATE(?,?,?,?,?,?)}", databaseConnection); 

     SQLUserUpdateCommand.CommandType = CommandType.StoredProcedure; 

     OdbcParameter SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
              ("@userid", OdbcType.Char, 10); 
     SQLUserUpdateParam.Value = id; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@sql_userid", OdbcType.VarChar, 50); 
     SQLUserUpdateParam.Value = sqlid; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@user_encrypted_password", OdbcType.VarChar, 50); 
     SQLUserUpdateParam.Value = pw; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@user_old_sql_guid_password", OdbcType.VarChar, 50); 
     SQLUserUpdateParam.Value = oldpw; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@user_new_sql_guid_password", OdbcType.VarChar, 50); 
     SQLUserUpdateParam.Value = newpw; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
         ("@user_new_sql_guid_encrypted_password", OdbcType.VarChar, 50); 
     SQLUserUpdateParam.Value = as_encrypted; 

     SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@errmsg", OdbcType.VarChar, 255); 
     SQLUserUpdateParam.Direction = ParameterDirection.Output; 

     databaseConnection.Open(); 

     SQLUserUpdateCommand.ExecuteNonQuery(); 

     SQLUserUpdateCommand.Dispose(); 
     databaseConnection.Close(); 
     } 
     catch (OdbcException OEx) 
     { 
     Trace.WriteLine("Failed to call USP_PHD_SQLUSER_UPDATE"); 
     Trace.WriteLine("ODBC Exception Message: " + OEx.Message); 
     Trace.WriteLine("ODBC Exception Source: " + OEx.Source); 
     Trace.WriteLine("ODBC Exception StackTrace: " + OEx.StackTrace); 
     Trace.WriteLine("ODBC Exception TargetSite: " + OEx.TargetSite); 
     Trace.WriteLine("ODBC Exception Data: " + OEx.Data); 
     Trace.WriteLine("ODBC Exception Error Code: " + OEx.ErrorCode); 
     Trace.WriteLine("ODBC Exception Errors: " + OEx.Errors); 
     } 
     } 

錯誤 -

型 'System.Data.Odbc.OdbcException' 的第一次機會異常發生在 System.Data.dll
未能調用Proc
ODBC異常消息:ERROR [HY105] [微軟] [ODBC SQL Server驅動程序]無效 參數類型
ODBC異常源:SQLSRV32.DLL
ODBC異常堆棧跟蹤:
在System.Data.Odbc.OdbcConnection.HandleError (OdbcHandle hrHandle,RETCODE RETCODE)
在System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior 行爲, 字符串方法,布爾needReader,對象[] methodArguments,SQL_API odbcApiMethod)
在System.Data.Odbc.OdbcCommand。 ExecuteReaderObject(CommandBehavior 行爲,String方法,布爾needReader)
在System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
在nvo_connect1.of_update(字符串as_process_name,字符串as_switch, 字符串as_server_signon,字符串as_server,字符串as_database, 字符串as_password,字符串as_decrypted,字符串as_new_password_guid, 字符串as_encrypted ,字符串as_400_connection_string)
ODBC異常TargetSite:空隙的HandleError(System.Data.Odbc.OdbcHandle,RETCODE)
ODBC異常數據:System.Collections.ListDictionaryInternal
ODBC異常錯誤代碼:-2146232009
ODBC異常錯誤:系統.Data.Odbc.OdbcErrorCollection

它不給我一個行號,但通過測試,我知道錯誤發生在SQLUserUpdateCommand.ExecuteNonQuery();

如果在這個網站上有太多的信息,就是這樣。如果是這樣,道歉。第一次使用者。

本週我搜索了Google太多的幫助,結果沒有任何結果。我知道它會成爲一名額頭sla子手,但這比現在的桌上腦袋更好。

謝謝你的幫助。

編輯:

的@errmsg的事情是重要的,所以感謝您指出了這一點。我改變了我的C#有點讓這最後的工作:

SQLUserUpdateCommand.Connection = databaseConnection; 

//*****Open ODBC Connection 
databaseConnection.Open(); 

SQLUserUpdateCommand.CommandType = CommandType.StoredProcedure; 

SQLUserUpdateCommand.Parameters.AddWithValue("@userid", as_login_name); 
SQLUserUpdateCommand.Parameters.AddWithValue("@sql_userid", as_server_signon); 

SQLUserUpdateCommand.Parameters.AddWithValue("@user_encrypted_password", as_password); 

SQLUserUpdateCommand.Parameters.AddWithValue("@user_old_sql_guid_password", 
                    as_decrypted); 

SQLUserUpdateCommand.Parameters.AddWithValue("@user_new_sql_guid_password", 
                   as_new_password_guid); 

SQLUserUpdateCommand.Parameters.AddWithValue("@user_new_sql_guid_encrypted_password", 
                   as_encrypted); 

SQLUserUpdateCommand.ExecuteNonQuery(); 

使用ODBCParameter對象添加我的參數而不是,我說的參數與的AddValue()中的OdbcCommand對象的方法。

我擺脫了所有輸出參數。決定通過將記錄插入到表中來檢索錯誤消息。我的alter語句也有一些問題。總的來說,我不知道問題是什麼。我正在使用另一個proc在這個相同的程序,將使用輸出參數,所以任何建議,將不勝感激!

+1

連接SQL服務器? – 2012-02-24 16:00:20

+0

不確定這是否是原因 - 但是您的'@ errmsg'輸出參數在存儲過程中被定義爲'INT',但是您複製並粘貼並在C#調用代碼中將其定義爲'OdbcType.VarChar,255' .... 。 – 2012-02-24 16:03:38

+1

ODBC是「舊的,慢的和不贊成的」,使用SqlClient。 – Lloyd 2012-02-24 16:06:23

回答

1

由於參數聲明這種方式在程序

 @errmsg  int OUTPUT 

您應該更新的C#代碼以匹配例如這是錯誤的

SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@errmsg", OdbcType.VarChar, 255); 

SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
           ("@errmsg", OdbcType.Int,); 
SQLUserUpdateParam.Direction = ParameterDirection.Output; 
0

使用sql profiler工具來查看傳遞給過程的參數。捕獲這些數據並單獨嘗試執行存儲的proc,或者可以調試它。你應該能夠糾正錯誤。

1

在你的SP,它定義:

@errmsg     int OUTPUT 

,但在你的C#你把它:

SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add 
          ("@errmsg", OdbcType.VarChar, 255); 

所以說你爲什麼要使用ODBC無效的參數類型

相關問題