2012-12-12 9 views
5

Jestem nowym programistą ASP.NET i tworzę aplikację internetową, w której znajduje się pasek menu z wieloma opcjami. Niektóre z tych opcji będą wyświetlane tylko administratorowi. Logika jest za systemem, aby sprawdzić, czy użytkownik jest administratorem, czy nie. Jeśli tak, zostaną wyświetlone opcje. Napisałem tę metodę, ale mam iniekcję sql i chcę ją usunąć.Jak usunąć wtrysk sql z tego zapytania i sprawić, aby działał dobrze?

Dla twojej informacji, Mam następujący projekt bazy danych:

  • Użytkownicy tabela: NetID, Name, Title
  • Admini tabela: ID, NetID

Oto metoda C#:

private bool isAdmin(string username) 
{ 
     string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
     string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = '" + NetID + "')"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      // Open DB connection. 
      using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
      { 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
        if (reader.Read()) 
         if (reader["ID"].Equals(1)) 
          return true; 
       return false; 
      } 
     } 
    } 

Próbowałem zmienić go wykonując zmieniającej trzecią linię do:

string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 

Ale mam następujący błąd i nie wiem dlaczego:

Must declare the scalar variable "@NetID".

mógłbyś pomóc ja w rozwiązaniu tego?

* * UPDATE:

After updating the code to the following: 
    private bool isAdmin(string username) 
    { 
     string NetID = username; 
     string connString = "Data Source=appServer\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
     string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      // Open DB connection. 
      using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
      { 
       cmd.Parameters.AddWithValue("@NetID", NetID); 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
        if (reader.Read()) 
         if (reader["NetID"] == username) 
          return true; 
       return false; 
      } 
     } 
    } 

mam następujący błąd:

Niepoprawna składnia w pobliżu ')'.

Jak rozwiązać ten problem?

+0

Można również rozważyć SQL zapisanych w bazie procedur. –

+0

Naprawiono twój problem, zobacz moją edycję :) +1 za usunięcie iniekcji SQL;) – whosrdaddy

+0

Nadal napotykam ten sam problem i otrzymuję ten błąd z następującego: 'SqlDataReader reader = cmd.ExecuteReader();' –

Odpowiedz

1

Spróbuj

private bool isAdmin(string username) 
{ 
    string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
    string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 
    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     conn.Open(); 
     // Open DB connection. 
     using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
     { 
      cmd.Parameters.AddWithValue("@NetID", NetID); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader != null) 
       if (reader.Read()) 
        if (reader["ID"].Equals(1)) 
         return true; 
      return false; 
     } 
    } 
} 
+0

Dziękuję za pomoc. Bardzo to doceniam. Myślę, że mam błąd w logice. Ponieważ jak widzisz w moim projekcie bazy danych w pytaniu NetID jest obcym kluczem z tabeli Admins do tabeli Users, myślę, że powinienem przeczytać kolumnę NetID, a nie ID, prawda? Czy możesz mi w tym pomóc? –

+0

Co jest zapisywane w kolumnach Id i NetId? –

+0

ID to automatycznie zwiększany klucz podstawowy. NetID to nazwa użytkownika, która jest obcym kluczem do klucza podstawowego w tabeli Użytkownicy –

8

Trzeba przekazać wartość dla parametru @NetID:

cmd.Parameters.AddWithValue("@NetID", NetID); 
+0

Dziękuję bardzo za pomoc. –

+0

Czy możesz zobaczyć mój zaktualizowany kod? –

+0

@TechnologyLover, skompilowałem zaktualizowany kod i nie otrzymałem żadnego błędu. Użyj 'whosrdaddy' edytował kod i naprawił błąd. Jeśli potrzebujesz więcej pomocy w tym projekcie, daj mi znać. Szczęśliwe kodowanie! – RePierre

0

Jeśli używasz netid jako parametr w metodzie IsAdmin niż miałoby to pomóc

private bool isAdmin(string NetID) 
{ 
string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 
using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    conn.Open(); 
    // Open DB connection. 
    using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
    { 
     cmd.Parameters.AddWithValue("@NetID", NetID); 
     string value = cmd.ExecuteScalar().tostring(); 
     if (value != null) 
      return true; 
     else 
      return false; 
    } 
} 

}

0

jej lepiej użyć

cmd.Parameters.Add("@netid",SqlBdType.Int).Value=NetID; 
Powiązane problemy