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