Daten einlesen, abfragen und vergleichen
-
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...