Laden...

SqlException Fehlermeldung: Ungültiger Objektname

Erstellt von GeneVorph vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.613 Views
G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 9 Jahren
SqlException Fehlermeldung: Ungültiger Objektname

verwendetes Datenbanksystem: MS SQL Server

Hallo,

dies ist mein erster Post hier im Forum. Ich habe bislang vorrangig mit VBA zu tun gehabt und unternehme seit kurzem meine ersten Gehversuche mit C#.

Ich taste mich noch an C# heran und bin derzeit bei einem Problem angelangt, bei dem ich einfach nicht den richtigen Zugang zur Lösung bekomme.

Im Prinzip ist mein Setting ganz einfach (Beschreibung des erwarteten Verhaltens):
ich habe eine Windows Forms Anwendung, bestehend aus einer Form nebst zwei Textboxen und einem Button. Der Button soll beim Auslösen des Click-Events Zifferneingaben des Users in den Textboxen an eine Tabelle einer Datenbank übermitteln.

Mit dem MS SQL Server Management Studio habe ich eine Datenbank erstellt, die derzeit lediglich eine Tabelle mit zwei Spalten beinhaltet. Diese Tabelle möchte ich ansprechen.

Ich habe in Visual Studio 2013 eine Verbindung zur Datenbank hergestellt und die Datenbankdateien in den Projektordner kopiert.
Wie gesagt, die Anwendung wurde zum Ausprobieren angelegt und ist daher sehr simpel. Hier mein Code unter Form1.cs:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// von mir hinzugefügter Code:
using System.Data.SqlClient;

namespace Datenbank_Test
{
    public partial class Form1 : Form
    {
        SqlConnection conDB = new SqlConnection("Data Source=ARBEITS-PC;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True");

        public Form1()
        {
            InitializeComponent();
        }

        private void btnToDB_Click(object sender, EventArgs e)
        {
                SqlCommand cmdDB = new SqlCommand("Insert into tblOverview (accStatus, savingsStatus) Values(@accStatus, @savingsStatus)", conDB);

                cmdDB.Parameters.AddWithValue("@accStatus", Convert.ToDecimal(txtGiro.Text));
                cmdDB.Parameters.AddWithValue("@savingsStatus", Convert.ToDecimal(txtSavingsVal.Text));

                conDB.Open();
                cmdDB.ExecuteNonQuery();
                conDB.Close();
                
            
        }
    }
}

Den Pfad der Datasource habe ich aus der Eigenschaftenbox des SQL Server-Objekt-Explorers entnommen und einfach kopiert.

Fehlerbeschreibung:
Der Code wird ausgeführt, jedoch mit einer Fehlermeldung abgebrochen. Hier der Wortlaut:> Fehlermeldung:

Ein Ausnahmefehler des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten.

Zusätzliche Informationen: Ungültiger Objektname 'tblOverview'.

Nach dem Beenden der Anwendung ist die Zeile

cmdDB.ExecuteNonQuery();

markiert. Die von mir eingegebenen Werte wurden jedoch nicht in die Datenbanktabelle übernommen (Null).

Was mich gänzlich irritiert ist der Hinweis "Ungültiger Objektname". Der Name der Tabelle tblOverview ist korrekt, aber scheinbar habe ich einen entscheidenden Verweis o.ä. übersehen. Oder denke ich komplett in die falsche Richtung? Jedenfalls: "Ungültiger Objektname" lässt mich jetzt schon seit gestern nach einem Fehler bei der Implementierung suchen - aber vlt. renne ich auch gerade in die falsche Richtung^^

für sachdienliche Hinweise schon mal vorab vielen Dank,

Gruß
Thorsten

R
317 Beiträge seit 2006
vor 9 Jahren

Hallo,

versuch mal im Connection-String den InitialCatalog anzugeben, damit der SQL Server auch weiß, in welcher Datenbank sich die Tabelle "tblOverview" befindet. Bisher gibst du Ihm mit der Data Source ja nur den Server, aber nicht die Datenbank selbst.

Also z.B.:

Data Source=ARBEITS-PC;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;Initial Catalog=Test"

Dann sollte er das Objekt eigentlich auch finden 😉

Grüße,
Daniel

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo GeneVorph,

arbeite zudem mit usings. [Artikelserie] SQL: Parameter von Befehlen hast du schon verinnerlicht glaube ich 😃

Vielleicht wäre [Artikel] Drei-Schichten-Architektur noch ganz interessant, damit hinter dem Button-Click nicht sofort der DB-Request kommt 😉

Gruss

Coffeebean

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 9 Jahren

Hallo robbyrc und coffeebean,

durch euere Hinweise bin ich ein Stückchen weitergekommen! Vielen Dank dafür.

Zunächst einmalt: es war tatsächlich der Initial Catalog, der letztlich zu fehlen schien! Ich habe diese Codezeile dahingehend geändert, das Programm gestartet und siehe da: kein Gemeckere mehr, das hat funktioniert!

Ich habe allerdings eine Sache festgestellt, deren Logik mir sich noch nicht so ganz erschließt:

wenn ich in meine Textbox den Wert 1000 schreibe und das Buttonevent auslöse, dann schreibt das Programm den Wert in die betreffende Spalte der Tabelle.
Das funktioniert für alle Werte verschieden von 1000; so könnte ich - hintereinander - die Werte 60, 400, 289,67 oder 10000 eingeben: brav werden diese entgegengenommen. Gebe ich aber z. B. 10 ein und gleich anschließend nochmal 10, bekomme ich folgende Fehlermeldung:

Fehlermeldung:
"Ein Ausnahmefehler des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten.

Zusätzliche Informationen: Verletzung der PRIMARY KEY-Einschränkung 'PK_tblOverview'. Ein doppelter Schlüssel kann in das dbo.tblOverview-Objekt nicht eingefügt werden. Der doppelte Schlüsselwert ist (2000.00).

Die Anweisung wurde beendet."

[Anmerkung: ich hatte zweimal hintereinander den Wert 2000 eingegeben]

Meine Frage diesbezüglich: der eingegebene Wert sollte den Key der Spalte doch gar nicht beeinflussen, oder (Spalte = Primary Key)? Werden da irgendwelche Zugriffsrechte verletzt? Wie im ersten Post beschrieben: ich habe EINE Datenbank mit EINER Tabelle, die genau ZWEI Spalten hat, wobei diese den Primary-Key hat (s. JPEG).

Gruß
Thorsten

P.S: @Coffeebean: Danke für die Links - das mit der Drei-Schicht-Architektur finde ich dort endlich mal sehr anschaulich beschrieben! Danke!

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 9 Jahren

Oh Mann! Bin ich doof! Ich habe versucht den exakt gleichen Wert einzugeben, wa? Kann es sein, dass damit der Key zweimal vergeben wird? Dann dürfte das die Erklärung sein...kanns leider erst heute abend testen 😦

Falls ich richtig liege: gibt's da ne elegantere Lösung, als das mit einer Ausnahme abzufangen? Für mein Vorhaben sind sporadisch auftretende gleiche Werte im wahrsten Sinne des Wortes vorprogrammiert!

Sollte ich komplett daneben liegen: post me 😉

Gruß
Thorsten

U
135 Beiträge seit 2009
vor 9 Jahren

Naja, wie Du schon selbst erkannt hast, hast Du die Spalte "accStatus" als Primärschlüssel definiert. Der muss natürlich - das ist ja die Defintition eines Primärschlüssels - eindeutig sein. Somit kannst Du nicht zwei mal 2000 als Primärschlüssel verwenden 😉