2016-07-19 5 views
1

Ich habe empfohlen, meinen Code durch SqlParameter zu ersetzen, um SQL-Injektion als Sicherheitsproblem zu vermeiden, aber mit meinem begrenzten Verständnis. Ich versuchte es der Umsetzung, aber ich bin mit einem Fehler konfrontiert:Fehler mit addwithvalue SQL-Parameter

Must Declare Scalar Variable

Ich habe die anderen Vorschläge anderer Threads versucht, über einen neuen Parameter für jede Einfügung Umsetzung statt den Wert des Parameters für jeden Eintrag zu ersetzen.

String query = "INSERT INTO EmpInfo(EmpYear, EmpStatus, LName, FName, JobTitle, EmpPay, EmpDoB, EmpSex, EmpAddr, EmpCity, EmpState, EmpZIP, EmpCountry, EmpEAddr, EmpTelNo, EmpMobileNo, EmpDate) " + 
       "VALUES('"+EmpYear+"', @EmpStatus, @LName, @FName, @JobTitle, @EmpPay, @EmpDoB, @EmpSex, @EmpAddr, @EmpCity, @EmpState, @EmpZIP, @EmpCountry, @EmpEAddr, @EmpTelNo, @EmpMobileNo, getdate())"; 
String query2 = "INSERT INTO AccountInfo(LName, FName, EmpTemplate, AccountType, EmpStatus, EmpDate) " + 
       "VALUES (@LName, @FName, @EmpTemplate, @AccountType, @EmpStatus, GetDate())"; 

using (SqlConnection connection = new SqlConnection("Data Source=RB-DESKTOP;Initial Catalog=TimeDB;Persist Security Info=True;User ID=sa;Password=bautista7")) 
{ 
    SqlCommand cmd = new SqlCommand(query, connection); 
    cmd.Connection = conn; 

    conn.Open(); 
    cmd.CommandText = "SELECT MAX(EmpID) FROM EmpInfo"; 

    SqlDataReader rdr = cmd.ExecuteReader(); 
    rdr.Close(); 

    SqlCommand command = new SqlCommand(query, cmd.Connection); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpYear", Value = EmpYear }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpStatus", Value = "Active" }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@LName", Value = regLname_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@FName", Value = regFname_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@JobTitle", Value = "NULL" }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpPay", Value = PayType_cb.SelectedItem.ToString() }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpDoB", Value = regDob_dtp.Value.Date }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpSex", Value = gender }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpAddr", Value = regAddr_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCity", Value = regCity_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpState", Value = regState_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpZIP", Value = regZip_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpCountry", Value = regCountry_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpEAddr", Value = regEmail_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpTelNo", Value = regTel_text.Text }); 
    command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpMobileNo", Value = regMob_text.Text }); 

    command.ExecuteNonQuery(); 
    command.Parameters.Clear(); 

    SqlCommand command2 = new SqlCommand(query2, cmd.Connection); 
    command.Parameters.AddWithValue("@LName", regLname_text.Text); 
    command.Parameters.AddWithValue("@FName", regFname_text.Text); 
    command.Parameters.AddWithValue("@EmpTemplate", template); 
    command.Parameters.AddWithValue("@AccountType", AcctType_cb.SelectedItem.ToString()); 
    command.Parameters.AddWithValue("@EmpStatus", "Active"); 

    command.ExecuteNonQuery(); 

    command.Parameters.Clear(); 
+0

Was ist der Fehler? Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –

+0

Es tut mir wirklich leid, aber es ist auf dem Absatz geschrieben. Ich bin mit der Ausnahme von "Must Scala Variable deklarieren" behandelt Nicht nur mit einer Spalte, aber wenn nicht alle von ihnen, die meisten. – user3442765

+0

Aber welche Zeile verursachen Sie diesen Fehler, und was ist der genaue Fehler? Versuchen Sie auch zuerst mit einer einfachen Tabelle mit weniger Feldern zu testen, damit Sie sich leichter auf den Fehler konzentrieren können. [** So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel **] (http://stackoverflow.com/help/ mcve) –

Antwort

0

Sie verwenden die command Variable zweimal statt command2, nachdem Sie command2 schaffen haben. Sie erhalten den Fehler, weil Sie command aller Parameter löschten, dann Parameter hinzufügen (die nicht mit der vorhandenen Abfrage übereinstimmen) und dann ExecuteNonQuery ausführen, die den Fehler dann auslöst.

Ändern Sie die zweite Ausführungsanweisung/Befehl so, beachten Sie, dass nach der Erstellung von command2 es jetzt auch anstelle der Wiederverwendung command verwendet wird.

SqlCommand command2 = new SqlCommand(query2, cmd.Connection); 
command2.Parameters.AddWithValue("@LName", regLname_text.Text); 
command2.Parameters.AddWithValue("@FName", regFname_text.Text); 
command2.Parameters.AddWithValue("@EmpTemplate", template); 
command2.Parameters.AddWithValue("@AccountType", AcctType_cb.SelectedItem.ToString()); 
command2.Parameters.AddWithValue("@EmpStatus", "Active"); 
var numberOfRecordsInserted = command2.ExecuteNonQuery(); 

// value of numberOfRecordsInserted should be 1 

Auch wenn Sie fertig sind mit einem SqlCommand Sie darüber verfügen kann, besteht keine Notwendigkeit, SqlCommand.Parameters.Clear() zu nennen, wenn Sie auf die Wiederverwendung der exakt gleichen SqlCommand Instanz planen, die Sie nicht (zumindest nicht in den entsandten Code).

+0

Vielen Dank! Deine Erklärung war wirklich einfach zu verstehen!Ich habe viele Fehler übersehen. Ich habe das 3 Tage lang gerade programmiert und kaum geschlafen, danke! Ich kann jetzt ruhig schlafen – user3442765

+0

@ user3442765 - kein Problem. Wenn dies Ihre Antwort ist, vergessen Sie bitte nicht, sie als solche zu markieren, indem Sie das Kästchen daneben verwenden. – Igor

+0

Sorry, Sie noch einmal zu belästigen, ich habe es geschafft, die Fehler zu beheben, und ExecuteNonQuery gibt betroffene Zeilen zurück, aber wenn ich in SSMS * aus empinfo auswähle, sind die Tabellen leer. – user3442765

0

Ich denke, Sie sollten versuchen, Ihre Logik zuerst zu vereinfachen. Ich habe einige seltsame Dinge gefunden.

Abfrage hat "VALUES('"+EmpYear+"', Ich glaube, Sie @EmpYear wollen, weil Sie auch

command.Parameters.Add(new SqlParameter() { ParameterName = "@EmpYear", Value = EmpYear }); 

Zusätzlich

SqlCommand cmd = new SqlCommand(query, connection); 
           //^^^ here you use insert query 
cmd.Connection = conn; 
conn.Open(); 
cmd.CommandText = "SELECT MAX(EmpID) FROM EmpInfo"; // But here you change it for a SELECT? 

// Then you execeute a DataReader but you close it before save the result. 
SqlDataReader rdr = cmd.ExecuteReader(); 
rdr.Close(); 

//Then create the insert command again 
SqlCommand commad = new SqlCommand(query, cmd.Connection); 

.... 

// clear command, I guess you want reuse it 
command.Parameters.Clear();     

// now create command 2 is OK 
SqlCommand command2 = new SqlCommand(query2, cmd.Connection); 
            // ^^^ second insert query 

// but add parameteres to command NOT OK 
command.Parameters.AddWithValue("@LName", regLname_text.Text); 
+0

Es tut mir leid, dass mein Verstand verzweifelt versucht hat, jedes Problem zu lösen, und manchmal vergesse ich, die Änderungen rückgängig zu machen. Ich habe stattdessen + EmpYear _ = + verwendet, um die deklarierte Skalarvariable zu vermeiden, wurde aber stattdessen mit dem gleichen Fehler für eine andere Spalte konfrontiert. Ich werde Ihren Rat versuchen, vielen Dank – user3442765

+0

Entschuldigen Sie die Störung noch einmal, ich schaffte es, die Fehler zu beheben und ExecuteNonQuery gibt Zeilen betroffen zurück, aber wenn ich * von EMPInfo in SSMS auswählen, sind die Tabellen leer. – user3442765

Verwandte Themen