Artikel ini akan membuat DataGrid yang berisi kontrol Kotak Centang. Kontrol ini memungkinkan pengguna memilih beberapa kolom untuk penelusuran mendetail. Jika tidak ada cara untuk memulihkan fungsi ini untuk SQL dinamis, maka operasi IN harus digunakan.
Di akhir artikel, kami menulis fungsi yang ditentukan pengguna (UDF) SQL Server untuk memecah string menjadi substring yang dibatasi. Pada artikel ini, kita dapat melihat bagaimana UDF dapat berguna. Kami akan membuat formulir web di mana pengguna dapat memilih beberapa catatan di DataGrid dengan memilih kontrol kotak centang. Detail rekaman yang diperiksa ini akan muncul di DataGrid lain di formulir. Bentuknya tampak seperti gambar di bawah ini.
Di bawah ini adalah ASPX yang kita gunakan untuk membuat form. Catatan: Cara menggunakan kontrol TemplateColumn dan Checkbox untuk menambah kolom DataGrid. Kami juga menggunakan properti DataKeyField DataGrid untuk memberi tahu objek bidang mana dalam catatan database yang akan berisi pengidentifikasi kunci dari baris pertama.
<form id="Form1" metode="posting" runat="server">
<asp:DataGrid id="DataGrid1" runat="server"
AutoGenerateColumns="False" DataKeyField="EmployeeID">
<Kolom>
<asp:Kolom Templat>
<Templat Barang>
<asp:CheckBox runat="server" ID="EmployeeCheckBox" />
</Templat Barang>
</asp:Kolom Templat>
<asp:Kolom Templat>
<Templat Barang>
<%# DataBinder.Eval(Container.DataItem, "Nama Belakang") %>,
<%# DataBinder.Eval(Container.DataItem, "Nama Depan") %>
</Templat Barang>
</asp:Kolom Templat>
</Kolom>
</asp:DataGrid>
<hr>
<asp:Button id="Pesanan" runat="server" Text="Lihat Pesanan"></asp:Button>
<jam>
<asp:DataGrid ID="DataGrid2" Runat="server" AutoGenerateColumns="Benar" />
</form>
Saat formulir dimuat dan diinisialisasi, DataGrid teratas perlu dirakit. Kode ini menggunakan Perpustakaan Perusahaan untuk mengakses database contoh SQL Sever Northwind dan menjalankan pernyataan "SELECT EmployeeID, FirstName, LastName FROM Employees". Kode untuk event pemuatan adalah sebagai berikut:
private void Page_Load(pengirim objek, System.EventArgs e)
{
if(!Halaman.IsPostBack)
{
Basis data db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
menggunakan(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
menggunakan (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid1.DataSource = dataReader;
DataGrid1.DataBind();
}
}
}
}
Ketika user mengklik tombol “Pesanan”, kita ingin menampilkan tabel data kedua yang cocok dengan yang ada di database dengan Karyawan dan berhubungan dengan data Pesanan. Salah satu cara untuk melakukannya adalah dengan membuat SQL dinamis dan menggunakan kondisi OR dari semua EmployeeID yang diperlukan untuk pernyataan WHERE.
Metode kedua adalah dengan menggunakan operasi IN pada pernyataan WHERE. Operasi IN membandingkan daftar ekspresi. Misalnya, pernyataan berikut mengembalikan informasi antara IDS karyawan 7 dan 4.
SELECT EmployeeID, FirstName, LastName FROM Employees WHERE EmployeeID IN (7, 4)
Secara konseptual, saya ingin menggunakan parameter string tunggal untuk menanyakan ID yang diteruskan, namun, mungkin sebagai string tunggal, parameter tersebut tidak dapat digunakan untuk operasi IN A parameter string tunggal. Dalam hal ini, pernyataan SQL akan menjadi "WHERE Employee IN ('7, 4')" dan database akan mengembalikan pesan kesalahan karena EmployeeID bertipe int - bukan varchar.
Namun, kami menggunakan fungsi split yang dibuat di artikel untuk memisahkan string menjadi nilai yang berbeda. Lewatkan string '7, 4' ke fungsi split dan kita akan mendapatkan dua record yang sesuai dengan nilai 4 dan 7. Kueri SQL untuk memilih karyawan dan menghitung total pesanannya adalah sebagai berikut:
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
Yang diperlukan untuk menggunakan query di atas adalah parameter @employeeIDs harus ditetapkan dan diteruskan. Parameter ini akan menjadi daftar ID yang dipisahkan koma. Untuk membangun string ini, untuk mengetahui apakah baris tersebut dipilih oleh pengguna, kita perlu menggunakan loop yang melakukan iterasi melalui jumlah baris dan mencentang setiap kontrol kotak centang. Jika pengguna memilih satu baris, kuncinya disimpan di karyawan dengan mengekstrak pemeriksa dari properti DataKeys tabel (yang dibuat di file ASPX untuk menunjuk ke bidang EmployeeID).
string pribadi GetCheckedEmployeeIDs()
{
Pembatas string = String.Kosong;
ID karyawan StringBuilder = StringBuilder baru();
for(int i = 0; i < DataGrid1.Items.Count; i++)
{
kotak centang kotak centang;
kotak centang = DataGrid1.Items[i].FindControl("EmployeeCheckBox") sebagai Kotak Centang;
if(kotak centang != null && kotak centang.Dicentang == benar)
{
EmployeeIDs.Append(pembatas + DataGrid1.DataKeys[i].ToString());
pembatas = ",";
}
}
mengembalikan ID karyawan.ToString();
}
Metode di atas mengembalikan sebuah string, seperti "10, 7, 20". Pengendali peristiwa klik tombol Pesanan akan melibatkan metode yang meneruskan informasi ke SQL untuk mendapatkan daftar karyawan dan pesanan, dan mengikat hasilnya dalam objek DataGrid kedua.
private void Orders_Click(pengirim objek, System.EventArgs e)
{
string ID Karyawan = GetCheckedEmployeeIDs();
Basis data db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
menggunakan(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, EmployeeIDs);
menggunakan (IDataReader dataReader = db.ExecuteReader(dbCommandWrapper))
{
DataGrid2.DataSource = dataReader;
DataGrid2.DataBind();
}
}
}