none
Data type mismatch in criteria expression RRS feed

  • Frage

  • Hallo zusammen.

    Ich habe ein Problem an welchem ich schon den ganzen Morgen am verzeifeln bin.

    Folgendes Problem:

    Ich möchte mit Visual C# 2010 Express(auf einem 64 Bit Server) eine query in Access ausführen und das Resultat als .csv speichern. Andauernd bekomme ich den Fehler "Data type mismatch in criteria expression".

    Merkwürdig ist, dass wenn ich den gleichen Code auf einer 32bit Umgebung laufen lasse, alles funktioniert.

    Der ErrorCode lautet: -2147217913 kann aber nicht wirklich eine Lösung über Google finden.

    Hoffe Ihr könnt mir helfen.

    Gruss

    Fredy

    Dienstag, 29. Januar 2013 11:28

Antworten

Alle Antworten

  • Hallo,

    ich nehme mal an das es sich um die selbe EXE-Datei auf dem 32- und dem 64-Bit Rechner handelt.

    Stelle mal in den Optionen deines Projekts die Plattform von AnyCPU auf x86. Einige InterOp's und andere dinge kommen nicht mit Zugriffen aus 64-Bit Prozessen zurecht.

    AnyCPU wird automatisch als 64 Bit Prozess auf 64 Bit Systemen ausgeführt. Auf 32 Bit Ssystemen aber nur als 32 Bit Prozess. Bei der Option x86 wird der Prozess immer als 32 Bit Prozess ausgeführt.


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    Dienstag, 29. Januar 2013 11:35
    Moderator
  • Hallo Fredy,

    die ausgeführte SQL Anweisung und verwendeten Parameter wären dafür sehr hilfreich.

    Denn eine Ursache wären falsche Begrenzer:
    http://www.adopenstatic.com/faq/80040e07.asp

    Gruß Elmar

    Dienstag, 29. Januar 2013 12:23
    Beantworter
  • Hallo,

    besten Dank für deine rasche Antwort. Leider hat das nichts gebracht.

    Folgende Exception bekomme ich:

    {System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.OleDb.OleDbCommand.ExecuteReader()
       at CockpitAssistant.MSAccessLib.ExportQuery(String startDate, String endDate)}

    Gruss Fredy

    Dienstag, 29. Januar 2013 12:51
  • Hallo Elmar,

    die Query braucht folgende Parameter: StartDate und EndDate.

    In Access habe ich diese als Datum/Uhrzeit definiert.

    In meiner Abfrage in C# sieht das so aus:

    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    cmd.Parameters.Add("StartDate", OleDbType.Date).Value=Convert.ToDateTime(startDate.Substring(0,10));

    cmd.Parameters.Add("EndDate", OleDbType.Date).Value=Convert.ToDateTime(endDate.Substring(0, 10));

    wobei startDate ein String ist "01.01.2013" und endDate ebenfalls ein String mit "29.01.2013"

    Gruss Fredy

    Dienstag, 29. Januar 2013 13:05
  • Hallo Robert,

    habe es soeben versucht, nun bekomme ich eine andere Exception: Failed to convert parameter value from a Double to a DateTime.

    Gruss

    Fredy

    Dienstag, 29. Januar 2013 14:17
  • Hallo Fredy1986,

    Bei mir funktioniert es ohne diesen Substring(0,10) was Du machst und mit CultureInfo:

    - C# code snippet -
    
    
    string plainDate = "29.01.2013";
    DateTime dateTime1 = DateTime.Parse(plainDate, new CultureInfo("de-DE"));
    double value = dateTime1.ToOADate();
    DateTime dateTime2 = DateTime.Parse(DateTime.FromOADate(value).ToString(), new CultureInfo("en-US"));
    
    
    - end -

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 29. Januar 2013 15:05
    Moderator
  • Hallo Fredy,

    der SQL Abfragetext wäre immer noch hilfreich.

    Allgemein gilt: VBA-Date wird über ein DBTimeStamp übergeben, da es auch einen Zeitanteil hat.

    Gruß Elmar

    Dienstag, 29. Januar 2013 17:39
    Beantworter
  • Hallo Elmar,

    Die Access-Query lautet:

    PARAMETERS StartDate DateTime, EndDate DateTime;
    SELECT [Re060 Export Monitoring Data].[<ID>], [Re060 Export Monitoring Data].[Art Nr], [Re060 Export Monitoring Data].[User-ID PM], IIf([Creation Date PIM]<>"" And Not IsNull([Creation Date PIM]),CDate([Creation Date PIM]),IIf(Not IsNull([Creation Date AS400]),CDate([Creation Date AS400]),CDate("01.01.1900"))) AS [Creation Date], IIf([30 Ok-to-Web]<>"",Left([30 Ok-to-Web],10),Null) AS [30 Ok-to-Web Transf], [Re060 Export Monitoring Data].[30 Ok-to-Web], IIf(IsNull([Creation Date]),0,IIf(CDate([Creation Date])>=[StartDate] And CDate([Creation Date])<DateSerial(Year([EndDate]),Month([EndDate]),0),1,0)) AS [New Prior Month YTD], IIf(IsNull([Creation Date PIM]),0,IIf(CDate([Creation Date PIM])>=[StartDate] And CDate([Creation Date PIM])<=[EndDate],1,0)) AS [New Current Month YTD], [New Current Month YTD]-[New Prior Month YTD] AS [New vs Prior Month], IIf(IsNull([Creation Date PIM]),0,IIf(CDate([Creation Date PIM])>=[StartDate] And CInt(Format([Creation Date PIM],"ww"))<CInt(Format([EndDate],"ww")),1,0)) AS [New Prior Week YTD], IIf(IsNull([Creation Date PIM]),0,IIf(CDate([Creation Date PIM])>=[StartDate] And CInt(Format([Creation Date PIM],"ww"))<=CInt(Format([EndDate],"ww")),1,0)) AS [New Current Week YTD], [New Current Week YTD]-[New Prior Week YTD] AS [New vs Prior Week], IIf(IsNull([30 Ok-to-Web Transf]),0,IIf(CDate([30 Ok-to-Web Transf])<DateSerial(Year([EndDate]),Month([EndDate]),0),1,0)) AS [Web Prior Month YTD], IIf(IsNull([30 Ok-to-Web Transf]),0,IIf(CDate([30 Ok-to-Web Transf])<=[EndDate],1,0)) AS [Web Current Month YTD], [Web Current Month YTD]-[Web Prior Month YTD] AS [Web vs Prior Month], IIf(IsNull([30 Ok-to-Web Transf]),0,IIf(CInt(Format([30 Ok-to-Web Transf],"ww"))<CInt(Format([EndDate],"ww")),1,0)) AS [Web Prior Week YTD], IIf(IsNull([30 Ok-to-Web Transf]),0,IIf(CInt(Format([30 Ok-to-Web Transf],"ww"))<=CInt(Format([EndDate],"ww")),1,0)) AS [Web Current Week YTD], [Web Current Week YTD]-[Web Prior Week YTD] AS [Web vs Prior Week], IIf([Creation Date PIM]<>"",Int(IIf([30 Ok-to-Web Transf]<>"",CDate([30 Ok-to-Web Transf])-CDate([Creation Date PIM]),CDate([EndDate])-CDate([Creation Date PIM]))),0) AS [Deployment PIM], IIf(IsNull([30 Ok-to-Web Transf]),0,1) AS [OK-to-Web YTD], IIf([30 Ok-to-Web Transf]<>"" Or InStr([Z900 - Monitoring Classification Link Classification Reference],"cl_sysAdminAuto_deletedFolder")>0,0,[Deployment PIM]) AS [Open Deployment], IIf([Open Deployment]>14 And [Open Deployment]<=30,1,0) AS [Late Deployment], IIf([Open Deployment]>30,1,0) AS [Very Late Deployment 30 days], [Re060 Export Monitoring Data].[Z900 - Monitoring Classification Link Classification Reference], IIf(InStr([Z900 - Monitoring Classification Link Classification Reference],"cl_sysAdminAuto_deletedFolder")>0 And [Creation Date]>=[StartDate] And [Creation Date]<=[EndDate],1,0) AS [Deleted on Creation Year], [Re060 Export Monitoring Data].[90 Comments], [Re060 Export Monitoring Data].[<Parent ID>], [Re060 Export Monitoring Data].[Extended Product]
    FROM [Re060 Export Monitoring Data]
    WHERE (((IIf([Creation Date PIM]<>"" And Not IsNull([Creation Date PIM]),CDate([Creation Date PIM]),IIf(Not IsNull([Creation Date AS400]),CDate([Creation Date AS400]),CDate("01.01.1900"))))<=[EndDate]) AND (([Re060 Export Monitoring Data].[Creation Date AS400]) Is Not Null) AND (([Re060 Export Monitoring Data].[Creation Date PIM]) Is Not Null));

    Diese query rufe ich in c# folgendermassen auf:

    const string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + DatabasePath;
    using (OleDbConnection cnn = new OleDbConnection(ConnectionString))
                {
                    string query = "qryCockpitReport";
                    using (OleDbCommand cmd = new OleDbCommand(query, cnn))
                    {
                        cmd.CommandType = System.Data.CommandType.StoredProcedure;                    
                        cmd.Parameters.Add("StartDate", OleDbType.DBTimeStamp).Value=Convert.ToDateTime(startDate);                    
                        cmd.Parameters.Add("EndDate", OleDbType.DBTimeStamp).Value=Convert.ToDateTime(endDate);
                                            
                        try
                        {
                            cnn.Open();
                        }
                        catch (Exception ex)
                        {
                        }
                        StreamWriter sw = null;
                        try
                        {
                            using(OleDbDataReader reader = cmd.ExecuteReader())
                            {.....

    Und jeweils bei "using(OleDbDataReader reader = cmd.ExecuteReader())" bekomme ich die Exception "Data type mismatch"

    Warum funktioniert das denn auf einem 32-Bit System? Da mache ich doch genau das gleiche...

    Gruss

    Fredy


    • Bearbeitet Fredy1986 Mittwoch, 30. Januar 2013 16:35
    Mittwoch, 30. Januar 2013 15:40
  • Hi,

    darf ich ganz ehrlich sein? Deine Objekte haben ziemlich besch****ne Namen. Ich hab wirklich selten solche Tabellen- und Spaltennamen gesehen.

    Wenn es auch nur irgendwie möglich ist, solltest Du das ändern. Und zwar komplett.

    Falls die Namen von einem Fremdsystem (AS400?) kommen, würde ich an deiner Stelle zuerst eine View erstellen, die sämtliche Namen in eine ordentlich lesbare Alternative wandelt (kurz und prägnant, keine Sonderzeichen, keine Leerzeichen, kein Bindestrich), also eigentlich nur a-z, A-Z, 0-9 und _

    Diese View kannst Du dann von deiner obenstehenden Query aus ansprechen. Und danach dann bitte das SQL Statement nochmal formatiert posten. Da blickt doch sonst kein Mensch durch.

    ---

    Zum Problem selbst: Ich vermute, dass die Query direkt auf ein Fremdsystem zugreift. In dem Fall könnte es sein, dass deine Parameter falsch übergeben bzw. interpretiert werden. Prüf mal, ob die Culture Einstellungen deiner Anwendung auf beiden System (32 und 64 Bit) identisch sind. Wenn Du nichts angegeben hast, wird die Cultureeinstellung vom OS genommen. Wenn das eine bspw. deutsch, das andere englich ist, werden die Datumswerte u.U. "falsch" formatiert.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 30. Januar 2013 21:33
    Moderator
  • Hallo Stefan,

    mir ist es bewusst, dass die Namensgebung überhaupt nicht optimal ist.

    Das könnte es sein. Habe auf dem 32-Bit System ein englisches Studio und ein deutsches Access dafür aber auf dem 64-Bit System ein deutsches Studio und ein englisches Access.

    Versuche nun mal alles auf deutsch zu installieren.

    Danke für den Tipp!!!

    Gruss

    Fredy

    Donnerstag, 31. Januar 2013 08:02
  • Hallo Fredy,

    Du musst nicht neu installieren. Über die web.config bzw. app.config kannst Du die culture Einstellungen anpassen. Siehe dazu:

      http://msdn.microsoft.com/de-de/library/hy4kkhe0.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 31. Januar 2013 09:25
    Moderator
  • Hi Stefan,

    unglaublich aber es funktionert! Du hattest recht, musste nicht neu installieren. Habe noch eine weitere Möglichkeit gefunden die für meinen Fall funktioniert und zwar habe ich einfach unter Systemsteuerung -> Region und Sprache die Sprache auf Deutsch gestellt :-)

    Möchte mich nochmals bedanken: Danke, Danke, Danke!!!

    Bis zum nächsten Mal ;-)

    Gruss

    Fredy

    Donnerstag, 31. Januar 2013 13:12