Discussion:
Replace function in accessdatenbank über C# verwenden
(zu alt für eine Antwort)
Andre Grumbach
2005-04-17 21:28:26 UTC
Permalink
Hallo zusammen,
ich habe mich nun eine weile mit der Umstellung auf Access
rumgequält.
Nun habe ich mir eine Avfrage zusammen gebastellt die meine
SQL Abfrage ersetzen kann.
In dieser Abfrage verwende ich die Replace Function.

SELECT *
FROM Elements
WHERE Replace(Name," ","") Like Replace("*Web Service*","
","");


Wenn ich diese Abfrage in Access ausführe functioniert der
ganze Spaß wunderbar.
Wenn ich nun jedoch via OleDb auf diese Abfrage zugreife
bekomme ich folgenden Fehler:
"Undefinierte Funktion 'Replace' in Ausdruck."

Wieso kann ich Abfrage hier nicht ausführen?
Selbst wenn ich die Abfrage im Code zusammen baue, bekomme
ich den selben Fehler.

Hier einmal den Code:

oldbElementConnection.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=""" +
Environment.CurrentDirectory + @"\Elements.mdb""";

//string strFindCommand = @"SELECT * FROM Elements WHERE
Replace(Name, ' ', '') Like Replace('" + SearchString + "',
' ', '')";
string strFindCommand = @"[Search]";

OleDbCommand FindCommand = new OleDbCommand(strFindCommand,
oldbElementConnection);
FindCommand.CommandType = CommandType.StoredProcedure;

FindCommand.Parameters.Clear();
FindCommand.Parameters.Add("@Search",
OleDbType.VarWChar, 255).Value = SearchString;

try
{
FindCommand.Connection.Open();
System.Data.OleDb.OleDbDataReader reader =
FindCommand.ExecuteReader();
DataTable dtSearch = new DataTable("Search");
DataRow drSearch;

dtSearch.Columns.Add("Id", typeof(Guid));
dtSearch.Columns.Add("Name", typeof(string));

while(reader.Read())
{
drSearch = dtSearch.NewRow();
drSearch["Id"] = reader.GetValue(0);
drSearch["Name"] = reader.GetValue(1);

dtSearch.Rows.Add(drSearch);
}
return dtSearch;
}
catch(System.Data.OleDb.OleDbException ex)
{
string str = ex.Message;
}

Weiß einer wie ich diese Problem beheben kann?

Gruß,
Andre
Peter Fleischer
2005-04-18 05:28:06 UTC
Permalink
Andre Grumbach wrote:
...
Post by Andre Grumbach
Nun habe ich mir eine Avfrage zusammen gebastellt die meine
SQL Abfrage ersetzen kann.
In dieser Abfrage verwende ich die Replace Function.
SELECT *
FROM Elements
WHERE Replace(Name," ","") Like Replace("*Web Service*","
","");
Wenn ich diese Abfrage in Access ausführe functioniert der
ganze Spaß wunderbar.
Andre,
Access ist nicht SQL. In SQL gibt es die Funktion "Replace" nicht. Außerdem
ist der Platzhalter für mehrere Zeichen in SQL das Prozentzeichen.
Post by Andre Grumbach
Wenn ich nun jedoch via OleDb auf diese Abfrage zugreife
"Undefinierte Funktion 'Replace' in Ausdruck."
Wieso kann ich Abfrage hier nicht ausführen?
Weil du mit SQL über ADO.NET arbeiteet.
Post by Andre Grumbach
Selbst wenn ich die Abfrage im Code zusammen baue, bekomme
ich den selben Fehler.
...
Post by Andre Grumbach
Replace(Name, ' ', '') Like Replace('" + SearchString + "',
' ', '')";
Auch hier ist die in SQL unbekannte Funktion "Replace" im SQL-String
enthalten.
Post by Andre Grumbach
OleDbCommand FindCommand = new OleDbCommand(strFindCommand,
oldbElementConnection);
FindCommand.CommandType = CommandType.StoredProcedure;
FindCommand.Parameters.Clear();
OleDbType.VarWChar, 255).Value = SearchString;
Wozu den Parameter, wenn er nicht genutzt wird?

...
Post by Andre Grumbach
Weiß einer wie ich diese Problem beheben kann?
Man könnte mit iif, instr, left, mid usw. etwas basteln. Das ist aber
umständlich. Besser ist garantiert, sich über das Datenbankdesign Gedanken
zu machen oder die letzte Auswahl im Client vorzunehmen.

Peter
Andre Grumbach
2005-04-18 06:54:07 UTC
Permalink
Hallo Peter,

Ich versuche dan Spaß nicht auf SQL zu bekommen sondern auf Access.
Und in Access gibt es die funktion doch wennn mich nicht alles täuscht.

Hoffe hier ist es möglich.

den Parameter will ich später einmal verwenden, jedoch muss zuerst die
Abfrage funktionieren.

Gruß,
Andre
Post by Peter Fleischer
...
Post by Andre Grumbach
Nun habe ich mir eine Avfrage zusammen gebastellt die meine
SQL Abfrage ersetzen kann.
In dieser Abfrage verwende ich die Replace Function.
SELECT *
FROM Elements
WHERE Replace(Name," ","") Like Replace("*Web Service*","
","");
Wenn ich diese Abfrage in Access ausführe functioniert der
ganze Spaß wunderbar.
Andre,
Access ist nicht SQL. In SQL gibt es die Funktion "Replace" nicht. Außerdem
ist der Platzhalter für mehrere Zeichen in SQL das Prozentzeichen.
Post by Andre Grumbach
Wenn ich nun jedoch via OleDb auf diese Abfrage zugreife
"Undefinierte Funktion 'Replace' in Ausdruck."
Wieso kann ich Abfrage hier nicht ausführen?
Weil du mit SQL über ADO.NET arbeiteet.
Post by Andre Grumbach
Selbst wenn ich die Abfrage im Code zusammen baue, bekomme
ich den selben Fehler.
...
Post by Andre Grumbach
Replace(Name, ' ', '') Like Replace('" + SearchString + "',
' ', '')";
Auch hier ist die in SQL unbekannte Funktion "Replace" im SQL-String
enthalten.
Post by Andre Grumbach
OleDbCommand FindCommand = new OleDbCommand(strFindCommand,
oldbElementConnection);
FindCommand.CommandType = CommandType.StoredProcedure;
FindCommand.Parameters.Clear();
OleDbType.VarWChar, 255).Value = SearchString;
Wozu den Parameter, wenn er nicht genutzt wird?
...
Post by Andre Grumbach
Weiß einer wie ich diese Problem beheben kann?
Man könnte mit iif, instr, left, mid usw. etwas basteln. Das ist aber
umständlich. Besser ist garantiert, sich über das Datenbankdesign Gedanken
zu machen oder die letzte Auswahl im Client vorzunehmen.
Peter
Peter Fleischer
2005-04-18 07:05:35 UTC
Permalink
Andre Grumbach wrote:
...
Post by Andre Grumbach
Ich versuche dan Spaß nicht auf SQL zu bekommen sondern auf Access.
Andre,
dann bist du hier in der falschen Newsgroup. Für die Nutzung von Access als
Oberfläche gibt es z.B.:

microsoft.public.access

In dieser Newsgroup geht es um den Datenbankzugriff aus dotNET-Programmen
heraus. Und da wird mittels SQL zugegriffen. Ob da die Jet auf
Access-Dateien oder ob auf SQL-SERVER, Oracle, DB2 usw. zugegriffen wird,
ist da sekundär und äußert sich nur im ConnectionString und in den
providerspezifischen "SQL-Sprachdialekten".

Peter
Elmar Boye
2005-04-18 07:23:30 UTC
Permalink
Hallo Andre,
Post by Andre Grumbach
WHERE Replace(Name," ","") Like Replace("*Web Service*"," ","");
Ich versuche dan Spaß nicht auf SQL zu bekommen sondern auf Access.
Und in Access gibt es die funktion doch wennn mich nicht alles
täuscht.
Jet OleDb ist ungleich Access. Mit der Jet selbst sind
nur die Funktionen zulässig wie beschrieben in
http://support.microsoft.com/?kbid=294698
How to configure Jet 4.0 to prevent unsafe functions from
running in Access 2003

Im übrigen wäre das "*" durch ein "%" zu ersetzen.

Gruss
Elmar
Andre Grumbach
2005-04-18 11:38:33 UTC
Permalink
Danke für Die Info.

Gruß,
Andre
Post by Elmar Boye
Hallo Andre,
Post by Andre Grumbach
WHERE Replace(Name," ","") Like Replace("*Web Service*"," ","");
Ich versuche dan Spaß nicht auf SQL zu bekommen sondern auf Access.
Und in Access gibt es die funktion doch wennn mich nicht alles täuscht.
Jet OleDb ist ungleich Access. Mit der Jet selbst sind
nur die Funktionen zulässig wie beschrieben in
http://support.microsoft.com/?kbid=294698
How to configure Jet 4.0 to prevent unsafe functions from
running in Access 2003
Im übrigen wäre das "*" durch ein "%" zu ersetzen.
Gruss
Elmar
a***@discussions.microsoft.com
2005-04-19 17:24:28 UTC
Permalink
Hallo Elmar,
ich habe heute endlich Zeit gefunden den Spaß zu testen.
Dabei habe ich für SandBoxMode Werte von 0-3 eingesetzt.
Jedoch war das Ergbnis immer das selbe.
Undefinierte Funktion 'Replace' in Ausdruck.
Hierbei verwende ich ja sogar noch eine Standard VB Methode
aber ich will später sogar noch eine eigene Methode aufrufen.

Hast du eine Idee warum ich nicht drauf komme obwohl ich SP
8 installiert habe und die Werte in der Registry
eingetragen habe (Für Macros habe ich jedoch nichts gefunden).

Hoffe du hast noch eine Idee wie ich da drauf komme.

Gruß,
Andre
-----Originalnachricht-----
Hallo Andre,
Post by Andre Grumbach
Post by Andre Grumbach
WHERE Replace(Name," ","") Like Replace("*Web
Service*"," ","");
Post by Andre Grumbach
Ich versuche dan Spaß nicht auf SQL zu bekommen sondern
auf Access.
Post by Andre Grumbach
Und in Access gibt es die funktion doch wennn mich nicht
alles
Post by Andre Grumbach
täuscht.
Jet OleDb ist ungleich Access. Mit der Jet selbst sind
nur die Funktionen zulässig wie beschrieben in
http://support.microsoft.com/?kbid=294698
How to configure Jet 4.0 to prevent unsafe functions from
running in Access 2003
Im übrigen wäre das "*" durch ein "%" zu ersetzen.
Gruss
Elmar
.
Peter Fleischer
2005-04-20 05:53:14 UTC
Permalink
***@discussions.microsoft.com wrote:
...
Post by Andre Grumbach
Undefinierte Funktion 'Replace' in Ausdruck.
Im Sprachumfang von SQL gibt es keine Replace-Funktion.
Post by Andre Grumbach
Hierbei verwende ich ja sogar noch eine Standard VB Methode
aber ich will später sogar noch eine eigene Methode aufrufen.
So etwas ist im SQL nicht vorgesehen. Das musst du bei einem richtigen
SQL-Server in die Prozeduren verlagern.
Post by Andre Grumbach
Hast du eine Idee warum ich nicht drauf komme obwohl ich SP
8 installiert habe und die Werte in der Registry
eingetragen habe (Für Macros habe ich jedoch nichts gefunden).
Da wirst du nichts finden, da es so etwas nicht gibt.

Peter
Elmar Boye
2005-04-20 07:19:06 UTC
Permalink
Hallo Andre,
Post by a***@discussions.microsoft.com
ich habe heute endlich Zeit gefunden den Spaß zu testen.
Dabei habe ich für SandBoxMode Werte von 0-3 eingesetzt.
Jedoch war das Ergbnis immer das selbe.
Undefinierte Funktion 'Replace' in Ausdruck.
Wenn Du die Liste in dem Artikel anschaust, wirst Du
feststellen, dass Replace gar nicht auftaucht.
Das Problem mit der Replace und einigen anderen Methoden
ist, das sie von der VBA 6 Laufzeitumgebung - vor
Access 2000 gabs sie gar nicht - definiert wird und
für die Jet Kernbibliotheken nicht sichtbar ist.
Access erweitert dies und kann beliebige Funktionen
bereitstellen. Das ist aber nicht für .NET oder andere
Programmiersprachen implementiert (bzw. offengelegt).

Somit musst Du in .NET einen Weg suchen, ohne solche
Funktionen klar zu kommen.
Im Falle Deine Beispielabfrage wäre es ohnehin besser,
die Daten um doppelte Leerzeichen bereinigt zu speichern.

Gruss
Elmar

Loading...