2013-02-02 4 views
1

Как читать данные из базы данных с использованием значения datetimepicker. У меня есть datetimepicker и datagridview в моей форме. Я хочу получить данные из таблицы Sql databse с выбранным значением datetimepicker. Я стараюсь с этим кодомЧтение данных из базы данных sql с использованием сборщика datetime

Private Sub BTNFIND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNFIND.Click 
    getConnect() 
    Dim editdate As String 
    DTPEDITAT.Value= Format(DTPEDITAT.Value, "dd/MM/yyyy") 
    editdate = DTPEDITAT.Value 
    MessageBox.Show(editdate) 
    Try 
     Conn.Open() 
     Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & editdate & "' ORDER BY EMP_NAME ASC" 
     Dim da As SqlDataAdapter = New SqlDataAdapter(strSQL, Conn) 
     Dim ds As DataSet = New DataSet 
     da.Fill(ds, "ATTENDANCE") 
     Dim dt As DataTable = ds.Tables("ATTENDANCE") 
     Dim row As DataRow 
     Dim atstat As String 
     For Each row In dt.Rows 
      If row("AT_STATUS") = 1 Then 
       atstat = "Present" 
      ElseIf row("AT_STATUS") = 0 Then 
       atstat = "Absent" 
      ElseIf row("AT_STATUS") = 0.5 Then 
       atstat = "Halfday" 
      Else 
       atstat = "Error" 
      End If 
      For x As Integer = 0 To ATCEDITGRID.Rows.Count - 1 
       ATCEDITGRID.Rows(x).Cells(2).Value = row("EMP_ID") 
       ATCEDITGRID.Rows(x).Cells(3).Value = row("EMP_NAME") 
       ATCEDITGRID.Rows(x).Cells(0).Value = atstat 
       ATCEDITGRID.Rows(x).Cells(1).Value = row("AT_REMARK") 
      Next x 
     Next row 
    Catch ex As SqlException 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "SQL Error") 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error") 
    End Try 
End Sub 

DataGridView не отображать ничего и нет никакой ошибки ...

ответ

0

я изменить свой код, как это

Private Sub BTNFIND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNFIND.Click 
    ATCEDITGRID.Rows.Clear() 
    getConnect() 
    Dim editdate As String 
    DTPEDITAT.Value = Format(DTPEDITAT.Value, "dd/MM/yyyy") 
    editdate = DTPEDITAT.Value 
    Try 
     Conn.Open() 
     Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & editdate & "' ORDER BY EMP_NAME ASC" 
     Dim da As SqlDataAdapter = New SqlDataAdapter(strSQL, Conn) 
     Dim ds As DataSet = New DataSet 
     da.Fill(ds, "ATTENDANCE") 
     Dim dt As DataTable = ds.Tables("ATTENDANCE") 
     Dim row As DataRow 
     Dim atstat As String 
     For Each row In dt.Rows 
      If row("AT_STATUS") = 1 Then 
       atstat = "Present" 
      ElseIf row("AT_STATUS") = 0 Then 
       atstat = "Absent" 
      ElseIf row("AT_STATUS") = 0.5 Then 
       atstat = "Halfday" 
      Else 
       atstat = "Error" 
      End If 
      Me.ATCEDITGRID.Rows.Add(row("EMP_ID"), row("EMP_NAME"), atstat, row("AT_REMARK")) 
     Next row 
     ATCEDITGRID.TopLeftHeaderCell.Value = "Sr.No." 
     Me.ATCEDITGRID.RowHeadersDefaultCellStyle.Padding = New Padding(3) 
     ATCEDITGRID.AllowUserToAddRows = False 
     AddRowHeadersEdit() 
     Conn.Close() 
    Catch ex As SqlException 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "SQL Error") 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error") 
    End Try 
End Sub 

Itz работает Хорошо ....

+0

Thnks все мои друзья, чтобы воспроизвести мой вопрос ... – Thanzeem

0

Попытка переместить одно пространство рядом с вашим "%) и я исправил запрос. Попытайтесь выяснить.

Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS, " + _ 
    "AT_REMARK FROM ATTENDANCE " + _ 
    "WHERE Convert(Varchar(10), AT_DATE, 23) = " + _ 
    "('" & editdate.ToString("yyyy-MM-dd") & "') ORDER BY EMP_NAME ASC" 
+0

Спасибо другу. Спасибо за ваш быстрый повтор. Но еще одна ошибка 'Convertion failed при преобразовании datetime из символьной строки' – Thanzeem

+0

i изменен мой ответ .. просто проверьте правильный формат даты – spajce

+0

k друг .. я буду ждать вашего повтора ... – Thanzeem

1

Мои НЕ РЕКОМЕНДУЕТСЯ решения:

Снимите скобку и % символ. Поместите пробел непосредственно перед ORDER (хотя это не является причиной вашей синтаксической ошибки).

Закрепить выбрать таким образом:

"SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & _ 
editDate.ToString("yyyy-MM-dd hh:mm:ss") & _ 
"' ORDER BY EMP_NAME ASC" 

Что я recommmend вас научиться использования SQL параметров.

запрос должен выглядит то, как это (обратите внимание на параметр @editDate местоблюститель внутри):

"SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = @editDate ORDER BY EMP_NAME ASC".

Тогда вам нужно просто добавить параметры к SqlCommand. Самый простой способ - это использовать SqlParameterCollection.AddWithValue.

yourSqlCommand.Parameters.AddWithValue("@editDate", editDate)

Полный пример:

Dim editDate As Date = DTPEDITAT.Value 

    Using conn As New SqlConnection(YOUR_CONNECTION_STRING_HERE) 
     Using cmd As SqlCommand = conn.CreateCommand() 
      cmd.CommandText = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = @editDate ORDER BY EMP_NAME ASC" 
      cmd.Parameters.AddWithValue("@editDate", editDate) 

      adapter.SelectCommand = cmd 
      adapter.Fill(ds) 

      For Each row As DataRow In ds.Tables(0).Rows 
       [do whatever with the result] 
      Next 

     End Using 
     conn.Close() 
    End Using 

С MSDN о Sql Параметры

Командные объекты используют параметры для передачи значений операторов SQL или хранимых процедур, обеспечивающих проверку типов и Проверка. В отличие от текста команды , ввод параметра рассматривается как буквальное значение, а не как исполняемый код. Это помогает предотвратить атаки «SQL injection», в , который атакующий вставляет команду в инструкцию SQL, которая компрометирует безопасность на сервере. В дополнение к преимуществам безопасности , параметризованные команды предоставляют удобный метод для организации значений, передаваемых источнику данных.

+0

'Dim editdate As Date editdate = DTPEDITAT.Value' aditdate не из базы данных. Только только DateTimePicker. – Thanzeem

+0

Если вы используете это поле [DateTimePicker.Value] (http://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.value (v = vs.80) .aspx) Свойство, его значение уже является «DateTime», а ваш столбец базы данных набирается «DateTime», а затем забывает о преобразованиях даты в строку и такие вещи, просто используйте параметры sql и добавляйте значение datetime непосредственно к параметру. –

+1

+1, на самом деле этот ответ имеет смысл .. ': D', я просто ищу прямой ответ – spajce

1

Мы каждый день рассматриваем эти вопросы. Они связаны с одной и той же проблемой.

НИКОГДА НЕ ИСПОЛЬЗУЙТЕ КОНТРАЛЬНУЮ СТРУННУЮ КОНЦЕНТРАЦИЮ ДЛЯ СТРОГОЙ SQL QUERIES.

Это большая проблема. Конечно, вы уже встретили первый эффект. Как преобразовать строки приемлемым способом в эффективный тип данных?Вам необходимо решить проблемы синтаксического анализа со встроенными кавычками, правильное представление дат и десятичных чисел для базовой системы баз данных. Но второй и более тонкий побочный эффект конкатенации строк - это SQL Injection (Это просто поучительная ссылка, потому что SQL Injection - очень большая тема)

Для решения таких проблем единственным приемлемым способом является использование ПАРАМЕТРОВ.
Это означает, что это механизм базы данных, который эффективно решает вопрос, вам нужна строка с записями параметров (@something) и набор параметров с точным типом данных для значения параметра.

Так что ваш код должен измениться таким образом

Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK " + 
         "FROM ATTENDANCE WHERE AT_DATE = @editdate " + 
         "ORDER BY EMP_NAME ASC" 
Using con = new SqlConnection("constring_here") 
    con.Open() 
    Using cmd = new SqlCommand(strSQL, con) 
     cmd.Parameters.AddWithValue("@editdate", DTPEDITAT.Value) 
     ' do whatever you want with the command ' 
     ' like ExecuteReader or use a DataAdapter to fill datasets' 
    End Using 
End Using 
+0

+1 но проблема OP кажется, что ему нужен простой код .. ': D' – spajce

+1

@spajce Я так не думаю. Простое это всегда предпочтительнее, но ошибка должна быть обязательной. И это действительно плохая привычка делать так. Когда ошибка ударит, вы не хотите, чтобы найти себя с брюки вниз. И поверьте мне, ошибка ударяется всегда, когда вы демонтируете свое приложение перед потенциальными клиентами. – Steve

+0

вы правы сэр. 100% correct ':)' – spajce

0

это мой код его работы

oldbc.CommandText = "select * from recette where" & ComboBox1.Text"между #" & DateTimePicker1.Text & "# и #" & DateTimePicker2.Text & "#"

Смежные вопросы