2017-04-25 4 views
1

Ich habe dieses Problem: Ich muss Raw SQL von meiner .NET Core App ausführen. Also ich habe diesen CodeRaw SQL in .NET Core

var sqlConnection1 = new SqlConnection("Server=(localdb)\\mssqllocaldb;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true"); 
var cmd = new SqlCommand 
{ 
    CommandText = "SELECT * FROM dbo.Candidates WHERE id = " + model.CandidateId, 
    CommandType = CommandType.Text, 
    Connection = sqlConnection1 
}; 

sqlConnection1.Open(); 
var wantedRow = cmd.ExecuteReader(); 
sqlConnection1.Close(); 

Ich kann nicht die Daten in wantedRow zugreifen ... (Wenn ich Entity Framework verwenden diese Abfrage funktioniert, aber ich kann nicht Entity Framework verwenden). Ist es in .NET Core möglich?

+0

Welchen Fehler erhalten Sie? –

+0

Ich erhalte keinen Fehler, ich erhalte SqlDataReader-Objekt und willedRow.GetString() gibt mir ungültigen Versuch zu lesen, wenn keine Daten vorhanden sind. – MacakM

+0

@MacakM Dieser Code ist anfällig für SQL Injection-Angriffe, Sie müssen Ihre Abfrage parametrisieren. Sie behandeln Ihre [IDisposable] (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx) Objekte nicht korrekt. Diese müssen in eine using-Anweisung eingebettet werden. – mason

Antwort

7

Erste tun sollten, ist Ihr Code eine offene Tür für sql injection attacks. Verwenden Sie parametrisierte Abfragen anstelle von verketteten Strings.

Zweite, verwenden Sie die using-Anweisung für alles, was die IDisposable-Schnittstelle implementiert. In diesem Fall - Verbindung, Befehl und Leser.

Dritte, den Leser zu bekommen ist nur ein Teil des Jobs. Sie müssen immer noch reader.Read() verwenden und die Werte abrufen.

using(var sqlConnection1 = new SqlConnection("Server=(localdb)\\mssqllocaldb;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true") 
{ 
    using(var cmd = new SqlCommand() 
    { 
     CommandText = "SELECT * FROM dbo.Candidates WHERE id = @id", 
     CommandType = CommandType.Text, 
     Connection = sqlConnection1 
    }) 
    { 
     cmd.Parameters.Add("@id", SqlDbType.Int).Value = model.CandidateId 
     sqlConnection1.Open(); 

     using(var reader = cmd.ExecuteReader()) 
     { 
      if(reader.Read()) 
      { 
       var id = reader[0]; 
       var whatEver = reader[1]; 
       // get the rest of the columns you need the same way 
      } 
     } 
    } 
} 
+0

Ich möchte eine offene Tür zu SQL Injection machen (deshalb benutze ich kein Entity Framework). Ich weiß auch über die Verwendung, aber zuerst wollte ich einen Code, der funktioniert, dann schreiben Sie Usings. Vielen Dank für Ihre Antwort. – MacakM

+0

Warum möchten Sie, dass Ihr Code anfällig ist? –

+0

Ich möchte diese App verwenden, um meinen Schülern zu zeigen, wie sie SQL Injection machen können :) Aber es ist überraschend schwierig, jetzt eine App zu machen, die anfällig für SQL Injection ist, wenn wir großartige ORM-Frameworks haben: D – MacakM

2

Könnten Sie versuchen, wie unten und versuchen, mit dem SQLDataReader Zugriff:

SqlDataReader reader = command.ExecuteReader(); 

while (reader.Read()) 
{ 
    Console.WriteLine(String.Format("{0}", reader[0])); 
} 
+1

Danke, das funktioniert :) – MacakM

2

ExecuteReader sollten Sie SqlDataReader zurückgeben, was bedeutet, dass Sie so etwas wie

while(wantedRow.Read()) 
{ 
    var aValue = wantedRow[0].Value; 
} 
+0

Vielen Dank das funktioniert! :) – MacakM