@RED-BARON
Ich kann dir jetzt keinen Fall aus der Praxis sagen wo ich das gemacht oder dringend gebraucht hätte. Grundsätzlich kann es diese Fälle aber sehrwohl geben.
Erstmal ist fraglich ob man es überhaupt immer (oder so gut wie immer) einen bestehenden Key gibt. Dann, wenn es so einen Key gibt, ist fraglich ob man ihn übernehmen kann bzw. will. Wenn man z.B. Daten aus mehreren Quellen importiert kann man den Key oft nicht 1:1 übernehmen. Natürlich kann man den Key erweitern indem man ihn um z.B. eine Quellen-ID erweitert. Will man aber nicht unbedingt immer - zumindest nicht als Primary Key. Was dann gleich der nächste Punkt ist: was wenn der Key mehrspaltig ist, vielleicht gar aus ein paar String-Feldern besteht? Sowas will man oft nicht als Primary Key haben. Also muss ein Surrogate Key her. Wobei man da natürlich als Workaround die automatisch generierten Surrogate-Keys wieder aus der Tabelle raus-selecten kann, indem man auf den übernommenen Candidate-Key filtert. Wenn der Candidate-Key mehrspaltig ist, und man es so richtig performant haben will, wird das allerdings auch wieder etwas kompliziert.
Und dann bleiben wie gesagt die Fälle wo man wirklich keinen Candidate-Key hat.
Und brauchen tut man das dann immer da, wo man abhängige Datensätze mit importieren möchte. Also wo man irgendeine Kopftabelle und Detailtabellen hat, und Daten in beide importieren muss. Denn um die Detailtabellen zu befüllen braucht man logischerweise den Key aus der Kopftabelle.
auf den Pfad : /data/data/my.app.package/files/
kannst Du normal immer zugreifen. Der Pfad ist für deine App "reserviert"
Auf alle anderen Pfade kannst Du nicht zugreifen (Sandbox-Prinzip), außer
auf die SD Karte, wenn Du die Berechtigungen dazu hast (Manifest.xml) bzw.
Dir vom Anwender hast geben lassen.
QT auf Android habe ich nur kurz ausprobiert - das Installieren der Runtime
in den globalen Temp Ordner erschien mir nicht so einfach, das es ein Anwender
allein könnte und das ausliefern im apk erschien mir der Download zu groß.
Die üblichen Nachteile wie bei Xamarin, daher nutze ich Java für Android, würde
aber Qt vor Xamarin vorziehen, wenn ich entscheiden müsste
hallo,
ich habe seit einiger zeit ein problem, das ich eine fk-beziehung nicht definieren kann und ich weiß nicht genau warum (möglicherweise zirkelbezug-problem wegen der update+delete cascade eigenschaft der beziehung).
das szenario: 2 tabellen a+b mit insgesamt 3 feldern, die alle dasselbe feld
"sample_id" (nvarchar 64) darstellen.
a
------------
PK sample_id
b
------------
PK sample_id
PK origin
die sample_id in tabelle a stellt den pk dar, tabelle b ist praktisch eine
historientabelle, welche das entstehen neuer samples aus alten abbildet.
sample_id und origin in tabelle b müssen zusammen eindeutig sein, da es zu einem sample nur einen "vater" (origin) geben kann. ich habe jetzt einen fk in
tabelle b angelegt: dessen sample_id verweist auf die sample_id in tabelle a mit
update+delete cascade. wenn ich jetzt eine zweite beziehung anlegen will,
nämlich das feld origin von tabelle b zur sample_id von tabelle a (wieder mit
update+delete cascade) dann macht er das nicht. ich brauche das aber, denn wenn ein sample umbenannt wird, müssen auch alle einträge in der historientabelle b
umbenannt werden (bisher benennt er nur deren sample_id um).
weiß jemand, wie ich das problem lösen kann, bzw. was das problem überhaupt genau ist.
mdf
tenim
Hallo,
mit dieser Funktion werden die Spaltennamen angezeigt:
void infoTable()
{
sqlite3_stmt *statement;
const char *query = "SELECT * FROM table_name";
if (sqlite3_prepare(dbfile, query, strlen(query), &statement, 0) == SQLITE_OK)
{
int ctotal = sqlite3_column_count(statement);
int res = 0;
while (1)
{
res = sqlite3_step(statement);
if (res == SQLITE_ROW)
{
for (int i = 0; i < ctotal; i++)
{
string s = (char*)sqlite3_column_name(statement, i);
cout << s << " ";
}
cout << endl;
}
if (res == SQLITE_DONE)
{
cout << "done " << endl;
break;
}
}
}
}
MfG
Juergen B.
:p
Mich wundert das SSMS das Skript beim letzten Versuch nicht so erzeugt hat (vielleicht habe ich in meiner Testumgebung eine leere Tabelle erwischt)... Leider wieder SSMS typisch nicht sonderlich lesbar formatiert und einigen Codebloat.
Gut, dann sparen wir uns die Anschaffung von SQL Compare (wurde noch nicht angeschafft, da bei dem kommenden Update doch sehr viel händische Anpassungen nötig sind, zu viel um eine Arbeitserleichterung zu bekommen).
Du kopierst das Backup auf den Zielserver. Du legst im SQL Server Management Studio eine neue, leere Datenbank, mit dem gewüschten Namen an. Diese leere Datenbank wählst Du aus und führst den Restore der DB aus. Fertig.
Dafür benötigt man nur den SA im SQL Management Studio...
Vielen Dank für Eure Antworten.
Der Fehler war, dass ich SQLite.c nicht mitkompiliert habe.
Nun funktioniert es sowohl mit dem Kommandozeilenkompiler gcc als auch mit DEV-C++.
Gruß
Jockel
es gibt leute, die sich nicht mal richtig artikulieren können und trotzdem eine antwort erwarten.
scnr
p.s.
kommt in letzter zeit anscheinend häufiger vor.
muemmel schrieb:
Hi AndyDD,
Ich weiß nicht, warum Du das in der Datenbank speichern willst?
Das ist redundanter Schnuggebutz, der zu Inkonsistenzen führen kann. ...
Mir ist klar das diese Angaben redundant vorliegen. Das hat Performance-Gründe. Die Tabelle hat ca. 400.000 Einträge, Tendenz steigend. Wenn man hier ständig durch alle Datensätze durchsteppen muss um den Max-Wert zu ermitteln dauert das nun mal. Es ist übrigens auch nicht immer sinnvoll alles bis zur 5. Normalform zu normalisieren. Dies geht oft zu Lasten der Performance. Auch die SAP-Datenbanken sind nicht immer bis zum Erbrechen normalisiert.
Außerdem hab ich kein Access (siehe erste Post) sondern einen ziemlich ausgelasteten MS SQL-Server.
DocShoe schrieb:
Postgres unterstützt Composite Types, vielleicht kann MSSQL etwas ähnliches.
Das gibt's bei MS leider nicht. Ich werd das mit der einen Tabelle mit einem Eintrag realisieren. Scheint mir noch die simpelste Lösung. Ja, es stellt eine Redundanz dar, das nehm ich aber in Kauf wenn ich die Kiste etwas entlasten kann.
Hi Konrad33,
bei so kleinen privaten sachen würde ich keine spezielle Datenbak nehmen, sondern das einfach mit ner ACCESS-mdb speichern und mit ADO drauf zugreifen. Das wird ab Win XP vom Betriebssystem unterstützt. Wenn Du Access selber hast, ist es einfacher und Du kannst es besser kommentieren (Access bietet die Möglichkeit zu jeder Tabelle und innerhelb derer zu jedem Feld einen Kommentar zu hinterlegen) aber es ist auch genau so gut alles nur mit den Möglichkeiten von ADO realsierbar.
Keine Ahnung welchen Compiler Du hast aber bei Embarcadero gehts mit C++Builder oder Delphi mit dbGo. Woanders wirds da auch was geben.
Aber man kann wen es sein muss auch direkt mit den Betriebsssystemkomponenten zugreifen ohne entsprechende Unterstützung, aber das ist dann etwas aufwendiger.
Gruß Mümmel
Hi,
hat soweit funktioniert. Musste wie du bereits geschrieben hast die Benutzer sowie die Verbindungszeichenfolge entsprechend anpassen.
Jetzt klappt auch:
WHERE (CAST(Datum AS DATE) = @DATUM)
Vielen Dank für deine Hilfe!
Die Informationen, die du lieferst, sind immer noch sehr vage. Aufgrund dessen, was du sagst, tendiere ich doch zu einem RDBMS. Zu ein Datensatz gehören Nutzdaten und iwelche anderen Daten, das ist doch schon eine Relation.
Hallo ich Habe Jetzt begonnen einen Loader zu machen bin ziehmlicher Anfänger will aber besser werden.
Ich will mir für meine kleinen Apps(Wie Handyapps nur halt fürn Pc) diesen Loader machen das ich sie immer herunterladen kann wo ich will.
Da komme ich zu meinen Fragen
Wie mache ich das ich in der Login case nicht immer zurückgeworfen werde und wie mache ich das das ich mich mit meiner mysql datenbank verbinde hab es zwar versucht aber daraus wurde nichts
Danke für jede Antwort
#include <iostream>
#include <string>
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include <mysql.h>
using namespace std;
int main()
{
int UN;
int PW;
SetConsoleTitle("Alex Loader v1.2");
string Menu[3] = {"Login","Website", "Exit"};
int pointer = 0;
while(true)
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
cout << "Alex\nLoader v1.2\n\n";
for(int i= 0; i < 3 ; ++i)
{
if(i == pointer)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
cout << Menu[i] << endl;
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
cout << Menu[i] << endl;
}
}
while(true)
{
if(GetAsyncKeyState(VK_UP) !=0)
{
pointer -= 1;
if(pointer==-1)
{
pointer =2;
}
break;
}
else if (GetAsyncKeyState(VK_DOWN) !=0)
{
pointer += 1;
if (pointer == 3)
{
pointer = 0;
}
break;
}
else if (GetAsyncKeyState(VK_RETURN) !=0)
{
switch (pointer)
{
case 0:
{
system("cls"); //Konsole leeren
cout << "Login\n\nUsername:";
cin >> UN;
cout << "\nPassword:\n";
cin >> PW;
int base()
{
MYSQL_RES *mTabelle;
MYSQL_ROW mRecord;
MYSQL *mConnection, mDB;
int mError;
mysql_init(&mDB);
mConnection =
mysql_real_connect(&mDB,"localhost","root","","test",0,0,0);
if (mConnection == NULL) {
printf("Es konnte keine Verbindung zur Datenbank hergestellt werden: %s",mysql_error(&mDB));
return 1;
}
else
{
printf("Es wurde erfolgreich eine Verbindung hergestellt!");
}
mysql_close(mConnection);
return 0;
}
getchar();
}
break;
case 1: //Website aufrufen!
{
cout << "Open Website";
ShellExecute(NULL,"Open","www.Alexzb.de",NULL ,NULL,1);
Sleep(1000);
}
break;
case 2:
{
return 0;
}break;
}
break;
}
}
Sleep(150);
}
return 0;
}
torsten_156 schrieb:
Das macht Sinn. Leider mag er die eckige Klammer nicht
Habe auch schon ' und ( versucht. Ohen Erfolg...
Ich hab' irgendwie T-SQL angenommen, keine Ahnung warum.
Egal, die Alternative zu [Some Identifier] ist "Some Identifier" . Ja, wirklich, mit doppelten ". Seltsam, ist aber so. Mit ' macht man 'String Konstanten' . Und runde Klammern sind sowieso für ganz 'was anderes.
Und ja, zeig mal das SELECT was du aktuell hast, was bei dir mit diesem "User name required." fehlschlägt.
Hm Ok, alles klar. Dann werde ich die Anführungszeichen ignorieren.
Hat mich nur irritiert (nicht dass dadurch irgendwelche komischen Nebeneffekte entstehen)...
Ja. Meiner Meinung nach wäre es auch die bessere Lösung hier etwas nachzuforschen, draufzukommen dass es das Problem eigentlich gar nicht gibt, und dann einfach nix zu machen.
Da wird dir so keiner helfen können. Das Problem ist nicht diese Schleife, das muss was anderes sein.
Dass sich nur Unregistrierte mit wenig hilfreichen Antworten melden ist auch ein gutes Zeichen dafür, dass die Frage Kacke ist.
noclue123 schrieb:
mir ist nicht ganz klar, wie ich die relation von einer tabelle zur anderen definieren kann: also ob es eine 1:1, 1:n oder n:m beziehung zwischen den tabellen ist.
Etwas mehr Eigeninitiative wäre schön, zumindest so viel, das man das Gefühl bekommt das du dir selbst darüber schon Gedanken gemacht hast (selbst wenn nicht mit Erfolg).
Etwas zum Einstieg: Jede Verknüpfung erfolgt immer über einzelne Werte (Ein Feld das auf einen Wert einer Tabelle verweist). Das heißt auf mindestens einer Seite steht daher bei der Beziehung effektiv eine 1 (Foreign key der auf einen Id-Wert einer Tabelle verweist). n:m lässt sich nicht direkt, sondern nur über eine Indirektion umsetzen (weitere Tabelle; "Verknüpfungstabelle").
An einem einzelnen Constraint kann man daher nicht ablesen ob es 1:1, 1:n oder n:m ist.
Ich empfehle dir als erstes einmal zu überlegen wie 1:n funktioniert. Alle anderen leiten sich davon ab. Danach stell konkrete Fragen oder Überlegungen - mit Sicherheit hilft dir dann auch jemand weiter.