2009-04-23 9 views
1

Hey Leute, ich möchte meine SQL-Anweisung ausführen, aber ich habe Synatx Probleme, kann mir jemand helfen zu verstehen, was ich falsch mache bitte?Ausführen einer SQL-Anweisung in C#?

Danke, Asche.

public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove) 
{ 

    for (int WordCount = 0; WordCount < WordArray.Length; WordCount++) 
    { 
     string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")"; 

     Debug.Print(sSQL); 

     //Private m_recordset As ADODB.Recordset 
     //Private m_connection As ADODB.Connection 
     ADODB.Recordset RS; 
     ADODB.Connection CN ; 


     CN = new ADODB.Connection(); 
     RS = new ADODB.Recordset(); 

     CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient; 

     CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database"; 
     CN.Open(CN.ConnectionString,"","",0); 

     object dummy = Type.Missing; 

     CN.Execute(sSQL,out dummy,0); 

     RS.Close(); 
     CN.Close(); 

     //string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'"; 
     DatabaseTools.LoadDataFromDatabase(sSQL); 
     //DatabaseTools.LoadDataFromDatabase(sSQL); 

    } 
} 
+0

Was ist der Fehler? – Blorgbeard

+0

Was ist das Ergebnis Ihrer Debug.Print (sSql)? Wo Ihr Code broking ist, wenn Sie debuggen, in CN.Execute? oder beim Öffnen der SQL-Verbindung? – Melursus

+0

Nur ein Hinweis, dass ich meine Antwort auf die Arbeit mit VS 2005/.Net2.0 aktualisiert habe. Es hatte sich auf eine VS2008-Funktion verlassen. –

Antwort

18

Die wichtigste Sache, die Sie beheben müssen, ist Abfrageparameter verwenden, anstatt die Zeichenfolge dynamisch zu erstellen. Dies verbessert die Leistung, Wartung und Sicherheit.

Darüber hinaus möchten Sie die neueren stark typisierten ADO.Net-Objekte verwenden. Stellen Sie sicher, dass Sie Anweisungen für System.Data.OleDb hinzufügen.

Beachten Sie die using Anweisungen in diesem Code. Sie machen sicher Ihre Verbindung ist geschlossen, wenn Sie damit fertig sind. Dies ist wichtig, da Datenbankverbindungen eine begrenzte und nicht verwaltete Ressource sind.

Schließlich verwenden Sie nicht wirklich ein Array in Ihrem Code. Alles, was Sie wirklich interessieren, ist die Fähigkeit, über eine Sammlung von Wörtern zu iterieren, und Sie möchten also ein IEnumerable<string> anstelle eines Arrays akzeptieren. Keine Sorge: Diese Funktion akzeptiert ein Array als Argument, wenn Sie es übergeben müssen.

Noch eine Sache: Wenn Sie Abfrageparameter in OleDb verwenden, ist es wichtig, dass Sie sie in der richtigen Reihenfolge hinzufügen.

Update: Fixed zu arbeiten auf VS 2005/.Net 2.0 (hatte auf VS 2008 Funktionen verlassen).

+3

+1 für gesunden Menschenverstand (parametrisierte Abfrage) –

+0

Dies ist der beste Ansatz, da vorbereitete Anweisungen immer sicherer sind als das dynamische Generieren der Abfragen. Ich werde sie dynamisch erzeugen, wenn absolut keine Informationen von einem Benutzer kommen, das ist das einzige Mal. –

+0

Dies ist ein viel besserer Ansatz, aber die Parameter der Pascal-Case-Methode ließen mich nach den Eigenschaften auf Klassenebene suchen, auf die Sie sich gerade beziehen. –

0

Versuchen Sie, diese (und Sie sollten versuchen, die SQL von außerhalb der Anwendung ausgeführt wird):

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ");"; 
+1

Verketten Sie nicht einfach Ihre SQL-Anweisungen - das ist eine BAD BAD BAD-Praxis und öffnet Ihre Anwendung für SQL-Injection-Angriffe. Verwenden Sie stattdessen parametrisierte Abfragen! Einfach, schnell, sicher. –

+2

Ich würde meine App nicht so schreiben, und ich habe für die Antwort gestimmt, die letztendlich akzeptiert wurde. Ändert nicht die technische Korrektheit der Abfrage, um die es in der Frage ging. – Elie

0

Sie müssen in der SQL-Anweisung um das erste Argument einfache Anführungszeichen hinzuzufügen.

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ")"; 

Charakter und Datumsfelder erfordern Werte mit ‚einfachen Anführungszeichen‘

+0

Verketten Sie nicht einfach Ihre SQL-Anweisungen - das ist eine BAD BAD BAD-Praxis und öffnet Ihre Anwendung für SQL-Injection-Angriffe. Verwenden Sie stattdessen parametrisierte Abfragen! Einfach, schnell, sicher. –

+0

Ja, aber die Frage war nicht, wie verhindere ich eine SQL-Injektion Angriff. Deshalb habe ich diesen Fehler bekommen. – Jeremy

3

umgeben sein, es zunächst erscheint, dass ich nicht hilfreich zu sein. Aber in Wahrheit versuche ich dir zu helfen, also nimm es bitte so. Sie müssen this und this STAT lesen! Sobald Sie das getan haben, hier sind einige gute, saubere ADO.NET examples.

Viel Glück! :)

Verwandte Themen