[C#] COMException wurde nicht behandelt

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
596
Hallo zusammen

Ich habe folgendes Problem.

Ich bin daran ein C# Programm zu schreiben, welches mir aus einer .mdb Datenbank tabellen in einem DataGridView anzeigt (funktioniert) und das Schema der Datenbank (Tabellen, Atribute, Schlüssel usw) hirarchisch in einer ListBox anzeigt.

Soweit so gut, nun habe ich das Problem, dass es mir bei conn.Open(null, null, null, 0); immer eine "COMException wurde nicht behandelt (Kein zulässiger Dateinname)" zurückgibt.

Habt ihr eine Idee?

Zur Veranschaulichung der Source:
(Die Fehlerstelle wurde mit "//HIER PASSIERT DIE COMEXCEPTION" markiert)

Code:
/**
 *  DB SCHNITTSTELLE | VERSION 1
 *  SIMON WÜTHRICH 2010
 *  303&104
 * 
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.EnterpriseServices;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace ConnectToAccess
{
    public partial class Form1 : Form
    {
        private OleDbCommand m_cd = null;
        private OleDbConnection m_con = null;
        private bool m_DbEroeffnet;
        private string m_kurzName;

        private string m_NameMDB;
        //Definieren der Instanzvariablen
        OleDbConnection db_verbindung = null;
        OleDbCommand db_anweisung = null;
        OleDbDataAdapter db_adapter = null;
        DataTable db_datentabelle = null;
        OleDbConnection con = new OleDbConnection();

        public Form1()
        {
            string currentsource;
            currentsource = Environment.CurrentDirectory;
            InitializeComponent();
            db_verbindung = new OleDbConnection(); 
            db_verbindung.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source= stockmanagement.mdb";
            db_verbindung.Open();
            db_anweisung = new OleDbCommand();
            db_anweisung.Connection = db_verbindung;
            db_datentabelle = new DataTable();
            //db_verbindung.Close();
            //MessageBox.Show(db_anweisung.ToString());

            //Listbox mit DB  Daten
            ADOX.Catalog catalog = new ADOX.Catalog();
            ADODB.Connection conn = new ADODB.Connection();
            conn.ConnectionString = Properties.Settings.Default.ConnectStr + m_kurzName;
            conn.Open(null, null, null, 0);  //HIER PASSIERT DIE COMEXCEPTION

            LBoxSchema.Items.Clear();
            catalog.ActiveConnection = conn;
            // Alle Tabellen auflisten:
            for (int i = 0; i < catalog.Tables.Count; i++)
            {
                LBoxSchema.Items.Add(catalog.Tables[i].Name);

                //Die Spalten anzeigen (über die Eigenschaft Type können Sie den Datentyp ermitteln):
                LBoxSchema.Items.Add("    Spalten : ");
                for (int j = 0; j < catalog.Tables[i].Columns.Count; j++)
                {
                    LBoxSchema.Items.Add("        " + catalog.Tables[i].Columns[j].Name);
                }

                //Die Tabellenschlüssel bestimmen:
                LBoxSchema.Items.Add("    Schlüssel: ");
                for (int w = 0; w < catalog.Tables[i].Keys.Count; w++)
                {
                    string s = "";
                    for (int k = 0; k < catalog.Tables[i].Keys[w].Columns.Count; k++)
                    {
                        s += catalog.Tables[i].Keys[w].Columns[k].Name + " ";
                    }
                    LBoxSchema.Items.Add("        " + catalog.Tables[i].Keys[w].Name + " -> [" + s.Trim() + "]");
                }
            }



           
                     
        }

        private void Form1_Load(object sender, EventArgs e)
        {


            string crlf = Environment.NewLine;
            try
            {

            }

            catch (OleDbException odex)
            {
                MessageBox.Show(odex.Message);
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            {
                //ZeigeSchemaAktuelleDB();
            }
        }

     
        

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Anweisung
            db_anweisung.CommandText = "Select * from CDVerwaltung";
            db_adapter = new OleDbDataAdapter(db_anweisung);
            //Füllen
            int anzahl = db_adapter.Fill(db_datentabelle);
            dataGridView1.DataSource = db_datentabelle;
            
        }

       
        private void button3_Click(object sender, EventArgs e)
        {
            //Wenn keine Tabelle eingegeben ist, auch keine Aktion machen
            if (textBox1.Text == "")
            { }
            
            
            else
            {
                  //Mittels try&catch die Fehlermeldung (wenn falscher Name eingegeben wird) abfangen&wiedergeben
                try
                  {
                      db_datentabelle.Clear();
                //Eingegebene Tabelle auslesen
                string entrd_text = textBox1.Text;
                //Zusammensetzen
                string anweisung = "Select * from " + entrd_text;
                //Kompl. Anweisung
                db_anweisung.CommandText = anweisung;
                db_adapter = new OleDbDataAdapter(db_anweisung);
                //Abfüllen
                int anzahl = db_adapter.Fill(db_datentabelle);



              
                

                }
                catch (OleDbException odex)
            {
                MessageBox.Show(odex.Message);
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
                
                dataGridView1.DataSource = db_datentabelle;
                dataGridView1.Refresh();
            }
            }

      
        private void listBox1_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            //Items der DB über Formdesigner einfügen

            //Selected Item in die Textbox schreiben
            textBox1.Text = listBox1.SelectedItem.ToString();
        }

       

       
       

        


    }
}
 
Lass dir doch bitte mal deinen "conn.ConnectionString" ausgeben und poste das Ergebnis.

Hier wird die ADO-Connection bei MSDN beschrieben. Vielleicht hilft dir der Ansatz auch noch.

VG,
Mad
 
Den MSDN - Artikel habe ich schon gelesen, hilft in meinem Fall nicht wirklich weiter.

Wie soll ich den ConnectionString ausgeben und hier posten? (sorry ich häng gerade auf der Leitung)
 
Debuggen -> den entsprechenden Wert überwachen -> Wert per "Copy & Paste" hier einstellen :)
 
Ich vermute mal deinen Connection String:

Code:
db_verbindung.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source= stockmanagement.mdb";

Ändere den mal in folgendes um:

Code:
db_verbindung.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=C:\\TEMP\\stockmanagement.mdb";

Das @ Zeichen am Anfang brauchst du nur wenn innerhalb des Strings Backslashes sind die nicht als Teil eines Sonderzeichens interpretiert werden dürfen, z.B. bei Pfadangaben. Alternativ kannst du das @ Zeichen weglassen, musst aber dann bei Pfadangaben ein doppeltes Backslash schreiben, s. o. Beispiel.

Ebenso ist zwischen "Data Source=" und "stockmanagement.mdb" ein Leerzeichen. Das kann evtl. stören, muss aber nicht.

Ich denke jedoch, dass der Dateiname alleine nicht wirklich aussagekräftig ist und würde ihn besser durch einen vollständigen Pfad ersetzen, z.B. ...

Code:
db_verbindung.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
  "Data Source=" + 
  System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stockmanagement.mdb");

... wenn stockmanagement.mdb im Programmverzeichnis liegt.
 
Zurück
Oben