2

レコードがデータベースに保存されているかどうかを確認する必要があります。データベースに保存されている場合は、別のフォームを開きます。そうでない場合は、データベースにないというメッセージが表示されます。
レコードがデータベースにない場合、このエラーが発生しますObject reference not set to an instance of an object.
これは私のコードです ここでエラーを見つけるのを手伝ってください:

string cmdStr = "Select NO from COM_LIST_EXPORT where NO = '" + txtNO.Text + "'";
SqlCommand cmd = new SqlCommand(cmdStr, CN);
int count = (int)cmd.ExecuteScalar();
if (count == Convert.ToInt32(txtNO.Text))
{
    Archive_Sader dd = new Archive_Sader();
    dd.Show();
}

else
{
    MessageBox.Show("please save first");
}
4

2 に答える 2

7

ExecuteScalarnullレコードが見つからない場合に戻ります。

したがって、キャストしようとするとnull -> intNullReferenceException

代わりにこれを試してください。

int count = Convert.ToInt32(cmd.ExecuteScalar());

Convert.ToInt320パラメータが の場合に戻りますnull

于 2013-11-15T09:05:15.730 に答える
2

からSqlCommand.ExecuteScalar

戻り値

結果セットの最初の行の最初の列、または結果セットが空の場合は null 参照。

そのため、結果として行がない場合は、実際に に変換しようとしnullますInt32

次のように行を変更する必要があるようです。

int count = Convert.ToInt32(cmd.ExecuteScalar());

パラメータが の場合に がConvert.ToInt32返されるためです。0null

戻り値

value の数値に相当する 32 ビットの符号付き整数、または value が null の場合は 0 (ゼロ)。

そして、常に使用する必要がありますparameterized queries。この種の文字列連結は、SQL Injection攻撃に対して無防備です。

例えば;

string cmdStr = "Select NO from COM_LIST_EXPORT where NO = @NO";
SqlCommand cmd = new SqlCommand(cmdStr, CN);
cmd.Parameters.AddWithValue("@NO", txtNO.Text);
...
于 2013-11-15T09:04:58.337 に答える