2016-08-02 5 views
2

Derzeit arbeite ich an der Erstellung einer Möglichkeit für ASP.NET C# -Web-app, die höchste Zahl in einer Spalte in SQL-Datenbank abzurufen. Im Moment schaffe ich die folgende Codezeile.Finden Sie die höchste Zahl in der SQL-Datenbank, wenn nicht verfügbar return '0'

commTagNo = new SqlCommand("SELECT MAX(ComponentTagEntry) FROM dbo.HullDataSheet", connHull); 

connHull.Open(); 
int newTagNo = (int)commTagNo.ExecuteScalar(); 
connHull.Close(); 

newTagNo = newTagNo + 1; 

wo die connHullSqlConnection für obige Zeile von Codes ist.

Der obige Code kann die höchste Nummer in der Spalte ComponentTagEntry nur dann abrufen, wenn die Datenbank bereits mindestens eine Datenzeile enthält.

Wenn die Datenbank leer ist, gibt sie 'Specified cast is invalid' zurück, da keine Daten zu finden sind. .ExecuteScalar().

Was ich brauche, ist, wenn die Datenbank leer ist, dass der Code die höchste Nummer als '0' abruft.

Ich weiß, dass ich den obigen Code mit If dann Anweisung ändern muss, aber ich weiß nicht den Wert, den ich mit der True/False-Anweisung vergleichen muss.

Jede Hilfe wird sehr geschätzt.

+0

Darf ich vorschlagen, dass Sie eine Identitätsspalte für den ‚Tag Numbers‘ anstelle dieser Logik verwenden? Es ist möglich, wenn mehrere gleichzeitige Benutzer vorhanden sind, dass eine doppelte ID generiert werden könnte (Race-Bedingung) –

+0

'ComponentTagEntry' ist meine Identity-Spalte in der Tabelle, in der Identity-Inkrement 1 und Identity-Seed ist 1. In diesem Projekt muss die Datenbank in Tabellenform anzeigen. daher kann ich den Identity-Seed nicht auf 0 setzen. – Fahmieyz

+0

Nicht sicher, ob es empfehlenswert ist oder nicht, aber funktioniert es, wenn Sie ein nullable int 'int?' verwenden? – HoneyBadger

Antwort

3

coalesce ist der Weg zu gehen:

select coalesce(max(ComponentTagEntry)) from ... 

Zum Beispiel:

create table dbo.HullDataSheet (ComponentTagEntry int); 

select coalesce(max(ComponentTagEntry), 0) from HullDataSheet 

SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

----------- 
0 

(1 row(s) affected) 

Table 'HullDataSheet'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
+2

Wenn es keine Zeilen gibt, tut 'coalesce' nichts. Es erstellt keine Zeile. – HoneyBadger

+0

@HoneyBadger Siehe meine Änderungen. –

+0

Oh ... das ist unerwartet. Ich stehe korrigiert – HoneyBadger

0

Diese Abfrage. Kompatibel sowohl in SQL Server & Mysql:

select 
    case 
     when MAX(ComponentTagEntry) IS NULL 
      then 0 
      else MAX(ComponentTagEntry) 
    end 
from 
    dbo.HullDataSheet 
1

ISNULL Betreiber helfen sollen.

commTagNo = new SqlCommand("SELECT ISNULL(MAX(ComponentTagEntry), 0) FROM dbo.HullDataSheet", connHull); 
1

Ich würde vorschlagen,

int newTagNo = 0; 
object testMe = commTagNo.ExecuteScalar(); 
if (testMe != null) { newTagNo = (int)testMe; } 
Verwandte Themen