Datenbearbeiten über OleDbAdapter in Access(Ja) in Excel(Nein)

Itallian

Grünschnabel
Hi,
ich habe folgendes kleines Problem, ich bekomme immer die Fehlermeldung :
Operation muss eine aktualisierbare Abfrage verwenden.

Diese Fehlermeldung tritt immer dann auf, wenn ich über das OleDbCommand Object in eine Excel Datei schreiben will. Ich will hierbei Daten aus einer Access Datenbank in eine Excel Datein "Importieren". Hierfür habe ich mir eine eigene Klasse geschrieben die mir den zukünftigen Excel Zugriff erleichtern soll:
Code:
class EasyXLAdapter
    {
        private OleDbConnection mConnection;
        private OleDbCommand mCommand;

        public void XLConnect(string xlsName, string pCommand, string table)
        {
            CreateConnection(xlsName);
        }

        private void CreateConnection(string xlsName)
        {
            string source = "Provider=Microsoft.JET.OLEDB.4.0;" +
                            "Data Source=D:\\inetpub\\fiz\\fiz_db\\" + xlsName +
                            ";Extended Properties='Excel 8.0; HDR=No; IMEX=1'";
            mConnection = new OleDbConnection(source);
            mCommand = new OleDbCommand();
            mConnection.Open();
            mCommand.Connection = mConnection;
        }

        public void xlInsert(DataTable dtTable, string dtTName)
        {
            foreach (DataRow drCurrent in dtTable.Rows)
            {
                mCommand.CommandText = CreateInsert(drCurrent, dtTName, null);
                mCommand.ExecuteNonQuery();
            }
        }

     #region Alle Überladungen der Klasse xlInsert
        public void xlInsert(DataRow dRow, string dTName)
        {
            mCommand.CommandText = CreateInsert(dRow, dTName, null);
            mCommand.ExecuteNonQuery();
        }

        public void xlInsert(DataTable dtTable, string dtTName, string[] ColumnNames)
        {
            foreach (DataRow drCurrent in dtTable.Rows)
            {
                mCommand.CommandText = CreateInsert(drCurrent, dtTName, ColumnNames);
                mCommand.ExecuteNonQuery();
            }
        }

        public void xlInsert(DataRow dRow, string dTName, string[] ColumnNames)
        {
            mCommand.CommandText = CreateInsert(dRow, dTName, ColumnNames);
            mCommand.ExecuteNonQuery();
        }
     #endregion

        private string CreateInsert(DataRow drCurrent, string dtTName, string[] ColumnNames)
        {
            StringBuilder sb = new StringBuilder("INSERT INTO ");
            sb.Append(dtTName);
            if (ColumnNames != null)
            {
                sb.Append(" (");
                for (int i = 0; i < ColumnNames.GetLength(0); i++)
                {
                    sb.Append(ColumnNames[i]);
                    if (i < (ColumnNames.GetLength(0) - 1))
                    {
                        sb.Append(", ");
                    }
                }
                sb.Append(")");
            }
            sb.Append(" VALUES (");
            for (int i = 1; i < drCurrent.Table.Columns.Count; i++)
            {
                sb.Append("'"+ drCurrent[i].ToString()+"',");
            }
            sb.Append("'true')");

            return sb.ToString();
        }

Aber wie gesagt, die geschilderte Fehlermeldung macht das alles zunichte.
Soweit ich mich erkundigt habe, erscheint die Fehlermeldung wenn die nötigen Rechte nicht eingestellt sind. Wenn ich aber nun über meine MDBZugriffsKlasse eine normale MDB Datenbankl bearbeiten will habe ich keine Probleme damit.
Kann es daran liegen das ich keinen DatenAdapter verwenden? Hab diesen spartanischen Zugriff in der MSDN gefunden und danach sollte es auch gehen.

Bin deshalb ein wenig ratlos und aufgeschemissen...

Euer Itallian
 
Hi,
also das hier ist der resultierende CommandString:
Code:
INSERT INTO [Kontakte$] ('Anrede', 'Vorname', 'WeitereVornamen', 'Nachname', 'Firma', 'Abteilung', 'Position', 'Straßegeschäftlich', 'Ortgeschäftlich', 'Postleitzahlgeschäftlich', 'Landgeschäftlich', 'Faxgeschäftlich', 'Telefongeschäftlich', 'Mobiltelefon', 'EMailAdresse', 'Notizen', 'Webseite', 'guid', 'updated') VALUES ('?','?','','?','?','','?','?','?','?','?','?','?','','?','','','aa0f6992-e505-4cd1-8282-ef9734399cd8','true')

Die Fragezeichen sind Platzhalter, kann ja hier schlecht Kundendaten posten :)

Also ich hab mal versuchte das über QTODBC auszuführen, aber das funktioniert aus anderen Gründen nicht. SQL mag scheinbar beim Excel Zugriff kein eHochkommata, aber auch ohne Hochkommata gibts nen Fehler. Dann beschwert er sich über die Syntax o.O
Den Fehler hat ich aber schonmal. Damals hatte ich nen Array wo die Spaltenüberschriften drinstanden. Die dann an die Funktion als Parameter übergeben werden.
Früher sah das so aus:
Code:
private string[] setTableCaptions()
        {
            string[] stArray = new string[19];
            stArray[0] = "Anrede";
            stArray[1] = "Vorname";
            stArray[2] = "WeitereVornamen";
            stArray[3] = "Nachname";
            stArray[4] = "Firma";
            stArray[5] = "Abteilung";
            stArray[6] = "Position";
            stArray[7] = "Straßegeschäftlich";
            stArray[8] = "Ortgeschäftlich";
            stArray[9] = "Postleitzahlgeschäftlich";
            stArray[10] = "Landgeschäftlich";
            stArray[11] = "Faxgeschäftlich";
            stArray[12] = "Telefongeschäftlich";
            stArray[13] = "Mobiltelefon";
            stArray[14] = "EMailAdresse";
            stArray[15] = "Notizen";
            stArray[16] = "Webseite";
            stArray[17] = "guid";
            stArray[18] = "updated";*/

            return stArray;
        }

Aber das Ging nicht da sich der Kompiler über eine falscher INSERT INTO Syntax beschwerte. Also habe ich auf Rat meines Ausbilders hin die Verbindungs Einstellungen geändert:
Code:
private void CreateConnection(string xlsName)
        {
            string source = "Provider=Microsoft.JET.OLEDB.4.0;" +
                            "Data Source=D:\\inetpub\\fiz\\fiz_db\\" + xlsName +
                            ";Extended Properties='Excel 8.0; HDR=No; IMEX=1'";
             ...
             ...
          }

Und dem zu Folge auch das Array:
Code:
private string[] setTableCaptions()
        {
            string[] stArray = new string[19];
            stArray[0] = "F1";
            stArray[1] = "F2";
            stArray[2] = "F3";
            stArray[3] = "F4";
            stArray[4] = "F6";
            stArray[5] = "F7";
            stArray[6] = "F8";
            stArray[7] = "F9";
            stArray[8] = "F12";
            stArray[9] = "F14";
            stArray[10] = "F15";
            stArray[11] = "F31";
            stArray[12] = "F32";
            stArray[13] = "F41";
            stArray[14] = "F56";
            stArray[15] = "F77";
            stArray[16] = "F91";
            stArray[17] = "F93";
            stArray[18] = "F94";

             return stArray;
        }
Dennoch generiert er halt den geposteten CommandString.
Wenn mein Ausbilder da wäre hätte ich den gefragt aber der ist noch nid eingetrudelt. Hoffe wir finden demnach auch eine Lösung hier.

Der Link hat mir leider garnicht geholfen, da ich nur 1 Tabelle ProAdapter habe dann. Sie also nicht miteinander Verknüpft sind.

Euer Itallian
 
Hi,
Der Fehler lautet:
"Syntaxfehler in der INSERT INTO-Anweisung"
Mehr oder weniger so zumindest, da ich das Projekt bei mir auffer Arbeit habe.
Mein Ausbilder weiß auch nicht sorecht was da los ist.
Ich habs jetzt direkt über Excel gemacht, aber zufrieden bin ich damit wirklich nicht. Ist wesentlich umständlicher als über die OleDBConnection.
Vielleicht findet jemand auch noch eine Lösung das über OleDb zu lösen, darum hack ich es so erstmal nicht als erledigt ab, weil mich interessiert was da Faul dran ist.

Euer Itallian
 

Neue Beiträge

Zurück