0

私が取り組んでいるプロジェクトがありますが、それは私が作成したものではありません。私はまだ 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);
        }
4

2 に答える 2

2

I don't know what the rest of your code looks like but here's a possible example of using parameters.

using (SqlConnection connection = new SqlConnection("<connection string>"))
{
    var cmd = connection.CreateCommand();
    cmd.CommandText = @"SELECT * FROM [database] WHERE [submitDate] >= @myDate";
    DateTime myDate = DateTime.Parse("<date string>");
    cmd.Parameters.AddWithValue("@myDate", myDate);
    var reader = cmd.ExecuteReader();
    /* etc. */
}
于 2013-08-28T17:23:25.400 に答える
1

その文字列を生成するコードを変更するだけです。何かのようなもの;

   String.Format(@"SELECT * FROM [database] WHERE [submitDate] >= Convert(datetime,'{0}0301')", DateTime.Now.Year.ToString());

文字列に常に現在の年が含まれるようにします。

ドキュメントはString.Formatここにありますhttp://msdn.microsoft.com/en-us/library/system.string.format.aspx

基本的にはこのように動作します。String.Format最初の引数を文字列にして呼び出します。その文字列内に、フォーマット指定子を入れます (これ{0}はフォーマット指定子です)。の各インスタンスは{x}、対応する引数に置き換えられます。したがって、次のようなことができます。

   string replacingThreeValues = String.Format("Replacing {0}, {1}, {2}", "one", "two", "three");

そして、それは になりreplaceingThreeValues == "Replacing one, two, three"ます。したがって、2番目の例ではvar sql = ...、いくつかのフォーマット指定子を入れましたが、Formatを呼び出していません。また、それらの値を置き換える引数を渡していません。代わりに、リテラル {0} と {1} を含む文字列を取得するだけです。適切な引数を呼び出しString.Formatて渡す場合にのみ、それらの値は渡した引数に置き換えられます。

于 2013-08-28T17:08:16.507 に答える