2016-06-09 8 views
-2

Ich versuche, eine einfache C# Windows-Anwendung als Anfänger zu tun. Aber ich bekomme eine System.Data.SqlClient.SqlException. Wenn ich versuche, mich mit der Datenbank zu verbinden, heißt es, dass die Verbindung in Ordnung ist. Aber ich kann keine Tabellen mit Visual Studio erstellen. Ich kann nicht herausfinden, warum Optionen zum Hinzufügen einer neuen Tabelle nicht angezeigt werden. Hier ist mein Code.C# sql verwandte Ausnahme

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace best 
{ 
    public partial class Form1 : Form 
    { 

     SqlConnection con=new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\Janith Kularathne\Documents\testing.mdf; 
     Integrated Security=True;Connect Timeout=30"); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void insertB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "Insert into details values('"+ idBox.Text +"', '"+ nameBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text=""; 
     DisplayDetails(); 
     MessageBox.Show("Insertion succesfull");   
    } 

    private void deleteB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "Delete from details where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text = ""; 
     DisplayDetails(); 
     MessageBox.Show("delete succesfull"); 
    } 

    private void updateB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "update details set id, name,category where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     idBox.Text = ""; 
     nameBox.Text = ""; 
     DisplayDetails(); 
     MessageBox.Show("Update succesfull"); 
    } 

    private void searchB_Click(object sender, EventArgs e) 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "selet *from details where id= '" + idBox.Text + "')"; 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
     DisplayDetails(); 
    } 

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     DisplayDetails(); 
    } 

    public void DisplayDetails() 
    { 
     con.Open(); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "select * from details"; 
     cmd.ExecuteNonQuery(); 
     DataTable dt = new DataTable(); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 
     dataGridView1.DataSource = dt; 

     con.Close(); 
    } 
} 
+1

Was passiert, wenn ich '0' eingeben; Ablagetisch Details; in 'idBox'? –

Antwort

6

Ihr Code zur Zeit eine Vielzahl von verschiedenen Themen enthält, die ich auf ein bisschen erarbeiten werde und sollten einige Ihrer aktuellen Probleme lösen:

  • Unnötige schließenden Klammern
  • Typos und Misspellings
  • falsche Syntax
  • Mit Parametrierung

Zusätzlich zu diesen, würde ich sehr empfehlen, einige Tutorials über die Verwendung der verschiedenen Methoden wie ExecuteNonQuery(), ExecuteReader() und ExecuteNonScalar() zu lesen, um zu ermitteln, wie Sie Werte aus Ihren Abfragen abrufen, sobald Sie sie ausführen.

Unnötige Schluss Parenthèses

Sie haben derzeit eine Hinterschließenden Klammern innerhalb jeder Ihrer Fragen, die wahrscheinlich einen Syntaxfehler in Ihrem SELECT, UPDATE verursacht, und DELETE Anfragen:

// Notice the unnecessary trailing ')', which should only be useful within your INSERT call 
cmd.CommandText = "..." + idBox.Text + "')"; 

Tippfehler und falsche Schreibweise

Eine zusätzliche ty po ist innerhalb Ihrer Suchanfrage sowie das Wort „SELECT“ ist falsch geschrieben:

// "selet" should be "Select" 
cmd.CommandText = "selet *from details where id= '" + idBox.Text + "')"; 

falsche Syntax

Ihre aktuellen UPDATE Abfrage nicht wirklich zu sein scheinen etwas zu tun. Sie verwenden das SET Schlüsselwort, sind aber nicht die Werte tatsächlich zu etwas Einstellung:

// UPDATE queries should be in the form UPDATE {table} SET {Column} = {Value} WHERE ... 
cmd.CommandText = "update details set id, name,category where id= '" + idBox.Text + "')"; 

Parametrierung, nicht Verkettungs

Zusätzlich sollten Sie wirklich in Betracht ziehen Parametrisierung verwenden, wenn Ihre Abfragen zu bauen. Es kann helfen, Gemeinheiten wie SQL Injection zu vermeiden und Syntaxfehler zu vermeiden.

Sie können ein Beispiel sehen, was das unten wie für ein Ihre Methoden aussehen könnte:

private void searchB_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    var query = "SELECT * FROM details WHERE ID = @id"; 
    using(var cmd = new SqlCommand(query, connection)) 
    { 
     cmd.Parameters.AddWithValue("@id",idBox.Text); 
     using(var reader = cmd.ExecuteReader()) 
     { 
       // Access your results here and do something with them 
     } 
    } 
} 
+1

Sollten Sie den Post nicht als offtopisch markiert haben und den Benutzer zwingen, eigene Hausaufgaben zu machen, statt ihm die Antwort auf diese Fehler zu geben? –

+0

Messepunkt. Wenn dies jedoch die Arbeit von OP ist, dann hat er/sie eindeutig versucht, diese zu implementieren, und verschiedene Arten von Fehlern festgestellt. Ich stimme nur ein paar der Dinge, die falsch gemacht wurden und wie sie behoben werden könnten. –

+0

Da hier Pass-Through-Abfragen verwendet werden, würde ich vorschlagen, AddWithValue nicht zu verwenden. Es kann manchmal zu falschen Datentypen kommen. In diesem Fall ist es besser, explizit typisierte Parameter zu verwenden. http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/ –