Вывод в C # из хранимых процедур SQL Server 2008 через ODBC - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь подключиться к базе данных SQL Server 2008 через программу C #, используя соединение ODBC. Я отправляю хранимой процедуре некоторые данные, чтобы обновить некоторые записи. Я хотел бы получить какие-то выходные сообщения, чтобы убедиться, что мой Proc работает. До того, как я начал возиться с выходным сообщением, мой proc работал, согласно моей программе на C #, он никогда не возвращал ошибку. Но база данных не была обновлена. Как только я добавил код для разрешения вывода, я получил ошибку, что-то вроде HY105. Вот код:

* 1003 процесс пластической деформации *

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);
         }
       }

error-

Первое случайное исключение типа 'System.Data.Odbc.OdbcException' произошло в System.Data.dll
Не удалось вызвать Proc
Сообщение об исключении 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 поведение, Строковый метод, Boolean NeedReader, Object [] 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: Void HandleError (System.Data.Odbc.OdbcHandle, RetCode)
Данные об исключении ODBC: System.Collections.ListDictionaryInternal
Код ошибки исключения ODBC: -2146232009
Ошибки исключения ODBC: System.Data.Odbc.OdbcErrorCollection

Это не дает мне номер строки, но в ходе тестирования я знаю, что ошибка происходит в SQLUserUpdateCommand.ExecuteNonQuery();.

Если на этом сайте слишком много информации, то это она. Если так, извинения. Первый пользователь.

На этой неделе я слишком много просил Google о помощи, но безрезультатно. Я знаю, это будет удар по лбу, но это лучше, чем нынешний удар по голове стола.

Спасибо за любую помощь.

Edit:

Важно было @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.

Я избавился от выходного параметра все вместе. Решил восстановить сообщения об ошибках, вставив записи в таблицу. Также были некоторые проблемы с моим утверждением об изменении. В общем, я не знаю, в чем проблема. Я работаю с другой процедурой в этой же программе, которая будет использовать выходные параметры, поэтому любые предложения будут оценены!

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Это неверно

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

Поскольку параметр объявлен таким образом в процедуре

      @errmsg        int OUTPUT

Вы должны обновить код C #, чтобы он соответствовал, например,

SQLUserUpdateParam = SQLUserUpdateCommand.Parameters.Add
                              ("@errmsg", OdbcType.Int,);
SQLUserUpdateParam.Direction = ParameterDirection.Output; 
1 голос
/ 24 февраля 2012

В вашем SP это определяет:

 @errmsg                 int OUTPUT

но в вас C # вы делаете это:

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

Таким образом, он говорит, недопустимый тип параметра

0 голосов
/ 24 февраля 2012

используйте средство профилирования sql, чтобы увидеть, какие параметры передаются в процедуру.перехватите их и попытайтесь выполнить сохраненный процесс самостоятельно или, возможно, отладить его.Вы должны быть в состоянии сосредоточиться на ошибке.

...