Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Konflik Nama Pembolehubah SQL dalam Gelung?

Bagaimana untuk Menyelesaikan Konflik Nama Pembolehubah SQL dalam Gelung?

Patricia Arquette
Patricia Arquetteasal
2025-01-02 18:13:44400semak imbas

How to Resolve SQL Variable Name Conflicts in Loops?

Konflik Nama Pembolehubah dalam SQL

Apabila melaksanakan pernyataan SQL, anda mungkin menghadapi mesej ralat yang menyatakan bahawa nama pembolehubah telah diisytiharkan dan mestilah unik dalam kumpulan pertanyaan atau prosedur tersimpan. Ini boleh berlaku dalam situasi di mana berbilang parameter dengan nama yang sama ditambah dalam gelung.

Sebagai contoh, pertimbangkan coretan kod berikut:

for (long counter = from; counter <= to; counter++) {
  string upd = "update card set LockState=@lockstate, card_descr=@card_descr where [cardNumber] = N'{0}'";
  rwd.command.CommandText = upd;
  rwd.command.Parameters.Add(new SqlParameter("@LockState", SqlDbType.NVarChar)).Value = 1;
  rwd.command.Parameters.Add(new SqlParameter("@card_descr", SqlDbType.NVarChar)).Value = txt_desc2.Text;
  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}

Dalam kod ini, pembolehubah @LockState ditambahkan pada parameter perintah SQL beberapa kali dalam gelung. Ini melanggar peraturan bahawa nama pembolehubah mestilah unik.

Untuk menyelesaikan isu ini, anda boleh sama ada menambah parameter di luar gelung dan kemudian mengemas kini nilainya dalam gelung atau gunakan kaedah Parameters.Clear() selepas setiap lelaran gelung untuk mengalih keluar parameter yang ditambahkan sebelum ini.

Berikut ialah contoh menambah parameter di luar gelung:

rwd.command.Parameters.Add(new SqlParameter("@LockState", SqlDbType.NVarChar));
rwd.command.Parameters.Add(new SqlParameter("@card_descr", SqlDbType.NVarChar));

for (long counter = from; counter <= to; counter++) {
  string upd = "update card set LockState=@lockstate, card_descr=@card_descr where [cardNumber] = N'{0}'";
  rwd.command.CommandText = upd;

  rwd.command.Parameters["@LockState"].Value = 1;
  rwd.command.Parameters["@card_descr"].Value = txt_desc2.Text;

  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}

Sebagai alternatif, anda boleh menggunakan Parameters.Clear() dalam gelung:

for (long counter = from; counter <= to; counter++) {
  rwd.command.Parameters.Clear();

  string upd = "update card set LockState=@lockstate, card_descr=@card_descr where [cardNumber] = N'{0}'";
  rwd.command.CommandText = upd;
  rwd.command.Parameters.Add(new SqlParameter("@LockState", SqlDbType.NVarChar)).Value = 1;
  rwd.command.Parameters.Add(new SqlParameter("@card_descr", SqlDbType.NVarChar)).Value = txt_desc2.Text;

  rwd.connection.Open();
  rwd.command.ExecuteScalar();
  rwd.connection.Close();
}

Dengan memastikan nama pembolehubah unik dalam parameter SQL anda, anda boleh mengelakkan perisytiharan pembolehubah yang bercanggah dan berjaya melaksanakan kenyataan anda.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Konflik Nama Pembolehubah SQL dalam Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn