Parameter in SQL Query

keks1984

Erfahrenes Mitglied
Hi

also ich hab ein Problem mit der Parameter eingabe. Sprich ich bekomm nen Wert id eingelesen und diesen will ich ich ein SELECT Statement eingeben um das Ergebnis dann in einem DataGridView einzulesen.

Hier ist mein C# Code:

public void Form2_load(DataGridViewCellEventArgs e)
{
SqlConnection con = new SqlConnection("verbindungszeichenfolge;");

con.Open();

DataSet ds = new DataSet();
DataTable dt = new DataTable();

int id = e.RowIndex;
id = id + 1;

string strSQL = "SELECT Kundennummer, Name FROM Testdatenbank.dbo.Kundendaten WHERE id=@id";

SqlDataAdapter sda = new SqlDataAdapter(strSQL, con);
SqlCommandBuilder scb = new SqlCommandBuilder(sda);

sda.InsertCommand = new SqlCommand();
sda.InsertCommand.Parameters.AddWithValue("@id", id);

sda.Fill(ds, "Kundendaten");
dt = ds.Tables["Kundendaten"];

dataGridView2.DataSource = ds.Tables[0];
dataGridView2.Show();

}

Wenn ich das debug kommt die SQLException:

Die "@id"-Skalarvariable muss deklariert werden.

Was mach ich falsch?

MFG
 
SO habs jetzt geändert, aber kommt immer noch der gleiche Fehler.

c# code:

public void Form2_load(DataGridViewCellEventArgs e)
{
SqlConnection con = new SqlConnection("verbindungszeichenfolge");

con.Open();

DataSet ds = new DataSet();
DataTable dt = new DataTable();

string strSQL = "SELECT Kundennummer, Name FROM Testdatenbank.dbo.Kundendaten WHERE id=@id";

SqlDataAdapter sda = new SqlDataAdapter(strSQL, con);
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
SqlParameter @id = new SqlParameter();

id.Direction = ParameterDirection.Output;
id.ParameterName = "@id";
id.DbType = DbType.Int16;

int idR = e.RowIndex;
idR = idR + 1;
id.Value = idR;

sda.InsertCommand = new SqlCommand();
sda.InsertCommand.Parameters.Add(id);

sda.Fill(ds, "Kundendaten");
dt = ds.Tables["Kundendaten"];

dataGridView2.DataSource = ds.Tables[0];
dataGridView2.Show();

}
 
Ändere
Code:
SqlParameter @id = new SqlParameter();

id.Direction = ParameterDirection.Output;
id.ParameterName = "@id";
id.DbType = DbType.Int16;
in
Code:
SqlParameter id = new SqlParameter();

id.Direction = ParameterDirection.Output;
id.ParameterName = "id";
id.DbType = DbType.Int16;
 
OK dass hab ich jetzt gemacht.

Soll ich in der SQL Query das @id lassen ? Weil dann kommt der nächste Fehler

SQLException:
Ungültiger Spaltenname '@id'.

c# code (SQL Query):
string strSQL = "SELECT Kundennummer, Name FROM Testdatenbank.dbo.Kundendaten WHERE id=[@id]";


Hab jetzt auch mal probiert in der Query das @ wegzulassen daraufhin läuft alles durch ABER er zeigt mir alle Datensätze und ich möchte ja nur einen bestimmten z.B. id = 2
 
@id liefert die den SCOPE_IDENTITY Wert, sprich die letzte ID vom zuletzt eingefügten Datensatz. Dies kannst je nach deinen Zweck lassen oder nicht.



Ich nehme mal an das du die Kunden irgendwor anzeigen bzw. Anbinden tust.
DataSorce-Eigenschaft und vorallem DataValue-Eigenschaft.

Wenn du von einem gewählten Kunden die Daten abfragen willst, dann ändere mal deine Abfrage auf
Code:
int id = ltbKunde.SelectedValue;
'oder die Value-Eigenschaft von angebundenen Control
string strSQL = "SELECT Kundennummer, Name FROM Tabellenname WHERE id=" + id;
Datenbankname usw. kannst weglassen, dafür hast ja einen ConnectionString.
 
Ich hab eine Form in der ein DataGridView ist welches die Daten von Kunden anzeigt und wenn ein Kunde was ändern möchte klickt er die Zeile an und diese wird dann in einem neuen Form in einem DataGridView angezeigt wo man des dann ändern kann und dann soll es in die DB.

SO sollte es zumindest funktionieren.

Hab im Query die änderungen reingeschrieben aber geht immer noch net er zeigt in der zweiten Form wieder alle Kundendaten an. Und das andere versteh ich net was meinst du mit "int id = ltbKunde.SelectedValue;"
 
@ksk:
string strSQL = "SELECT Kundennummer, Name FROM Tabellenname WHERE id=" + id;
Mach das in einer Webanwendung, lass die ID in einer Textbox eingeben und ich reiss dir deinen Server so unterm Hintern weg, dass du gar nicht weißt wie dir blüht -> SQL Injection.
 
Soweit ich das mitbekommen habe geht es hier nicht um eine Webanwendung.
Oder wolltest du wieder mal etwas los werden?
Und wenn es sich um eine Webanwednug handelt ist das dann mit einpaar änderung schnell geändert.
Aber du kannst es gern erklären wie du´s zum Absturz bringen könntest. Ich glaube das würde sicher vielen Interesiieren, um mehr für die Sicherheit zu tun.



ksk
 
Zuletzt bearbeitet:
Die Gewohnheit ist der Sündenbock! Gewöhnt man sich an, niemals Parameter zu verwenden, werden diese auch nicht verwendet, wenn es so sein sollte. Zudem ein Beispiel:

Ein erstes Beispiel:
Windows-Anwendung greift auf eine entfernte Datenbank zu. Der User selbst besitzt keinen Zugriff auf die Datenbank. Der ConnectionString ist verschlüsselt. Es werden keine Parameter vergeben. Benutzer verläßt seinen Rechner und sperrt diesen nicht. Angreifer nutzt diese Chance. Dadurch, dass die Anwendung keine Parameter verwendet, kann über sie ein Angriff auf den SQL Server durchgeführt werden. Beispielsweise könnte der Angreifer damit eine Datenbank droppen, oder gar einen Trojaner einschleusen, über den er plötzlich als System-User Berechtigungen am SQL Server besitzt (sofern dieser unter System läuft). Hinzugefügt sei an dieser Stelle auch, dass die meisten Entwickler leider auch produktiv mit dem Benutzer SA arbeiten, wodurch derartige "Spielereien" noch vereinfacht werden.

Ein weiteres Beispiel:
Es wird eine Windows-Forms-Anwendung entwickelt. Sauber, wie es sein sollte, wird die Logik von der Präsentation getrennt. Nun gut. Passend zu dieser Windows-Anwendung sollen nun eine mobile Anwendung, als auch eine Webanwendung verwendet werden. Grundsätzlich sollte also die Logik weiterverwendet werden können. Darin befinden sich unter anderem Datenbank-Zugriffe. Sicherheitsanpassungen werden somit wohl kaum durchgeführt, es funktioniert ja und bei Änderungen würde man sich zusätzliche Fehlerquellen schaffen.

@ksk + webanwendung + ist ja schnell geändert:
Was bringt dir eine schnelle Änderung, wenn du erst dadurch aufmerksam geworden bist, weil es die Datenbank nicht mehr gibt, da sie ein Angreifer einfach mal so gelöscht hat?

Wie du also siehst, wollte ich nicht "nur wieder einmal etwas loswerden".
 

Neue Beiträge

Zurück