Daten einlesen, abfragen und vergleichen



  • Moin,

    könnt ihr mir vielleicht noch kurz verraten wie ich das in C++ umsetzte:

    .$_POST['benutzer']

    $_POST ist ja quasi eine globale Variable, die alle Daten speichert, die gepostet werden oder versteh ich das falsch.

    Womit wäre das in C++ vergleichbar ??

    Grüße



  • meine Abfrage sieht jetzt so aus:

    "SELECT * FROM bndlaender WHERE Nachname=tb_Name->Text and Passwort=tb_Passwort->Text";
    

    läuft aber leider nicht 😕 🕶



  • Hallo,

    ich habe leider keinerlei Erfahrung mit Datenbank abfragen über C++. Vielleicht könntest du noch ein wenig mehr Code posten. Vielleicht findet man dann die Ursache.

    Gruß

    Christopher



  • hab jetzt mal ein bisschen weiter rumgesucht und geforscht, mittlerweile sieht die Abfrage so aus:

    befehl = verbindung->CreateCommand();
    befehl->CommandText = "SELECT count(*) FROM Konten WHERE Nachname='Schmitz' and Passwort='abc'";
    Int32 count = (int) ExecuteScalar();
    

    das Ergebnis ist leider das gleiche. Weiß allerdings noch nicht genau ob die ExecuteScalar() - Methode so richtig angewand ist...



  • Ein paar mehr Information wären hilfreich 😉

    C++, ok, aber welche Datenbank. Verwendest du zufällig die SqlCommand-Klasse (.NET Framework)?



  • arbeite mit SQL Server 2008

    hier mal der ganze Code:

    #pragma once
    
    namespace Touch_Test_2 {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Windows::Forms;
    	using namespace System::Data::SqlClient;
    
    	/// <summary>
    	/// Zusammenfassung für Login_Test
    	/// </summary>
    	public ref class Login_Test : public System::Windows::Forms::Form
    	{
    		String ^verbindungsstr;
    		SqlConnection ^verbindung;
    		SqlCommand ^befehl;
    		SqlDataReader ^leser;
    
    		//int ^_object;
    		array<String^> ^dbNachname;
    		array<String^> ^dbVorname;
    		array<String^> ^dbPasswort;
    
    	private: System::Windows::Forms::TextBox^  tb_Name;
    	private: System::Windows::Forms::TextBox^  tb_Passwort;
    	private: System::Windows::Forms::Button^  btn_Anmelden;
    	private: System::Windows::Forms::Label^  label1;
    	private: System::Windows::Forms::Label^  label2;
    
    	public:
    	virtual Object^ ExecuteScalar();
    
    	public:
    		Login_Test(void)
    		{
    			InitializeComponent();
    			//
    			verbindungsstr = "Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Konten.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
    			verbindung = nullptr;
    			befehl = nullptr;
    			leser = nullptr;
    
    			dbNachname = gcnew array<String^>(16);
    			dbVorname = gcnew array<String^>(16);
    			dbPasswort = gcnew array<String^>(16);
    
    			try
    			{
    				// Verbindung herstellen
    				verbindung = gcnew SqlConnection(verbindungsstr);
    				verbindung->Open();
    
    				// Daten aus Datenbank abfragen 
    				befehl = verbindung->CreateCommand();
    				befehl->CommandText = "SELECT * FROM bndlaender WHERE Nachname='Wynands' and Passwort='abc'";
    
    				//System::Object ^_object = ExecuteScalar();
    
    				/*dbNachname[0] = leser->GetString(0);
    				dbVorname[0] = leser->GetString(0);
    				dbPasswort[0] = leser->GetString(0);*/
    			}
    			catch (SqlException ^e)
             {
                 MessageBox::Show(e->Message, "Datenbankfehler");
             }
             catch (Exception ^e)
             {
                 MessageBox::Show(e->Message, "Datenbankfehler");
             }
             finally  
             {        
                 if (leser != nullptr)
                     leser->Close();
                 if (verbindung != nullptr)
                     verbindung->Close();
             }
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Login_Test()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->tb_Name = (gcnew System::Windows::Forms::TextBox());
    			this->tb_Passwort = (gcnew System::Windows::Forms::TextBox());
    			this->btn_Anmelden = (gcnew System::Windows::Forms::Button());
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->label2 = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// tb_Name
    			// 
    			this->tb_Name->Location = System::Drawing::Point(158, 73);
    			this->tb_Name->Name = L"tb_Name";
    			this->tb_Name->Size = System::Drawing::Size(215, 20);
    			this->tb_Name->TabIndex = 0;
    			// 
    			// tb_Passwort
    			// 
    			this->tb_Passwort->Location = System::Drawing::Point(158, 148);
    			this->tb_Passwort->Name = L"tb_Passwort";
    			this->tb_Passwort->Size = System::Drawing::Size(215, 20);
    			this->tb_Passwort->TabIndex = 1;
    			// 
    			// btn_Anmelden
    			// 
    			this->btn_Anmelden->BackColor = System::Drawing::Color::Transparent;
    			this->btn_Anmelden->FlatAppearance->BorderSize = 3;
    			this->btn_Anmelden->FlatAppearance->MouseDownBackColor = System::Drawing::Color::Olive;
    			this->btn_Anmelden->FlatAppearance->MouseOverBackColor = System::Drawing::Color::DarkKhaki;
    			this->btn_Anmelden->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
    			this->btn_Anmelden->Font = (gcnew System::Drawing::Font(L"Magneto", 9, static_cast<System::Drawing::FontStyle>((System::Drawing::FontStyle::Bold | System::Drawing::FontStyle::Italic)), 
    				System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0)));
    			this->btn_Anmelden->ForeColor = System::Drawing::Color::DarkRed;
    			this->btn_Anmelden->Location = System::Drawing::Point(151, 202);
    			this->btn_Anmelden->Margin = System::Windows::Forms::Padding(4, 3, 4, 3);
    			this->btn_Anmelden->Name = L"btn_Anmelden";
    			this->btn_Anmelden->Size = System::Drawing::Size(165, 27);
    			this->btn_Anmelden->TabIndex = 4;
    			this->btn_Anmelden->Text = L"Anmelden";
    			this->btn_Anmelden->UseVisualStyleBackColor = false;
    			this->btn_Anmelden->Click += gcnew System::EventHandler(this, &Login_Test::btn_Anmelden_Click);
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(27, 81);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(35, 13);
    			this->label1->TabIndex = 2;
    			this->label1->Text = L"Name";
    			// 
    			// label2
    			// 
    			this->label2->AutoSize = true;
    			this->label2->Location = System::Drawing::Point(27, 147);
    			this->label2->Name = L"label2";
    			this->label2->Size = System::Drawing::Size(52, 13);
    			this->label2->TabIndex = 3;
    			this->label2->Text = L"Kennwort";
    			// 
    			// Login_Test
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(466, 262);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->btn_Anmelden);
    			this->Controls->Add(this->tb_Passwort);
    			this->Controls->Add(this->tb_Name);
    			this->Name = L"Login_Test";
    			this->Text = L"Login_Test";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
       private: 
          void btn_Anmelden_Click(Object^  sender, EventArgs^  e) 
          {
    		  // Wenn eins oder beide Eingabefelder leer sind
             if (tb_Name->Text == "" || tb_Passwort->Text == "")
             {
                MessageBox::Show("Sie müssen beide Eingabefelder bearbeiten", "Meldung");
             }
    		 // Wenn der Benutzername und das Kennwort richtig sind
    		 int count = befehl->ExecuteScalar();
             if (count != 0)
             {
                Form^ _DB = gcnew Login_Test;
    			_DB->Show();
             }
    		 // Wenn Benutzername und Kennwort nicht übereinstimmen
    		 if (tb_Name->Text != tb_Passwort->Text)
    		 {
    			 MessageBox::Show("Ihr Benutzername und/oder Kennwort ist falsch !!!", "ACHTUNG !!!");
    		 }
    
          }	
    
    	};
    }
    

    Hab jetzt noch folgenden Fehler in der If - Abfrage:

    error C2440: 'Initialisierung': 'System::Object ^' kann nicht in 'int' konvertiert werden
    1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist



  • Dann mußt du entsprechend 'casten':

    int count = (int)befehl->ExecuteScalar();
    

    Edit: Dann kompiliert zwar dein Code, wird aber dennoch nicht funktionieren, da du innerhalb des ButtonClick-Events ja deine Verbindung schon wieder geschlossen hast (und auch der Rest dieser Methode ist unsinnig).

    P.S. C++/CLI und WinForms sind eine denkbar ungünstige Kombination, s.a Windows Forms und Visual C++ MACHT KEINEN SINN!



  • Das merke ich auch immer mehr. Allerdings muss ich mit dem Programm nachher auch einen Microcontroller ansprechen können. Und für Hardware bezogene Geschichten soll sich C++ doch besser eignen oder ?

    Oder besteht auch die Möglichkeit, die Benutzeroberfläche und eventuell Datenbankanbindung in C# und die Steuerung eines Microcontrollers in C/C++ zumachen und diese dann nachher miteinander zu verknüpfen ???



  • Hallo winni_07,

    Ja genau so würde ich es machen, also GUI und DB-Anbindung mittels C# und die Microcontroller-Steuerung mittels C oder C++. Erzeuge dir einfach eine DLL mit C-Schnittstelle (d.h. nur native Datentypen) und von C# aus kannst du diese dann mittels [DllImport] einbinden: Platform Invoke Tutorial



  • Na das liest sich ja ganz gut. Wenn du nichts dagegen hast, meld ich mich nochmal bei dir wenn es so weit ist 😉

    Gruß



  • Du kannst auch dann gerne im C-Sharp-Forum nachfragen (da ich dort Moderator bin und häufiger lese als hier).
    Oder natürlich im entsprechenden C#-Unterforum hier...


Anmelden zum Antworten