2011-10-01 82 views
1

如果用戶已經存在於數據庫中,我正在使用存儲過程來插入新用戶或更新其現有信息。使用C#中的存儲過程更新Oracle表有問題

我從Active Directory中抓取3個參數(用戶名,名字和姓氏),並使用4個文本框獲取其餘部分(PI代碼,電話,電子郵件地址)。

<asp:TextBox ID="TXT_PI_CODE" runat="server" style="position: absolute; left:120px; top:100px;"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator_PI_CODE" runat="server" ErrorMessage="" ControlToValidate="TXT_PI_CODE"></asp:RequiredFieldValidator> 
<br /> 
<asp:TextBox ID="TXT_EMAIL" runat="server" style="position: absolute; left:120px; top:140px;"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator_EMAIL" runat="server" ErrorMessage="" ControlToValidate="TXT_EMAIL"></asp:RequiredFieldValidator> 
<asp:RegularExpressionValidator ID="RegularExpressionValidator_EMAIL" runat="server" ErrorMessage="Invalid Email Format." ControlToValidate="TXT_EMAIL" style="position: absolute; top:140px; left:300px;" ValidationExpression="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"></asp:RegularExpressionValidator> 
<br /> 
<asp:TextBox ID="TXT_PHONE" runat="server" style="position: absolute; left:120px; top:180px;"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator_PHONE" runat="server" ErrorMessage="" ControlToValidate="TXT_PHONE"></asp:RequiredFieldValidator> 
<br /> 
<asp:TextBox ID="TXT_ADDRESS" runat="server" style="position: absolute; left:120px; top:220px;" Width="200"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator_ADDRESS" runat="server" ErrorMessage="" ControlToValidate="TXT_ADDRESS"></asp:RequiredFieldValidator> 
<br /> 
<asp:Label ID="LBL_REQUIRED" runat="server" Text="*Required Fields" CssClass="labels" style="position: absolute; top:260px;" ForeColor="#FF9900"></asp:Label> 
<asp:Button ID="BTN_SUBMIT" runat="server" Text="Submit" 
    style="position: absolute; top:300px; left:120px;" Width="100" Height="40" 
    OnClick="BTN_SUBMIT_Click"/> 

我的存儲過程如下:

create or replace 
PROCEDURE SP_ADD_USER 
(
    p_USER_NAME IN T_USER.USER_NAME%TYPE, 
    p_FIRST_NAME IN T_USER.FIRST_NAME%TYPE, 
    p_LAST_NAME IN T_USER.LAST_NAME%TYPE, 
    p_PI_CODE IN T_USER.PI_CODE%TYPE, 
    p_EMAIL IN T_USER.EMAIL%TYPE, 
    p_PHONE IN T_USER.PHONE%TYPE, 
    p_ADDRESS IN T_USER.ADDRESS%TYPE 
) 
AS 
BEGIN 
    INSERT INTO T_USER (USER_ID, USER_NAME, FIRST_NAME, LAST_NAME, PI_CODE, EMAIL, PHONE, ADDRESS) 
    VALUES (S_USER.NEXTVAL, p_USER_NAME, p_FIRST_NAME, p_LAST_NAME, p_PI_CODE, p_EMAIL, p_PHONE, p_ADDRESS); 
EXCEPTION 
WHEN DUP_VAL_ON_INDEX THEN 
UPDATE T_USER 
SET  
PI_CODE = p_PI_CODE, 
EMAIL = p_EMAIL, 
PHONE = p_PHONE, 
ADDRESS = p_ADDRESS 
WHERE LOWER(USER_NAME) = p_USER_NAME; 
COMMIT; 
END; 

最後我的C#是這樣的:

protected void BTN_SUBMIT_Click(object sender, EventArgs e) 
{ 
    //Retrieve Username, firstname, and last name from AD. 
    string STR_USER_ID = ADQuery.ExtractUserName(User.Identity.Name.ToString()); 
    string STR_FIRST_NAME = ADQuery.GetADValue(STR_USER_ID, "givenName"); 
    string STR_LAST_NAME = ADQuery.GetADValue(STR_USER_ID, "SN"); 

    string connectionString = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 

    using(OracleConnection connection = new OracleConnection(connectionString)) 
    { 
     connection.Open(); 

     OracleCommand ora_cmd = new OracleCommand("SP_ADD_USER", connection); 
     ora_cmd.BindByName = true; 
     ora_cmd.CommandType = CommandType.StoredProcedure; 

     ora_cmd.Parameters.Add("p_USER_NAME", OracleDbType.Varchar2, STR_USER_ID.ToLower(), ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_FIRST_NAME", OracleDbType.Varchar2, STR_FIRST_NAME, ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_LAST_NAME", OracleDbType.Varchar2, STR_LAST_NAME, ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_PI_CODE", OracleDbType.Varchar2, TXT_PI_CODE.Text, ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_EMAIL", OracleDbType.Varchar2, TXT_EMAIL.Text, ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_PHONE", OracleDbType.Varchar2, TXT_PHONE.Text, ParameterDirection.Input); 
     ora_cmd.Parameters.Add("p_ADDRESS", OracleDbType.Varchar2, TXT_ADDRESS.Text, ParameterDirection.Input); 

     ora_cmd.ExecuteNonQuery(); 
    } 
    Response.Redirect("Default.aspx"); 
} 

嘗試當插入部分工作正常,作爲一個新的用戶,但是更新相同文本框中的信息回發後數據庫上沒有任何更新。不過怪異的是,如果我改變我的C#來

ora_cmd.Parameters.Add("p_PI_CODE", OracleDbType.Varchar2, TXT_EMAIL.Text, ParameterDirection.Input); 
ora_cmd.Parameters.Add("p_EMAIL", OracleDbType.Varchar2, TXT_EMAIL.Text, ParameterDirection.Input); 

,其中這兩個參數都來自同一個文本框填充它會更新PI_CODE場中的電子郵件地址文本框什麼最初是在數據庫上,但電子郵件地址在數據庫上保持不變。 我不知道是否有一些錯誤我缺少或我的語法關閉?我確定我的參數順序是正確的,或者我認爲是正確的。任何人見過這個?

+0

所以我想出了背後的邏輯。在我的Page_Load中,如果用戶已經存在,我會從數據庫中自動填充文本框。因此,更新正在運行,應用程序僅使用文本框中的預加載值更新並忽略所做的任何更改。這是一個視圖狀態問題嗎? – kmc5117

+0

找出如何修復忽略更改的文本框。將文本框填充到if(!IsPostback)中允許程序在文本框中使用新更新的值,而不是舊的值。希望這可以幫助某人。 – kmc5117

回答

1

找出如何解決忽略更改的文本框。將文本框填充到if(!IsPostback)中允許程序在文本框中使用新更新的值,而不是舊的值。希望這可以幫助某人。