Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abruffehler:Fehler beim Konvertieren des Datentyps nvarchar in numerisch in SQL

Normalerweise ist es kein Problem, einen string zu übergeben in einen numerischen Parameter, solange der SQL Server in der Lage ist, den Inhalt der Zeichenfolge selbst in einen numerischen Wert umzuwandeln. Wenn das nicht funktioniert, erhalten Sie diesen Fehler.

Zum Beispiel:Übergeben von "Hello" zu einem Parameter, der numerisch ist, erhalten Sie eine Fehlermeldung. Übergabe von "1234" du nicht. Bitte beachten Sie, dass ein leerer String oder ein String mit Leerzeichen nicht in einen numerischen Wert umgewandelt werden kann!

Es sollte jedoch gesagt werden, dass es kein guter Stil ist, dies zu tun. Sie sollten sicherstellen, dass die Typen, die Sie in Ihrer Anwendung verwenden, mit den Typen in der Datenbank übereinstimmen, um Probleme zu vermeiden. Vielleicht ein paar weitere Details darüber, warum Sie string benötigen Typen in Ihrer Anwendung helfen könnten.

BEARBEITEN 1
Um einen Parameter für die Abfrage optional zu machen, gehen Sie wie folgt vor:

  1. Ändern Sie Ihre SQL-Anweisung, um optionale Parameter wie WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) zuzulassen .
  2. Fügen Sie nicht den @Raumklasse_ID hinzu Parameter, wenn er optional sein soll, oder fügen Sie den Wert DBNull.Value hinzu

Sie sollten wirklich in Betracht ziehen, Ihren string zu ändern Eigenschaften zu nullbaren Typen wie int? .

BEARBEITEN 2
So könnte Ihr Code aussehen, wenn Sie die Änderungen implementieren, die ich in Edit 1 vorgeschlagen habe:

using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) OR STADT_ID = ISNULL(@Stadt_ID, STADT_ID) OR GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) OR REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
{
    con.Open();
    if (!String.IsNullOrWhitespace(RAUMKLASSE_ID))
        cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID);
    else
        cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(STADT_ID))
        cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID);
    else
        cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(GEBAEUDE_ID))
        cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID);
    else
        cmd.Parameters.AddWithValue("@Gebaeude_ID", DBNull.Value);
    if (!String.IsNullOrWhitespace(REGION_ID))
        cmd.Parameters.AddWithValue("@Region_ID", REGION_ID);
    else
        cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value);
    ...
}