Tôi thường phải tải nhiều mục vào một bản ghi cụ thể trong cơ sở dữ liệu. Ví dụ: một trang web hiển thị các mục để bao gồm cho một báo cáo, tất cả đều là các bản ghi trong cơ sở dữ liệu (Báo cáo là một bản ghi trong bảng Báo cáo, Các mục là các bản ghi trong bảng Mục). Người dùng đang chọn các mục để bao gồm trong một báo cáo qua ứng dụng web và giả sử họ chọn 3 mục và gửi. Quá trình sẽ thêm 3 mục này vào báo cáo này bằng cách thêm các bản ghi vào một bảng gọi là ReportItems (ReportId, ItemId).Danh sách truyền <> đến thủ tục lưu sẵn SQL
Hiện nay, tôi sẽ làm một cái gì đó như thế này trong trong các mã:
public void AddItemsToReport(string connStr, int Id, List<int> itemList)
{
Database db = DatabaseFactory.CreateDatabase(connStr);
string sqlCommand = "AddItemsToReport"
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
string items = "";
foreach (int i in itemList)
items += string.Format("{0}~", i);
if (items.Length > 0)
items = items.Substring(0, items.Length - 1);
// Add parameters
db.AddInParameter(dbCommand, "ReportId", DbType.Int32, Id);
db.AddInParameter(dbCommand, "Items", DbType.String, perms);
db.ExecuteNonQuery(dbCommand);
}
và điều này trong thủ tục lưu trữ:
INSERT INTO ReportItem (ReportId,ItemId)
SELECT @ReportId,
Id
FROM fn_GetIntTableFromList(@Items,'~')
đâu hàm trả về một bảng một cột các số nguyên.
Câu hỏi của tôi là: có cách nào tốt hơn để xử lý một cái gì đó như thế này? Lưu ý, tôi không hỏi về việc chuẩn hóa cơ sở dữ liệu hay bất cứ thứ gì như thế, câu hỏi của tôi liên quan cụ thể đến mã.
Đó là thực sự sẽ giúp bạn tiết kiệm từ nối? Bạn có biết liệu phương pháp này có được triển khai bằng StringBuilder không? –
Có, nó sẽ giúp bạn tiết kiệm từ nối. String.Join sử dụng UnsafeCharBuffer để làm concat (xem nó trong Reflector). Theo như LINQ đi, đó chỉ là liệt kê trên danh sách gọi ToString(), đó là không thể tránh khỏi, và tạo ra một mảng. Việc tạo mảng có thể tốn kém. –
Tôi không biết rằng bạn có thể làm điều đó như vậy, cảm ơn cho tip! –