Visual C++ : Verbindung mit SQL Datenbank herstellen und query starten...



  • Mit adp->Fill(dsMain); werden die Daten vom Server abgerufen und in das DataSet als Tabelle eingetragen. Das Dataset ist nach der Konstruktion leer, durch das Füllen entsteht dsMain->Tables[0]. Warum hast das auskommentiert? Gibt es Fehler? Ist das SQL fehlerhaft?



  • Spätestens wenn ich

    adp->Fill(dsMain);
    

    wieder zugänglich mache bekomme ich das hier ->

    A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
    


  • Dann kapsele es doch in einem try catch und analysiere das Fehlerobjekt. Möglicherweise ist das SQL fehlerhaft.



  • So... Fehler sind weg... aber die Daten laden nicht in der Grid....
    hier der Quelltext...

    #include "Form1.h"
    
    using namespace Clean;
    using namespace System; 
    using namespace System::Data; 
    using namespace System::Data::Common; 
    using namespace System::Data::SqlClient; 
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
     //SetCompatibleTextRenderingDefault(true);
    	// Enabling Windows XP visual effects before any controls are created
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
    	// Create the main window and run it
    
    	SqlConnection ^cnc = gcnew SqlClient::SqlConnection("Data Source=ne-sql-02[b]\[/b]sql02;Initial Catalog=DPF;User ID=*****;Password=*******"); 
        DataAdapter ^adp = gcnew SqlDataAdapter("SELECT CLID FROM [b]PCDOWN[/b].TE_DPF_ELISEP_INTERIM_TEST ", cnc);  
    	DataSet ^dataSet1 = gcnew DataSet;
    	BindingSource ^bndMain = gcnew BindingSource;
    	DataGridView ^grdMain = gcnew DataGridView;
    
        adp->Fill(dataSet1); 
    	bndMain->DataSource = dataSet1; 
        bndMain->DataMember = dataSet1->Tables[0]->TableName; 
        grdMain->DataSource = bndMain; 
    
    	Application::Run(gcnew Form1());
    
    	return 0;
    }
    


  • witte schrieb:

    Dann habe ich im Datagridview Spalten eingefügt und im DataPropertyName die entsprechenden Spaltennamen der DB-Tabelle eingetragen. Und er zeigt die Daten an.



  • Also... habe eben ein Select * auf die Tabelle gemacht... und er schien auch etwas zu verarbeiten... dauerte etwa 5min bis das Programm gestartet war... Ergebnis : 0 ... hab auch DataPropertyName richtig bennant... glaube ich zumindest...

    Hier einige Screenshots... vll findest du ja den Fehler 🙂

    Column1
    grdMain
    Form
    DataSet
    BindingSource



  • Ich habe jetzt nur 5 Sekunden drauf geschaut, aber muesste DataSource im bndMain nicht dsMain sein? Arbeitest Du mit 2 DataSets?



  • also, ich kann nur DataSet1 oder Form1 als DataSource eingeben...
    In der Tat heisst das 1 DataSet = dsMain aber iw erscheint auf der Form immernoch der name DataSet1 und in der DataSource von bndMain erschein eben nur DataSet1 als DataSet. Und ich arbeite nur mit einem DataSet
    😞

    Edit*: hab dsMain überall zu DataSet1 übergeschrieben... sollte ja eigentlich so auch gehen... Erfolg = nada....
    Scheinbar ist jetzt Imageshack down... argh... 😞



  • Nach dem "Erfolg" letztens war ich zuversichtlich, dass es jetzt klappen würde-.-
    aber anscheinend ist da doch noch irgendwo der Wurm drinn... 😞

    // CRAP.cpp : main project file.
    
    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace CRAP;
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::Common;
    using namespace System::Data::SqlClient;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    // Enabling Windows XP visual effects before any controls are created
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
    	SqlConnection ^cnc = gcnew SqlClient::SqlConnection("Data Source=ne-sql-02\\sql02;Initial Catalog=DPF;User ID=----------;Password=---------"); 
       DataSet ^dataSet1 = gcnew DataSet("dataSet1");
    	DataAdapter ^adp = gcnew SqlDataAdapter("SELECT CLID FROM PCDOWN.TE_DPF_ELISEP_INTERIM_TEST ", cnc);  
       adp->Fill(dataSet1);
       BindingSource ^bindingSource1 = gcnew BindingSource;
       bindingSource1->DataSource = dataSet1;
       bindingSource1->DataMember = dataSet1->Tables[0]->TableName;
       DataGridView ^dataGridView1 = gcnew DataGridView;
       dataGridView1->DataSource =  bindingSource1;
    
    	// Create the main window and run it
    	Application::Run(gcnew Form1());
    
    	return 0;
    }
    


  • Hi, warum legst Du noch ein DatagridView an?

    DataGridView ^dataGridView1 = gcnew DataGridView;
    

    Du musst doch das nehmen, welches Du mit dem Designer angelegt hast.



  • wie kündige ich das denn an? oder erkennt er das grid ohne weiteres`?
    Edit*: Bin gerade Zuhause und kann leider nicht testen^^ erst morgen früh wieder 😞



  • Wenn Du ein Grid auf das Form gepackt hast, muss es doch ein Member Deines Forms sein, dann kannst Du doch darauf zugreifen und die BindingSource zuweisen.



  • .\Clean.cpp(38) : error C2065: 'dataGridView1' : undeclared identifier
    

    Irgendwie muss ich dem doch sagen, dass er auf das DataGrid in Form1.h zugreifen soll, oder?... fehlt mir nen #include oder sowas in der Art??
    Ich verstehe doch richtig, dass wenn ich die "Tools" die ich benutzte in die Form ziehe (dataset/bindingsource/datagridview), diese im Form1.h erstellt werden. Also müsste ich im "Clean.cpp" meiner "main project file." iw eine Referenz bilden... wobei ich immer dachte, dass das

    #include "Form1.h"
    

    ausreicht...



  • Form1 ist keine statische Klasse, Du benötigst ein Objekt dieser Klasse. Dieses wird in Application::Run(gcnew Form1()); on-the-fly erzeugt, der Mainthread wird dort angehalten, bis kein Form mehr existiert und dann mit return 0; die Anwendung beendet. So wird's also nicht laufen.
    Warum packst Du den Code nicht in das OnLoad-Event von Form1?



  • mom mal testen 🙂



  • wOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOt 😃 😃 😃
    Es geht!!!!! 🙂 Vielen Dank^^
    Ich glaub ich muss dir mal nen Bier ausgeben, oder sowas in der Art^^

    (Bin noch nicht ganz fertig mit dem Programm aber schon fast am ende 🙂 hoffe ich kann auf deine Hilfe zählen "falls" noch was kommt xD)



  • und da bin ich wieder 🙂
    Folgendes:
    Ich soll nur eine bestimmte "CLID" aussuchen, also habe ich ->

    DataAdapter ^adp = gcnew SqlDataAdapter("SELECT CLID, SOURCEID, NAME, Street, ZIP, Country, Ship_to_location, Bill_to_Location FROM PCDOWN.TE_DPF_ELISEP_INTERIM_TEST WHERE CLID = '" [b]+ textBox1->Text +[/b] "'" , cnc);
    

    ...das hier gemacht. Klappt auch ganz gut nur 2 Sachen stören mich:
    1. % geht nicht... ka wieso der scheint darauf nicht zu reagieren (Hat sich erledigt :))

    2. Wie kann ich die Einträge in der Grid nach jedem "Search" leeren?



  • KorredC++ schrieb:

    2. Wie kann ich die Einträge in der Grid nach jedem "Search" leeren?

    In dem man in die Doku schaut und feststellt, dass DataSet eine Clear()-Methode besitzt.



  • xD, du sagst es 😉
    ... Programm fertig, aber...(letzte Sache) wenn ich es auf nem anderen Pc starte gibts nen Fehler... ich vermute mal es liegt an .NET Framework da es auf dem anderen Pc nicht drauf ist... liege ich damit richtig?



  • Du könntest es noch abrunden und ein Setup-Projekt zu der Solution packen und das Produkt als Installerpaket ausliefern.


Anmelden zum Antworten