2013-04-11 46 views
0

我有一個SQL創建這樣返回字符串從SQL程序到C#

USE KOST 
    GO 
    --Cabang means Branch in Bahasa. 

CREATE PROCEDURE login_pro 
     --received parameter 
     @NoIDStaff VARCHAR(5), 
     @Password VARCHAR (50) 


    AS 

    --sent parameter 
    DECLARE @status INT 
    DECLARE @IDCabang VARCHAR(5) 

    --owner login 
    IF EXISTS(SELECT IDCabang, [Password] 
       FROM MsStaff 
       WHERE @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('B%')) 
      SET @status=1 

    --staff login 
    ELSE IF EXISTS(SELECT IDCabang, [Password] 
       FROM MsStaff 
       WHERE @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('A%')) 
      BEGIN 
      SELECT @IDCabang=IDCabang FROM MsStaff 
      SET @status=2 
      SET @IDCabang = (select IDCabang FROM Msstaff where @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('A%')) 
      END 

    --neither of them login 
    ELSE 
      set @status=0 

    select @status, @IDCabang 
    GO 

查詢返回的狀態值而不是IDCabang程序查詢。 我應該怎麼做才能返回IDCabang的價值?

這是我的C#代碼:

private void submit_Click(object sender, EventArgs e) 
    { 
     NoIDStaff = new SqlParameter(); 
     Password = new SqlParameter(); 
     SqlConnection con = new SqlConnection(strCon); 

     com = new SqlCommand(); 
     com.Connection = con; 
     con.Open(); 

     com.CommandType = CommandType.StoredProcedure; 
     com.CommandText = "login_pro"; 

     NoIDStaff.SqlDbType = SqlDbType.VarChar; 
     NoIDStaff.Size = 50; 
     NoIDStaff.ParameterName = "@NoIDStaff"; 
     NoIDStaff.Value = username.Text.ToString(); 
     NoIDStaff.Direction = ParameterDirection.Input; 

     Password.SqlDbType = SqlDbType.VarChar; 
     Password.Size = 50; 
     Password.ParameterName = "@Password"; 
     Password.Value = password.Text.ToString(); 
     Password.Direction = ParameterDirection.Input; 

     com.Parameters.Add(NoIDStaff); 
     com.Parameters.Add(Password); 



     int status; 
     string IDCabang; 
     status = Convert.ToInt16(com.ExecuteScalar()); 
     IDCabang = Convert.ToString(com.ExecuteScalar()); 


     //owner login 
     if (status == 1) 
     { 
      this.Hide(); 
      frm = new Form2(); 
      frm.Show(); 
     } 

     //staff login 
     else if (status == 2) 
     { 
      this.Hide(); 
      frm4 = new Form4(IDCabang); 
      frm4.Show(); 
     } 


     else if (username.Text.Equals("")) 
     { 
      MessageBox.Show("Username Must be Filled!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     else if (password.Text.Equals("")) 
     { 
      MessageBox.Show("Password Must be Filled!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     else 
     { 
      MessageBox.Show("Invalid Username or Password", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     con.Close(); 
    } 

我想收到IDCabang爲字符串,所以我可以將它發送到Form4。但看起來,IDCabang沒有返回任何價值。

+0

什麼是「不回」呢?你如何在你的C#代碼中引用這些列,因爲你沒有給他們別名?你爲什麼不使用正確的輸出參數? – 2013-04-11 16:33:31

+0

您的代碼可以採用三種路徑。如果,否則,否則。你只是在Else If路徑中設置@IDCabang的值,所以如果它不經過這條路徑,它將不會被設置。 – 2013-04-11 16:34:53

+0

在你的兩個條件中,你不會試圖設置@ @ IDCabang到任何意味着它將返回爲DBNull值的東西,如果它完全返回的話,這取決於你的C#代碼是如何設置的。當你試圖訪問你的返回值時,你的C#代碼是什麼樣的? – 2013-04-11 16:35:18

回答

1

試試這個

SqlDataReader reader = com.ExecuteReader(); 

while (reader.Read()) 
{ 
    status = reader["Status"] == DBNull.Value ? 0 : (int)reader["Status"]; 
    IDCabang = reader["IDCabang"] == DBNull.Value ? null : (string)reader["IDCabang"]; 
} 
0

你嘗試這樣的:

USE KOST 
    GO 
    --Cabang means Branch in Bahasa. 

CREATE PROCEDURE login_pro(@IDCabang VARCHAR(5)) 
     --received parameter 
     @NoIDStaff VARCHAR(5), 
     @Password VARCHAR (50) 


    AS 

    --sent parameter 
    DECLARE @status INT 


    --owner login 
    IF EXISTS(SELECT IDCabang, [Password] 
       FROM MsStaff 
       WHERE @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('B%')) 
      SET @status=1 

    --staff login 
    ELSE IF EXISTS(SELECT IDCabang, [Password] 
       FROM MsStaff 
       WHERE @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('A%')) 
      BEGIN 
      SELECT @IDCabang=IDCabang FROM MsStaff 
      SET @status=2 
      SET @IDCabang = (select IDCabang FROM Msstaff where @NoIDStaff=NoIDStaff AND @Password=[Password] 
       AND NoIDStaff LIKE('A%')) 
      END 

    --neither of them login 
    ELSE 
      set @status=0 

    select @status, @IDCabang 
    GO 

又見THIS

+0

我試過你的代碼,但它說「DECLARE附近的語法不正確。期待一個變量」 – 2013-04-11 17:03:08

+0

@AdyanaPermatasari我修復了它。沒有關鍵字DECLARE需要。 – Dilshod 2013-04-11 17:05:30

+0

@AdyanaPermatasari也可以參考我的帖子中的鏈接。在那裏解釋瞭如何做SQL和C#。 – Dilshod 2013-04-11 17:06:24

0

您使用的ExecuteScalar,這是永遠只能去看看你的回報集的第一行和第一列:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

你真的想要使用ExecuteReader或類似的東西。另外,我會在選擇中將變量別名,以便在查找它們時可以更輕鬆地引用它們(即SELECT @status as Status, @IDCabang as IDCabang)。

SqlDataReader reader = com.ExecuteReader(); 

while (reader.Read()) 
{ 
    status = reader["Status"] == DBNull.Value ? 0 : (int)reader["Status"]; 
    IDCabang = reader["IDCabang"] == DBNull.Value ? null : (string)reader["IDCabang"]; 
} 

編輯:在參考Aaron Bertrand的評論,你也可以設置一個輸出參數在你的存儲過程和讀取。有一個關於如何做到這一點在這裏詳細:Get output parameter value in ADO.NET

+0

它的工作原理!謝謝謝謝非常感謝您的幫助:) – 2013-04-12 00:23:57