Tôi đang cố gắng tìm cách tối ưu (nhanh nhất so với dễ nhất) để truy cập mã SQL Server thông qua mã trong C#.Aproach tốt nhất để lấy dữ liệu sql từ C#
Khi tôi đang học từ sách, tôi đã gặp nhiều đề xuất thường yêu cầu tôi thực hiện việc này bằng cách kéo và thả. Tuy nhiên kể từ khi tôi muốn làm điều đó trong mã aproach đầu tiên là để có được dữ liệu theo số cột, nhưng bất kỳ sắp xếp lại trong truy vấn SQL (như thêm/loại bỏ cột) là đau đớn cho tôi để sửa chữa.
Ví dụ (đừng cười, một số mã cũng giống như 2 tuổi), tôi thậm chí mã hóa chức năng đặc biệt để vượt qua sqlQueryResult và kiểm tra xem nó là null hoặc không):
public static void exampleByColumnNumber(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = Locale.checkForNullReturnString(sqlQueryResult, 0);
string var2 = Locale.checkForNullReturnString(sqlQueryResult, 1);
}
sqlQueryResult.Close();
}
}
Sau đó tôi phát hiện ra nó có thể qua tên cột (mà có vẻ dễ dàng hơn để đọc với nhiều cột và rất nhiều thay đổi trật tự vv):
public static void exampleByColumnNames(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = (string) sqlQueryResult["SomeColumn"];
string var2 = (string) sqlQueryResult["SomeColumn2"];
}
sqlQueryResult.Close();
}
}
và thứ 3 ví dụ là bằng cách làm nó bằng tên cột nhưng sử dụng ToString() để chắc chắn rằng nó không giá trị null, hoặc bằng cách thực hiện If/else trên kiểm tra null.
public static void exampleByColumnNamesAgain(string varValue) {
string preparedCommand = @"SELECT TOP 1 [SomeColumn],[SomeColumn2], [SomeColumn3]
FROM [Database].[dbo].[Table]
WHERE [SomeOtherColumn] = @varValue";
SqlCommand sqlQuery = new SqlCommand(preparedCommand, Locale.sqlDataConnection);
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varValue) ", varValue);
SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader();
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
string var1 = (string) sqlQueryResult["SomeColumn"].ToString();
DateTime var2;
DateTime.TryParse(sqlQueryResult["SomeColumn2"].ToString());
int varInt = ((int) sqlQueryResult["SomeColumn3"] == null ? 0 : (int) sqlQueryResult["SomeColumn3"];
}
sqlQueryResult.Close();
}
}
Xin lưu ý rằng tôi vừa mới tạo ví dụ này và có thể có lỗi chính tả hoặc lỗi cú pháp nhẹ, nhưng câu hỏi chính là cách tiếp cận tốt nhất, điều tồi tệ nhất (tôi biết cái đầu tiên là cái tôi không thích nhất). Tôi sẽ sớm phải bắt đầu/viết lại một số phần của ứng dụng dòng nhỏ 90k của tôi có ít nhất 3 ví dụ được sử dụng rộng rãi, vì vậy tôi muốn có được phương pháp tốt nhất cho tốc độ và tốt nhất là duy trì (hy vọng nó sẽ là cùng aproach).
Có thể có một số tùy chọn tốt hơn ở đó vì vậy hãy chia sẻ?
Cậu nói 'optimization' sớm? – mjv
Ý bạn là gì khi tối ưu hóa sớm? – MadBoy
Nói chung nó có nghĩa là "đừng lo lắng về hiệu suất cho đến khi bạn hoàn thành". Bạn chưa biết liệu truy cập cơ sở dữ liệu có phải là nút cổ chai của bạn hay không, vì vậy đừng lo lắng về hiệu suất ngay bây giờ. Nếu bạn viết mã dễ đọc, dễ hiểu, dễ bảo trì, bạn sẽ hoàn thành nhanh hơn và ít lỗi hơn. Bạn luôn có thể quay lại và tối ưu hóa để có hiệu suất sau này. –