Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL Saya Membuang Ralat 'Nama Pembolehubah Sudah Diisytiharkan'?

Mengapa Pertanyaan SQL Saya Membuang Ralat 'Nama Pembolehubah Sudah Diisytiharkan'?

Susan Sarandon
Susan Sarandonasal
2025-01-03 08:42:39316semak imbas

Why Does My SQL Query Throw a

Konflik Nama Pembolehubah dalam Pertanyaan SQL

Mesej ralat anda, "Nama pembolehubah '@' telah pun diisytiharkan. Nama pembolehubah mestilah unik dalam kumpulan pertanyaan atau prosedur tersimpan," menunjukkan konflik dalam penamaan pembolehubah dalam SQL anda kod.

Dalam coretan kod yang disediakan, isu timbul apabila cuba menggunakan nama pembolehubah yang sama, "@LockState," beberapa kali dalam gelung dalam pengendali acara "btn_lock2_Click". SQL memerlukan nama pembolehubah unik dalam pertanyaan atau prosedur tersimpan untuk mengelakkan kekeliruan dan kekaburan.

Penyelesaian 1: Kosongkan Parameter selepas Setiap Lelaran Gelung

Satu cara untuk menyelesaikan konflik adalah untuk mengosongkan koleksi parameter sebelum setiap lelaran gelung. Ini memastikan bahawa nama parameter yang sama tidak ditambahkan beberapa kali pada koleksi.

untuk (kaunter panjang = dari; kaunter <= ke; kaunter )
{

rwd.command.Parameters.Clear(); // Clear the parameters collection before adding new parameters

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;
...

}

Penyelesaian 2: Tentukan Parameter Sebelum Gelung

Sebagai alternatif, anda boleh menentukan parameter sebelum gelung dan kemudian mengemas kini nilainya dalam setiap lelaran. Pendekatan ini memastikan bahawa parameter wujud dalam koleksi sebelum gelung bermula, menghapuskan keperluan untuk mengosongkan.

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

untuk (kaunter panjang = dari; kaunter <= ke; kaunter )
{

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;

...

}

Dengan menggunakan salah satu daripada penyelesaian ini, anda boleh memastikan bahawa pertanyaan SQL anda mempunyai nama pembolehubah yang unik, menghalang ralat "sudah diisytiharkan".

Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Saya Membuang Ralat 'Nama Pembolehubah Sudah Diisytiharkan'?. 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