私が取り組んでいるプロジェクトがありますが、それは私が作成したものではありません。私はまだ C# と ASP.NET 全体に比較的慣れていません。私はこのSQLクエリに直面しています:
var sql = @"SELECT * FROM [database] WHERE [submitDate] >= Convert(datetime,'20130301')";
var sql = @"SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY id)AS rowNum, * FROM [webDBs].[dbo].[employeeRecognition] WHERE [submitDate] >= Convert(datetime,'20130301')
) AS E
WHERE rowNum >= {0}
AND rowNum < {1}";
もちろん、これらは期待どおりに動作します。Convert(datetime,'20130301')
ただし、このクエリを毎年更新する必要がないように、ビットの 2013 年の部分を実際には現在と等しくする必要があります。
私の限られた経験に基づいて、C# 変数で連結を試みることから始めましたが、それが機能しなかっただけでなく、いくつかの調査の結果、メソッドが潜在的な SQL インジェクションの入り口になる可能性があることがわかりました。
SQL クエリのパラメーター化について少し読んだことがありますが、それを見て、そもそもデータベースからこのデータを取得する方法を書き直したり、考え直さなければならないと思いました。
私の目標を達成する方法についてアドバイスはありますか?
これが私が取り組んでいるものです:
protected string RecordCount()
{
EmployeeRecognitionDataContext db = new EmployeeRecognitionDataContext();
var sql = @"SELECT * FROM [database] WHERE [submitDate] >= Convert(datetime,'20130301')";
var query = db.ExecuteQuery<employeeRecognition>(sql);
//return "[{\"count\":\"" + query.Count() + "\"}]";
return query.Count().ToString();
}
2 番目の関数var
が使用されている:
protected string SelectRecords(int startIndex, int pageSize) {
int rowNum = startIndex + pageSize;
EmployeeRecognitionDataContext db = new EmployeeRecognitionDataContext();
var sql = @"SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY id)AS rowNum, * FROM [database] WHERE [submitDate] >= Convert(datetime,'20130301')
) AS E
WHERE rowNum >= {0}
AND rowNum < {1}";
var query = db.ExecuteQuery<employeeRecognition>(sql, startIndex, rowNum);
List<Employee> eList = new List<Employee>();
foreach (var employee in query)
{
eList.Add(new Employee {
value = employee.id.ToString(),
firstName = employee.firstName,
lastName = employee.lastName,
department = employee.department,
drop = employee.shortAchievement,
recognition = employee.longAchievement,
submitDate = employee.submitDate.ToString()
});
}
JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Serialize(eList);
}