通过ODBC从SQL Server 2008存储过程输出到C#

本文关键字:存储过程 输出 2008 Server ODBC SQL 通过 | 更新日期: 2023-09-27 18:25:46

我正试图通过使用ODBC连接的C#程序连接到SQL Server 2008数据库。我正在向存储过程发送一些数据,以便更新一些记录。我想返回一些输出消息,以确保我的Proc正在运行。在我开始处理输出消息之前,我的proc运行了,根据我的C#程序,它从未返回错误。但数据库没有更新。一旦我添加了允许输出的代码,我就出现了一个错误,类似于HY105。代码来了:

过程-

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
无法调用过程
ODBC异常消息:错误[HY105][Microsoft][ODBC SQL Server驱动程序]无效参数类型
ODBC异常源:SQLSRV32.DLL
ODBC异常StackTrace:
位于System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle,RetCode RetCode)
位于System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior行为字符串方法,布尔needReader,Object[]方法参数,SQL_API odbcApiMethod)
位于System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehaviorbehavior,String方法,Boolean needReader)
位于System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
在nvo_connect1.of_update(字符串as_process_name,字符串as_switch,字符串as_server_signon,字符串as_server,字符串as_database,字符串为_password,字符串为_decrypted,字符串为_new_password_guid,字符串为_encrypted,字符串为_400_connection_String)
ODBC异常TargetSite:Void HandleError(System.Data.ODBC.OdbcHandle,RetCode)
ODBC异常数据:System.Collections.ListDictionaryInternal
ODBC异常错误代码:-2146232009
ODBC异常错误:System.Data.ODBC.OdbcErrorCollection

它没有给我一个行号,但通过测试,我知道错误发生在SQLUserUpdateCommand.ExecuteNonQuery();

如果这个网站上有太多的信息,那就是它。如果是,请道歉。第一次使用。

本周我在谷歌上搜索了太多的帮助,但没有结果。我知道这会是一场闹剧,但这比现在的桌子头爆炸要好。

谢谢你的帮助。

编辑:

@ermsg很重要,所以感谢您指出这一点。我改变了我的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对象添加参数,而是使用ODBCommand对象的AddValue()方法添加参数。

我把输出参数全部去掉了。决定通过在表中插入记录来检索错误消息。我的另一份声明也有一些问题。总的来说,我不知道问题出在哪里。我正在这个程序中使用另一个proc,它将使用输出参数,所以任何建议都将不胜感激!

通过ODBC从SQL Server 2008存储过程输出到C#

这是错误的

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

因为参数在过程中是这样声明的

      @errmsg        int OUTPUT

您应该更新C#代码以匹配例如

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

在SP中,它定义:

 @errmsg                 int OUTPUT

但在你的C#中,你做到了:

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

所以它说无效的参数类型

使用sql探查器工具查看传递给过程的参数。捕获这些并尝试单独执行存储的proc,或者可能对其进行调试。您应该能够发现错误。