通过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,它将使用输出参数,所以任何建议都将不胜感激!
这是错误的
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,或者可能对其进行调试。您应该能够发现错误。