これらのコード行を使用して、レコードが存在するかどうかを確認しています。
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
ExecuteScalar
は、最初の行の最初の列を返します。他の列または行は無視されます。最初の行の最初の列がnull
であるように見えるため、NullReferenceException
メソッドを使用しようとすると ExecuteScalar
になります。
From [〜#〜] msdn [〜#〜] ;
戻り値
結果セットの最初の行の最初の列または結果セットが空の場合はnull参照。
代わりに、影響を受ける行数を返すCOUNT
をステートメントで使用する必要があります...
パラメータ化されたクエリを使用することは、常に良い習慣です。 SQLインジェクション攻撃を防ぎます。
また、Table
は、T-SQLの reserved keyword です。 [Table]
などの角括弧で使用する必要があります。
最後の提案として、 using
ステートメント を使用して、SqlConnection
とSqlCommand
を破棄します。
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.
}
クエリが以下のような値を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
}
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();
次のように記述できます。
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
}
}
これを試して
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");
}
代わりにメソッドInt.Parse()
を使用してください。それが動作します。
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
}
私は自分自身に同じ質問をしていましたが、明確な答えが見つからなかったので、簡単なテストを作成しました。
プライマリキーが重複する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秒
結果として常に整数を持つために「カウント」を使用します
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
}