سؤال

نأمل أن يكون هذا أمرًا بسيطًا.عند استخدام منتقي التاريخ والوقت في نموذج Windows، أريد تنفيذ عبارة SQL، كما يلي:

string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";

لسوء الحظ، لا يوفر هذا في الواقع أي نتائج لأنه يتم تخزين حقل JobDate كقيمة DateTime.أود أن أكون قادرًا على البحث عن جميع السجلات الموجودة في هذا التاريخ، بغض النظر عن الوقت المخزن، هل هناك أي مساعدة؟

استعلام جديد:

        SqlDataAdapter da2 = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
        cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
        cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
        cmd.Connection = conn;
        da2.SelectCommand = cmd;
        da2.Fill(dt);
        dgvJobDiary.DataSource = dt;

شكرا جزيلا على كل المساعدة!

هل كانت مفيدة؟

المحلول

إجابة واحدة فقط:يستخدم الاستعلامات ذات المعلمات.

وهذا لأسباب مختلفة:

  • الأمان (لا يوجد خطر حقن SQL
  • لم تعد تلك المشاكل التي كنت فتح الموضوع
  • أداء.

لذلك اكتب بيانك هكذا:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;

إذا كنت تريد تجاهل الوقت، فأعتقد أن أفضل رهان هو إجراء بحث عن النطاق، إذا كان الوقت مخزنًا في قاعدة البيانات.شيء من هذا القبيل (فقط استعلام SQL):

SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate

سيكون StartDate بعد ذلك dtpJobDate.Value.Date, ، وسيكون تاريخ الانتهاء هو dtpJobDate.Value.Date.AddDays(1)

إذا لم يتم تخزين الوقت في قاعدة البيانات، فيمكنك القيام بذلك:

SELECT * FROM Jobs WHERE JobDate = @p_Date

حيث يجب أن تكون وسيطة البحث dtpJobDate.Value.Date

نصائح أخرى

وحاول dtpJobDate.Value.

وبخلاف الاشياء حقن SQL في إجابات أخرى، يمكنك استخدام شيء من هذا القبيل:

dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");

ولكن ربما لن تجد أي شيء مع مباراة زمنية محددة، بحيث يمكنك تغيير الاستعلام الخاص بك لشيء من هذا القبيل

string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";

وقبل كل شيء - كنت قد تركت الباب مفتوحا للحقن SQL في المثال الخاص بك

وبخلاف ذلك - للإجابة على سؤالك، سيكون لديك لإسقاط خارج أوقات العمود JobDate للحصول على المباراة القيام به. حاول شيئا من هذا القبيل (SQL كود حقن اليسار في المثال للمقارنة) ...

string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";

إذا كنت لبالحدود الاستعلام الخاص بك - هل يمكن أن تفعل شيئا من هذا القبيل ...

using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
    cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));

    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // your code here to deal with the records...
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top