0

私は問題に直面しています。私の場合、新しいレシート番号を作成するために max と + 1 を選択したいと思います。新しいレシートの場合は、以下のコードのように新しい番号が作成されます。ただし、エラーが発生します

オブジェクトを DBNull から他の型にキャストできません

これが私のコードです。

このシステムはPDAで実行されているため、このWebサービスを使用してデータベースを呼び出しています

public string callReceipt(string terminal, ref string msg)
    {
        try
        {
            string sql = "Select MAX(ReceiptNo) from ReceiptStore where terminalno ='" + terminal + "'";
            Logging.Log.writeLog(sql);
            msg = "Success";
            int receiptno = Convert.ToInt32(Data.DAL.ExecuteScalar(sql));
            if (!(sql is DBNull))
            {
                return Convert.ToString(receiptno + 1);
            }
            else
            {
                int receipt = 100000;
                return receipt.ToString();
            }
        }
        catch (Exception e)
        {
            msg = "Error : " + e.Message.ToString();
            Logging.Log.writeLog(msg);
            return msg;
        }
        finally
        {

        }
    }

****** アップデート ******

すべての回答に感謝します。SimpleVar は正しい回答を提供し、私の問題を解決しました。再度、感謝します!

4

4 に答える 4

1

これを試して:

object o = Data.DAL.ExecuteScalar(sql);
if (o is int)
{
    return ((int)o + 1).ToString();
}
else
{
    int receipt = 100000;
    return receipt.ToString();
}

それに加えて、ストアド プロシージャと準備されたクエリを調べる必要があります。

また、キーをインクリメントする場合は、どちらも使用しないでください。ID 列を自動インクリメントする適切なデータベース機能を使用してください。

于 2016-01-11T10:38:16.590 に答える
1

sqlDBNull最初は単純な文字列であり、クエリの結果ではないため、決してすることはできません。エラーが発生するのは、何も返さないData.DAL.ExecuteScalar(sql)場合 (または特に を返す場合) に機能しない intに変換する必要があるためです。ExecuteScalarDBNull

そのメソッドの結果を以下に対してチェックする必要がありますDBNull

var o = Data.DAL.ExecuteScalar(sql);
int receiptno;

if (!(o is DBNull)) receiptno = Convert.ToInt32(o) + 1;
else receiptno = 100000;

return receiptno.ToString();
于 2016-01-11T10:38:27.680 に答える
1

ISNULL演算子を使用します。

Select MAX(ISNULL(ReceiptNo,0)) from ReceiptStore

注: 文字列連結の代わりにパラメータを使用してください!

于 2016-01-11T10:38:32.187 に答える
0

選択クエリの後にSELECT @@ROWCOUNTを実行すると、前のクエリで影響を受けたレコードの数が返されます

于 2016-01-11T11:42:50.923 に答える