web-dev-qa-db-ja.com

データベースにレコードが存在するかどうかを確認します

これらのコード行を使用して、レコードが存在するかどうかを確認しています。

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn);

int UserExist = (int)check_User_Name.ExecuteScalar();

しかし、私はエラーが発生しています:

Object reference not set to an instance of an object.

私はやってみたいです:

if (UserExist > 0)
    // Update record

else

    // Insert record
11
Kamran

ExecuteScalar は、最初の行の最初の列を返します。他の列または行は無視されます。最初の行の最初の列がnullであるように見えるため、NullReferenceExceptionメソッドを使用しようとすると ExecuteScalar になります。

From [〜#〜] msdn [〜#〜] ;

戻り値

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

代わりに、影響を受ける行数を返すCOUNTをステートメントで使用する必要があります...

パラメータ化されたクエリを使用することは、常に良い習慣です。 SQLインジェクション攻撃を防ぎます。

また、Tableは、T-SQLの reserved keyword です。 [Table]などの角括弧で使用する必要があります。

最後の提案として、 usingステートメント を使用して、SqlConnectionSqlCommandを破棄します。

SqlCommand check_User_Name = new SqlCommand("SELECT COUNT(*) FROM [Table] WHERE ([user] = @user)" , conn);
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text);
int UserExist = (int)check_User_Name.ExecuteScalar();

if(UserExist > 0)
{
   //Username exist
}
else
{
   //Username doesn't exist.
}
17
Soner Gönül

クエリが以下のような値を1つだけ返すことが本当に確実な場合は、ExecuteScalarメソッドを使用する必要があります。

SELECT ID FROM USERS WHERE USERNAME = 'SOMENAME'

行全体が必要な場合は、以下のコードがより適切です。

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = @user)" , conn);
check_User_Name.Parameters.AddWithValue("@user", txtBox_UserName.Text);
SqlDataReader reader = check_User_Name.ExecuteReader();
if(reader.HasRows)
{
   //User Exists
}
else
{
   //User NOT Exists
}
4
Cem Sönmez
MySqlCommand cmd = new MySqlCommand("select * from table where user = '" + user.Text + "'", con);
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
DataSet ds1 = new DataSet();
da.Fill(ds1);
int i = ds1.Tables[0].Rows.Count;
if (i > 0) {
    // Exist
}
else {
    // Add 
}
sqlConnection.Open();
using (var sqlCommand = new SqlCommand("SELECT COUNT(*) FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "'", sqlConnection))
{

    SqlDataReader reader = sqlCommand.ExecuteReader();
    if (reader.HasRows)
    {
        lblMessage.Text ="Record Already Exists.";

    }
    else
    {
        lblMessage.Text ="Record Not Exists.";
    }

    reader.Close();
    reader.Dispose();
}

sqlConnection.Close();
1
Singh Kailash

次のように記述できます。

SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn);
if (check_User_Name.ExecuteScalar()!=null)
{
    int UserExist = (int)check_User_Name.ExecuteScalar();
    if (UserExist > 0)
    {
        //Username Exist
    }
}
0
Chirag

これを試して

 public static bool CheckUserData(string phone, string config)
    {
        string sql = @"SELECT * FROM AspNetUsers WHERE PhoneNumber = @PhoneNumber";
        using (SqlConnection conn = new SqlConnection(config)
            )
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                cmd.Parameters.AddWithValue("@PhoneNumber", phone);
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                if (reader.HasRows)
                {
                    return true;  // data exist
                }
                else
                {
                    return false; //data not exist
                }
            }
        }
    }
sda = new SqlCeDataAdapter("SELECT COUNT(regNumber) AS i FROM  tblAttendance",con);
sda.Fill(dt);

string i = dt.Rows[0]["i"].ToString();
int bar = Convert.ToInt32(i);

if (bar >= 1){

    dt.Clear();
    MetroFramework.MetroMessageBox.Show(this, "something");
}
else if(bar <= 0) {

    dt.Clear();
    MetroFramework.MetroMessageBox.Show(this, "empty");
}
0
tendai katsande

代わりにメソッドInt.Parse()を使用してください。それが動作します。

0
shirbr510

Try catchを使用します。

try
{
    SqlCommand check_User_Name = new SqlCommand("SELECT * FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') ", conn);

    int UserExist = (int)check_User_Name.ExecuteScalar();
    // Update query
}
catch
{
    // Insert query
}
0
r.vengadesh

私は自分自身に同じ質問をしていましたが、明確な答えが見つからなかったので、簡単なテストを作成しました。

プライマリキーが重複する100行を追加して、処理に必要な時間を測定しました。 SQL Server 2014 DeveloperとEntity Framework 6.1.3をカスタムリポジトリで使用しています。

Dim newE As New Employee With {.Name = "e"}
For index = 1 To 100
  Dim e = employees.Select(Function(item) item.Name = "e").FirstOrDefault()
  If e Is Nothing Then
    employees.Insert(newE)
  End If
Next  

2.1秒

Dim newE As New Employee With {.Name = "e"}
For index = 1 To 100
  Try
    employees.Insert(newE)
  Catch ex As Exception
  End Try
Next  

3.1秒

0
Ondřej

結果として常に整数を持つために「カウント」を使用します

SqlCommand check_User_Name = new SqlCommand("SELECT count([user]) FROM Table WHERE ([user] = '" + txtBox_UserName.Text + "') " , conn);

int UserExist = (int)check_User_Name.ExecuteScalar();

if (UserExist == 1) //anything different from 1 should be wrong
{
  //Username Exist
}
0
fish3one