2009-02-11 9 views
7

Ich brauche einige erwarten Rat, wie Sie Folgendes behandeln: - Ich habe ein Datenfeld misc_text_2, das vom Typ varchar (25) ist und ermöglicht NULL. Nun, wenn ich die folgende SyntaxWie handhabe ich Konvertierung vom Typ 'DBNull' zu Typ 'String' ist nicht gültig

<asp:Label ID="lblPrinter" runat="server" Text='<%# iif(eval("misc_text_2") is dbnull.value, "", iif(eval("misc_text_2") like "NA", "None", iif(eval("misc_text_2") like "KP1", "Kitchen Printer 1", iif(eval("misc_text_2") like "KP2", "Kitchen Printer 2", iif(eval("misc_text_2") like "KP3", "Kitchen Printer 3", iif(eval("misc_text_2") like "BP1", "Bar Printer 1", iif(eval("misc_text_2") like "BP2", "Bar Printer 2", iif(eval("misc_text_2") like "BP3", "Bar Printer 3", Eval("misc_text_2")))))))))%>'></asp:Label> 

Ich halte ein Ausnahmefehler Details zu bekommen: System.InvalidCastException: Konvertierung vom Typ ‚DBNull‘ ‚String‘ zu geben ist nicht gültig.

Ich weiß, ich bin etwas fehlt, aber was ...

Vielen Dank im Voraus

+0

Welche Sprache/Umgebung ist das? Ich würde ASP erraten. Können Sie das erwähnen und die Frage entsprechend markieren? –

Antwort

-1

Sie könnten in Ihrer SQL-Abfrage verwenden isNull (misc_text_2, '') en leeren String zurück statt DBNull .

+16

Niemals leere Zeichenfolgen anstelle von Nullen zurückgeben, dies verringert die Portabilität Ihres Datasets und ist falsch für das Datenmodell. Wenn es ein Null ist, ist es null. Lassen Sie die UI-Schicht sich darum sorgen, wie sie angezeigt wird. –

+1

Das ist deine Meinung. Die Rückgabe eines leeren Strings löst sein Problem, richtig? –

+6

"Leer ist anders als Null". Und das ist keine Meinung, ist eine Tatsache. –

13

Sie müssen explizit nach DBNull.Value suchen und die Konvertierung selbst durchführen.

Mit anderen Worten, erstellen Sie eine Methode, die die Konvertierung für Sie unter Berücksichtigung DBNull.Value berücksichtigt.

3

Beantworten Sie Ihre Frage nicht, aber: Sie sollten wirklich einen Code hinter Methode erstellen, die die Konvertierung durchführt. Dadurch wird der Code leichter zu verstehen und zu debuggen, und der Code kann wiederverwendet werden.

0

Da wir eine Legacy-Datenbank haben, die für MS-Dynamics (Solomon) eingerichtet wurde, besteht unsere Methode zur Verarbeitung von Nullen darin, sie in Null-Strings entweder im ASP- oder VB.NET-Code umzuwandeln. heißt

Trim$(misc_text_2 & " ") 

erhält für jede Version von VB des Problems beseitigen.

+0

Sie brauchen das 'Trim' nicht, wenn Sie' '' 'statt' '' 'verwenden. – CJ7

+0

Verwenden Sie weiterhin die Option Trimmen, da Dynamics nur Felder mit fester Größe verwendet, die leer ausgefüllt sind. – Dave

2

Jedes Mal, wenn Sie die Eval verwenden, müssen Sie irgendwie faule Bewertung shim-in. Gehen Sie ersetzen so, jede Instanz:

iif(eval("misc_text_2") like ...

mit

iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...

Die OrElse wird oder versuchten Umwandlung eines DBNULL verhindern boolean. Aus einer fundamentaleren Perspektive ist Bang jedoch am korrektesten. Dies sollte alles code-behind sein, wahrscheinlich in der ItemDataBound (oder RowDataBound) Event-Handler.

Bei der weiteren Reflexion ...

Die O. P. könnte auch die Convert.ToString() Methode in seinem Code machen, der DBNulls zu String.Empty konvertieren.

0

Wenn Sie den Dataset-Designer verwenden, besteht der einfachste Weg, um diesen Fehler loszuwerden, darin, die Eigenschaften der respektierten Spalte zu ändern.

NullValue Ausnahme zu "Empty" statt "Throw Ausnahme".

hoffe das wird euch allen helfen.

0

Für convert DBNull oder IsDBNull können Sie diese Möglichkeiten versuchen:

  1. Convert DBNull auf einen leeren String

    (DBNullObj) .ToString

  2. erstellen DBNull Converter Funktion

    Öffentliche Funktion ConvertDBNullToString (DBNullObj As Object) als Zeichenfolge

    wenn IsDBNull (DBNullObj) dann

    return ""

    end if

    Rückkehr DBNullObj

    End Function

0

Als spiritUMTP vorgeschlagen, wenn Sie den Datensatz verwenden Designer, ändern Sie DataColumn.NullValue von "Throw exception" auf "empty" oder "Nothing". Ich entschied mich für Letzteres und es behob das Problem. Ich überprüfe jetzt einfach nichts (wenn IsNothing (columnFax) dann ...)

Verwandte Themen