2009-07-07 16 views
1

Wie kann ich einen NULL-Parameter an eine SQL-Server-Abfrage übergeben. Ich habe eine einfache Tabelle mit einer Nullable Int-Spalte. Wenn ich einen .NET-Nullwert übergeben, erhalte ich einen SQL-Fehler. Übergeben Sie DBNull.Value, stimmt keine Zeile mit dem Filter überein. Gibt es einen einfachen Weg, dies ohne ISNULL zu tun.NULL-Parameter an SQL-Server-Abfrage übergeben

OleDbConnection connection = new OleDbConnection(); 
    connection.ConnectionString = ...; 
    connection.Open(); 
    OleDbCommand cmd = new OleDbCommand(); 
    cmd.Connection = connection; 
    cmd.CommandText = "select * from myTable where myColumn = ?"; 
    OleDbParameter parameter = cmd.Parameters.Add(null, OleDbType.Integer); 
    parameter.DbType = System.Data.DbType.Int32 ; 
    parameter.IsNullable = true; 
    parameter.Value = DBNull.Value; // no row returned 
    parameter.Value = null; // sql error 
    var reader = cmd.ExecuteReader(); 
... 

Antwort

4

Da NULL entspricht nicht alles (auch NULL = NULL falsch ist), können Sie andere haben keine andere Wahl als die Verwendung der NULL-Anweisung.

1

In SQL verhält sich null etwas anders als andere Werte - Sie können Dinge nicht einfach als = null bewerten, da dies nicht wirklich funktioniert, Sie müssen stattdessen "myColumn is null" verwenden.

In Ihrem Fall müssen Sie, wenn Sie entweder einen Wert oder einen Nullwert abgleichen müssen, eine case-Anweisung in Ihrer where-Klausel verwenden.

Ein bisschen Lesung: wikipedia

1

Wie ocdecio erwähnt, ist NULL sich nicht gleich. Aber Sie haben eine andere Möglichkeit. Wenn Sie in diesem Szenario besorgt über NULL sind, können Sie einfach einen leeren String in Ihrem Parameterwert setzen und die Abfrage selbst wie folgt schreiben:

select * from myTable where COALESCE(myColumn,'') = ? 
+0

Nicht genau richtig - es gibt einen Unterschied zwischen einem Null unbekannten String und einem kenne den Wert der Nulllänge –