Laden...

SQLServer05-Befehl zu MySQL -kompatibel??

Erstellt von haudi vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.155 Views
H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 17 Jahren
SQLServer05-Befehl zu MySQL -kompatibel??

Hallo, ich habe eine C#-Klasse, um Daten von einer SQL Server 2005 Datenbank abzufragen.
Alle News, die ab einem bestimmten Datum eingepflegt wurden und in bestimmten Kategorien sind, sollen abgerufen werden.
Der SQL Befehl sieht nun folgendermaßen aus:

private const string GetNewsByCategoryNumbersStatement = @"
-- Prepare Categories XML
DECLARE @idoc int

-- load XML document into memory
EXEC sp_xml_preparedocument @idoc OUTPUT, @categoriesXml

SELECT ID, Subject, Text, StartDate, EndDate
FROM News
WHERE StartDate BETWEEN @startDate AND GETDATE()
AND EndDate ≥ GETDATE()
AND EXISTS (
SELECT NULL
FROM News_Categories nc
INNER JOIN Categories c ON c.ID = nc.Category
WHERE c.Number IN (
SELECT Number
FROM OPENXML(@idoc, '/categories/category', 1)
WITH (Number INT)
)
)

-- Remove Categories XML
EXEC sp_xml_removedocument @idoc";

Nun möchte ich statt der SQL-Server eine MySQL 5.0 Datenbank anbinden, weiss aber nicht,
wie ich den Befehl am elegantesten umsetzen kann, so dass MySQL damit klarkommt.
Kommt man auch ohne OpenXML an die Ergebnisdaten?
Kennt MySQL dieses "Exists (...)"???

Danke schonmal

H.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Da hast Du jetzt ein ziemlich grosses Problem.

MySql kann überhaupt nichts mit XML-Dateien anfangen.

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 17 Jahren

Hatt ich mir schon gedacht, aber es muss doch möglich sein, trotzdem eine Abfrage hinzubasteln, die einem die News ausgibt, die ab einem bestimmten Datum eingepflegt und halt in bestimmten Kategorien sind ?

Es sind die Tabellen "News", "Categories" und "News-Categories" involviert:
News mit ID, Subject, Text, StartDate, EndDate
Categories mit ID, Name, Number
News-Categories mit ID, Category, NewsItem

Mir kommt das Benutzen von OpenXML an dieser Stelle auch etwas übertrieben vor, oder?

Danke

H.

L
497 Beiträge seit 2006
vor 17 Jahren

Wenn Deine Frage also lautet, wie man einen Datenbankzugriff schreibt, der austauschbar ist, dann kann ich Dir diesen Artikel empfehlen: http://www.microsoft.com/germany/msdn/library/net/adonet/SchreibenEinerPortierbarenDatenzugriffsschicht.mspx?mfr=true

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 17 Jahren

Hi, danke schonmal für den Link!
Aber es ging in erster Linie nicht für ein allgemeines Schema, sondern mehr um das Detailproblem dieser obigen Datenbankabfrage...

Gruß
H.

F
10.010 Beiträge seit 2004
vor 17 Jahren

Tja, wie gesagt, MySql kann das nicht, also musst Du das selber in deinem
C# Code machen.

Und sein Select mit ein Paar WHERE clauseln und Parametern in der
ParameterCollection solltest Du seklber hinbekommen.

Wenn Du dann die vorarbeit gemacht hast, und detailprobleme hast, helfen wir aber gerne.

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 17 Jahren

Hi, ich hab jetzt diese Abfrage hier:
OdbcDataAdapter odbcadapter = new OdbcDataAdapter("select * from news where startdate between ? and now() and enddate ≥ now()", connection);

odbcadapter.SelectCommand.Parameters.Add("@p1", OdbcType.DateTime).Value = startDate;

startdate sieht so aus:
startDate {01.01.0001 00:00:00} System.DateTime

In der Datenbank steht ein Eintrag mit dem StartDatum:
01.01.2006 00:00:00

und dem Enddatum:
11.11.2006 00:00:00

"getdate()" hat nicht funktioniert, aber so klappt es auch nicht, weiss jemand, woran es liegen könnte ? Es wird keine Fehlermeldung ausgespuckt, aber es wird auch kein Ergebnis zurückgegeben!

Danke
H.

L
497 Beiträge seit 2006
vor 17 Jahren

Hast Du das Problem mittlerweile gelöst?
Ich sehe die Stelle in Deinem Statement nicht, wo der Parameter eingefügt wird und die Geschichte mit dem Value kapiere ich auch nicht.

Du meinst wohl eher so etwas:

OdbcDataAdapter odbcadapter = new OdbcDataAdapter("select * from news where startdate between @p1 and now() and enddate >= now()", connection);
odbcadapter.SelectCommand.Parameters.Add("@p1", startDate);

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

T
512 Beiträge seit 2006
vor 17 Jahren

Nö, der Odbc Provider unterstützt nur Parameter über Position, nicht über Namen. Das ? ist Platzhalter für den Parameter, und das erste ? verbindet sich mit dem ersten Parameter.

Ich seh an der Abfrage nichts falsches. Ich würde die einfach mal direkt testen, mit nem beliebigen Datenbanktool, und schauen ob das Ergebnis überhapt falsch ist.

Bei dem Beispieldatensatz ist z.B. endDate der 11.11. und dein Test war wohl am 30. 11. ... eigentlich logisch dass dort nichts zurückgegeben wird.

e.f.q.

Aus Falschem folgt Beliebiges