我想通過使用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在這個相同的程序,將使用輸出參數,所以任何建議,將不勝感激!
連接SQL服務器? – 2012-02-24 16:00:20
不確定這是否是原因 - 但是您的'@ errmsg'輸出參數在存儲過程中被定義爲'INT',但是您複製並粘貼並在C#調用代碼中將其定義爲'OdbcType.VarChar,255' .... 。 – 2012-02-24 16:03:38
ODBC是「舊的,慢的和不贊成的」,使用SqlClient。 – Lloyd 2012-02-24 16:06:23