2016-03-27 7 views
0

Ich habe eine Tabelle Register. Ich möchte drei Daten aus den Textfeldern mit den Daten in der Tabelle überprüfen, um doppelte zu finden und möchte auch separate Popup-Nachrichten für jeden Vergleich erstellen. Wenn der Benutzername bereits verwendet wird, möchte ich den Benutzernamen anzeigen. Ebenso für AdminNo und RegitrationNo. Backend-Code ist:Wie zu unterschiedlichen Ergebnissen von einer einzigen SQL-Überprüfung

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString); 
      conn.Open(); 
      String str = "INSERT INTO Register (Name,AdminNo,RegisterNo,Branch,DoB,Address,Mobile,Email,Username,Password) VALUES('" + TextBoxName.Text + "','" + Convert.ToInt64(TextBoxadmin.Text) + "','" + TextBOxreg.Text + "','" + DrpBranch.SelectedItem + "','" + Convert.ToDateTime(DoB.Text) + "','" + address.Text + "','" + mobno.Text + "','" + email.Text + "','" + user.Text + "','" + pass.Text + "')"; 
      SqlCommand cmd = new SqlCommand(str, conn); 
      cmd.ExecuteNonQuery(); 

Dies ist die Insert-Funktion zu Tisch.

Dies ist meine doppelte Prüffunktion, wo Sie sehen können, dass ich das Duplikat mit dem OR-Operator überprüft habe. Wenn ein Duplikat gefunden wird, wird True zurückgegeben. Bitte geben Sie eine Möglichkeit, die Duplikate separat zu finden und separate Nachrichten anzuzeigen.

+0

Sie sollten unbedingt parametrisierte Abfragen lernen. Ihr Code ist für SQL Injection-Angriffe geöffnet. –

+0

schauen Sie hier ist es einfach und sauber http://www.aspsnippets.com/Articles/Simple-User-Registration-Form-Example-in-ASPNet.aspx – banksy

Antwort

0

Ich bin kein Experte für C++ oder MS SQL, aber ich denke, dass diese Lösung funktionieren könnte. Ich entschuldige mich, wenn die Syntax nicht ganz korrekt ist (ich habe keine einfache Möglichkeit, dies zu überprüfen), also bitte zögern Sie nicht, wie nötig anzupassen, aber die Idee ist wie folgt. Sie würden die SQL-Anweisung wie folgt ändern: shatement

SqlCommand cmd = new SqlCommand(sqlStatement); 

wo die SQLstatement ist das, was ich oben geschrieben:

select 
case 
    when 
     AdminNo='"+Convert.ToInt32(TextBoxadmin.Text)+"'" 
    then 
     CAST(1 AS BIT) 
    else 
     CAST(0 AS BIT) 
end as AdminYes, 

case 
    when 
     Username='"+user.Text+"'" 
    then 
     CAST(1 AS BIT) 
    else 
     CAST(0 AS BIT) 
end as UsernameYes, 

case 
    when 
     RegisterNo='"+TextBOxreg.Text+"'" 
    then 
     CAST(1 AS BIT) 
    else 
     CAST(0 AS BIT) 
end as RegisterNoYes 
From Register Where AdminNo='"+Convert.ToInt32(TextBoxadmin.Text)+"' OR Username='"+user.Text+"' OR RegisterNo='"+TextBOxreg.Text+"'" 

Sie diese Abfrage in Ihrer ausführen würde. Dann, wenn Sie mit dem Leser arbeiten, können Sie rdr.getBoolean (0) überprüfen, wenn es wahr zurückgibt, dann bedeutet das, dass Sie das Admin-Duplikat erhalten haben, wenn Sie rdr.getBoolean (1) als wahr erhalten, dann ist es ein Benutzername-Duplikat, und wenn Sie rdr.getBoolean (3) gleich true erhalten, dann ist es ein RegiserNo-Duplikat.

+0

Vielen Dank für die Antwort, aber ich habe nicht die Bedeutung von AdminYes verstanden , BenutzernameJa, RegisterNeinJa. Ich übergebe den Wert gern an eine .NET-Klasse, um das Ergebnis anzuzeigen. Ich denke, es ist nicht möglich, diese SQL-Abfrage an sie zu übergeben. Zum Beispiel, wenn der Benutzername doppelt ist, möchte ich int str als 1 setzen. – FaheemMCFC

+0

Siehe meine Bearbeitungen oben. Die Namen von AdminYes, UsernameYes, RegisterNoYes spielen keine Rolle. Der Punkt ist, dass Sie dann in Ihrem Code nach diesen booleschen Werten suchen können. – artybug

+0

Ich werde es überprüfen. Ich bin nicht so gut in der Arbeit mit SQL ..Vielen Dank @Artur Charuphchyan – FaheemMCFC

0

Sie sollten eine gespeicherte Prozedur erstellen und Ihre @AdminNo, @UserName und @RegisterNo als Parameter übergeben. Die gespeicherte Prozedur zurückgeben kann entweder einen - benutzerdefinierten benutzerdefinierten Typen,
- varchar (max) mit Gehalten von xml oder
- nur eine gewöhnlichen Tisch Ergebnismenge Das tatsächliche Format spielt keine Rolle, so lange wie möglich " Pass“eine Tabelle (kein Skalar response)

Die sproc könnte etwas entlang der Linien von

Select 'AdminNo' as [FieldName], count(*) as [CountOfRecords] From Register Where AdminNo = @AdminNo 
UNION ALL 
Select 'UserName', count(*) From Register Where UserName = @UserName 
UNION ALL 
Select 'RegisterNo', count(*) From Register Where RegisterNo = @RegisterNo 

Dann in Ihrem UserExist Routine tun, müssen Sie ExecuteReader und lesen Sie alle Zeilen. Sie haben immer drei Reihen (eine für AdminNo, eine für Username und eine für RegisterNo), und Sie können die Zählung in jeder der Zeilen verwenden - wenn count> 0, dann gibt es Duplikate sind

0
using System; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 

namespace DemoNameSpace 
{ 
    public class DemoClassDAL 
    { 
     private CheckResult UserExist() 
     { 
      CheckResult result = CheckResult.NoDuplicate; 

      using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString)) 
      { 
       SqlCommand cmd = new SqlCommand(@"select top 1 
                case 
                 when AdminNo = @AdminNo then 'AdminExists' 
                 when Username = @UserName then 'UserExists' 
                 when RegisterNo = @RegisterNo then 'RegisterNoExists' 
                end as Result 
                From Register"); 
       cmd.CommandType = CommandType.Text; 
       cmd.Connection = conn; 
       conn.Open(); 

       var dbresult = cmd.ExecuteScalar(); 
       conn.Close(); 

       if (dbresult != DBNull.Value) 
       { 
        Enum.TryParse(dbresult.ToString(), out result); 
       } 
      } 

      return result; 
     } 
    } 

    public enum CheckResult 
    { 
     NoDuplicate, 
     AdminExists, 
     UserExists, 
     RegisterNoExists 
    } 
} 
Verwandte Themen