2012-04-10 10 views
0

Ich habe eine Webanwendung, die in mehrere Datenbanken schreibt, um Änderungsanforderungen von Mitarbeitern zu verfolgen. Ich stoße auf ein Problem mit der Eingabe eines neuen Mitarbeiters. Sie werden zuerst in die Hauptdatenbank Employee geschrieben, bevor ihre Zugriffsinformationen in die anderen Datenbanken geschrieben werden, wobei EMP_ID der Primärschlüssel ist. Wenn es geht in die anderen Datenbanken zu schreiben EMP_ID wurde noch generiert, so dass es als 0 eingegeben wird.Überprüfung auf primäre Schlüsselzuweisung

Um dies zu beheben Ich habe versucht, die EMP_ID Wert Schleife und überprüfen, bis ein Wert generiert wird, aber ich weiterhin zu bekommen Steht in einer Schleife fest, weil die Abfrage zurückgibt, dass kein Wert gefunden wurde.

while (int.Parse(empIDChecker) == 0) 
{ 
    dbConnection.Open(); 
    validateIDSQLString = "SELECT EMP_ID FROM EMPLOYEE_TABLE WHERE FIRST_NAME = '" +  firstNameTextBox.Text.Trim() + "' AND LAST_NAME = '" + lastNameTextBox.Text.Trim() + "'"; 

    SqlCommand updateSQLCmd = new SqlCommand(validateIDSQLString, dbConnection); 
    SqlDataReader getRecords = updateSQLCmd.ExecuteReader(); 

    try 
    { 
     empIDChecker = getRecords["EMP_ID"].ToString(); 
    } 
    catch 
    { 
     empIDChecker = "0"; 
    } 

    getRecords.Close(); 
    dbConnection.Close(); 
} 
+3

Wie ist Ihr EMP_ID erzeugt - ist es ein Auto-Taste Erhöhen? Wenn dies der Fall ist, müssen Sie dies aus Ihrer insert-Anweisung zurückgeben - etwas wie SELECT SCOPE_IDENTITY() nach dem Einfügen sollte es tun. – Paddy

+5

P.S. Sie sollten sich das auch anschauen: http://stackoverflow.com/questions/601300/what-is-sql-injection – Paddy

+0

Verwenden Sie mehrere Datenbanken oder mehrere Tabellen. Und wenn sie mehrere Datenbanken sind, dann denke ich, dass die Verwendung von Autoinkrement-ID keine gute Idee ist. – Habib

Antwort

1

OK, also, wenn Ihr Einsatz sproc sieht ungefähr so ​​aus:

sp_InsertEmp 
... 

INSERT INTO Emp(Name, etc...) 
VALUES ('Paul', etc...) 

SELECT SCOPE_IDENTITY() AS EMP_ID 

GO 

Und in Ihrem Code:

SqlCommand insertCmd = new SqlCommand("sp_InsertEmp", dbConnection); 

    ... Add parameters here and set type to StoredProcedure 

    SqlDataReader dr= insertCmd.ExecuteReader(); 
    int newId; 

    if (dr.Read()) 
    { 
    newId = dr.GetInteger(0); 
    } 
+0

Bei der Implementierung dieses Codes, bekomme ich diesen Fehler geworfen: "Ungültiger Versuch zu lesen, wenn keine Daten vorhanden sind." Und ich kann nicht herausfinden warum. Die Abfragezeichenfolge ist korrekt, sie gibt die Daten zurück, die ich im Verwaltungsstudio benötige. – Spacemancraig

+0

Wenn Sie etwas von Ihrem Code in Ihrer Frage als Bearbeitung veröffentlichen, könnten wir uns das ansehen. – Paddy

+0

Dies war einfach ein Fall von mir über etwas einfaches schauen. Es fehlt tatsächlich im aktuellen Code, den ich gepostet habe. Ich habe tatsächlich vergessen. Lesen() die Daten ... – Spacemancraig

1

Sie

SELECT IDENT_CURRENT(‘tablename’) 

Dies gibt Ihnen die letzte eingefügt Autoinkrement ID der Tabelle verwenden können, können Sie verwenden, in anderen Tabelle als auch Link

prüfen einfügen http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

+0

Wenn Sie sich diesen Artikel ansehen, sehen Sie, dass er immer die Verwendung von SCOPE_IDENTITY() empfiehlt - die obige Zeile gibt den letzten Identitätswert zurück, der in diese Tabelle eingefügt wurde, unabhängig von Umfang/Sitzung. Wenn du deinen proc zweimal zur gleichen Zeit startest, wirst du irgendwann in Rennen geraten. – Paddy

Verwandte Themen