2016-08-02 5 views
2

現在、私は、SQLデータベース内の列の中で最も高い数値を取得するためのASP.NET C#Webアプリケーションの作成方法を開発中です。今、私は次のコード行を生成します。 connHullはコードの上記ラインのSqlConnectionある使用できない場合、SQLデータベースで最も高い数値を返します。戻り値 '0'

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

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

newTagNo = newTagNo + 1; 

上記のコードでは、データベースにすでに最小限の1行のデータがある場合にのみ、列ComponentTagEntryの中で最も高い数値を取得できます。

データベースが空の場合、.ExecuteScalar()のデータがないため、「指定されたキャストが無効です」というメッセージが返されます。

私が必要とするのは、データベースが空の場合、コードが最高の番号を '0'として取得するためです。

私は上記のコードをif文で変更する必要があることを知っていますが、true/false文と比較しなければならない値はわかりません。

ご協力いただきありがとうございます。

+0

は、私はあなたが「タグ番号」のID列の代わりに、このロジックを使用することを示唆している可能性がありますことをお勧めしたいですか?複数の同時ユーザーが重複したID(競合状態)を生成する可能性があります。 –

+0

'ComponentTagEntry'は、IDの増分が1でIDのシードが1のテーブルのMy Identity列です。このプロジェクトでは、データベースは表形式で表示します。だから私はIDシードを0に変更することはできません。 – Fahmieyz

+0

推薦できるかどうかわかりませんが、null可能なint 'int? 'を使うとうまくいきますか? – HoneyBadger

答えて

3

coalesceは、移動するための方法である:例えば

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

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

行がない場合、 'coalesce'は何もしません。それは行を作成しません。 – HoneyBadger

+0

@HoneyBadger私の編集を参照してください。 –

+0

ああ...それは予想外です。私は訂正した – HoneyBadger

0

は、この文字列で検索してください。両方のSQL Serverで互換性があります。& Mysql:

1

ISNULLオペレータが役立ちます。

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

私は

int newTagNo = 0; 
object testMe = commTagNo.ExecuteScalar(); 
if (testMe != null) { newTagNo = (int)testMe; } 
関連する問題