2010-02-04 55 views
5

Tôi đã xác minh rằng phương thức/thủ tục Oracle của tôi đang hoạt động chính xác, nhưng trong C# tôi luôn nhận -1 trả về từ ExecuteNonQuery(). Do đó, bool dưới đây luôn sai. Chúng tôi chỉ sử dụng Trình kích hoạt trong DB (Oracle) của chúng tôi cho các câu lệnh INSERT. Tôi có cần kích hoạt cho bản cập nhật không?ExecuteNonQuery() trả về -1 trong Cập nhật khi hồ sơ được cập nhật

Bất kỳ đề xuất nào tại sao điều đó sẽ xảy ra? Nó chắc chắn cập nhật một bản ghi:

public bool ChangePassword(long UserId, string NewPassword) 
    { 
     int rcds = 0; 
     using (OracleConnection dbConn = new OracleConnection(dbConnString)) 
     using (OracleCommand dbCmd = new OracleCommand("PKG_USER.CHANGE_PASSWORD", dbConn)) 
     { 
      try 
      { 
       string salt = GenerateSalt(); 
       dbCmd.CommandType = CommandType.StoredProcedure; 
       dbCmd.Parameters.Add("p_USER_ID", OracleDbType.Int64, UserId, ParameterDirection.Input); 
       dbCmd.Parameters.Add("P_PASSWORD", OracleDbType.Varchar2, 128, EncodePassword(NewPassword, this.IsPasswordHashed, salt), ParameterDirection.Input); 
       dbCmd.Parameters.Add("P_PASSWORD_SALT", OracleDbType.Varchar2, 128, salt, ParameterDirection.Input); 

       if (dbConn.State != ConnectionState.Open) dbConn.Open(); 
       rcds = dbCmd.ExecuteNonQuery(); 
      } 
      catch (Exception e) 
      { 
       LastError = e.Message + " " + e.Source; 
       rcds = 0; 
      } 
      finally 
      { 
       dbCmd.Dispose(); 
       dbConn.Dispose(); 
      } 
     } 
     return (rcds > 0); 
    } 

Xin lỗi ... heres SP:

PROCEDURE Change_Password(p_User_Id  IN Users.User_Id%TYPE, 
         p_Password  IN Users.Password%TYPE, 
         p_Password_Salt IN Users.Password_Salt%TYPE) IS 


BEGIN 
UPDATE Users 
    SET Password    = p_Password, 
     Password_Salt  = p_Password_Salt, 
     Password_Change_Date = SYSDATE 
WHERE User_Id = p_User_Id; 

END Change_Password;

+0

Hình thức lưu trữ của bạn trông như thế nào? – MikeWyatt

Trả lời

13

Hãy thử trả về SQL% ROWCOUNT một cách rõ ràng.

Theo MSDN, DbCommand..ExecuteNonQuery sẽ luôn luôn trả -1 cho các cuộc gọi thủ tục lưu trữ:

Đối UPDATE, INSERT và DELETE, giá trị trả về là số hàng bị ảnh hưởng bởi lệnh . Đối với tất cả các loại câu lệnh khác, giá trị trả về là -1.

Nếu tôi nhớ chính xác từ ngày sử dụng nhiều procs được lưu trữ, tôi tin rằng bạn cần phải sử dụng đối số đầu ra để trả lại nội dung như số hàng được cập nhật.

+0

Nhưng không nên phương thức ExecuteNonQuery trả về giá trị, thay vì tham số đầu ra bổ sung? Đó là những gì nó âm thanh như trên MSDN. – Barryman9000

+0

@ Barryman9000 - đó không phải là cách tôi đọc nó, và nó không phải là cách nó hoạt động trên SqlCommand - bạn không phát hành một lệnh UPDATE/INSERT/DELETE, bạn đang phát hành một cuộc gọi đến một proc được lưu trữ - do đó giá trị trả về từ ExecuteNonQuery sẽ là -1. Nếu bạn muốn có một giá trị khác, bạn sẽ cần trả về giá trị đó trong một tham số đầu ra. (Lưu ý rằng OracleCommand cũng có thể trả về 0 cho một yêu cầu Create/DropTable: http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.executenonquery.aspx) –

+0

Ah-ha .. Tôi đã nghĩ rằng kể từ khi tôi cập nhật bảng của mình, tôi đã phát hành và lệnh UPDATE. Giải thích của bạn có ý nghĩa mặc dù, cảm ơn. – Barryman9000

1

Tôi không phải là một anh chàng Oracle, nhưng dường như có một lệnh:

set feedback off 

mà ngăn không cho nó trở về số lượng hồ sơ bị ảnh hưởng. Đây có phải là dòng trong thủ tục lưu sẵn không? Hay bạn đã thử 'đặt phản hồi về'? Về mặt chức năng, tôi nghĩ đây chỉ là đảo ngược lệnh SET NOCOUNT ON/OFF của SQL Server.

Các vấn đề liên quan