Я пытаюсь преобразовать свое приложение vb.net в C#, но когда я преобразовал код, чтобы проверить, находится ли ячейка даты между двумя изменениями даты devexpress, он запустит следующий код, но, к сожалению, я получил сообщение об ошибке, в котором говорилось:
Operator '<=' cannot be applied to operands of type 'object' and 'object'
Я искал в Интернете, но не могу найти решение своей проблемы
Вот мой код на C#:
foreach (DataRowView dr in Logs_Grid.Items)
{
SqlCommand cmd2 = new SqlCommand();
SqlDataReader rd2;
DataSet ds2 = new DataSet();
// Dim CustomerIDfromtheTbl
ds2.Clear();
cmd2.Connection = conn;
// SELECT TOP 1 WITH TIES * FROM International ORDER BY News_ID DESC
cmd2.CommandText = "SELECT * FROM att_download where Machine_IP = '" + IP_txt.Text + "' and User_ID = '" + dr[0] + "' and Verify_Date = '" + Format(Convert.ToDateTime(dr[1]), ("yyyy-MM-dd")) + "' and Verify_Time = '" + Format(Convert.ToDateTime(dr[2]), "HH:mm:ss") + "' ";
rd2 = cmd2.ExecuteReader();
// SELECT ID FROM INVOICE_HEAD ORDER BY ID DESC LIMIT 1
if (rd2.HasRows)
{
rd2.Read();
// MessageBox.Show("موجود مسبقا" + " " + rd2.Item("User_ID").ToString)
rd2.Close();
}
else if (dr[1] >= From_Date.EditValue && dr[1] <= To_Date.EditValue)
{
SqlCommand cmd4 = new SqlCommand();
SqlDataReader rd4;
DataSet ds4 = new DataSet();
// Dim CustomerIDfromtheTbl
ds4.Clear();
cmd4.Connection = conn;
// SELECT TOP 1 WITH TIES * FROM International ORDER BY News_ID DESC
cmd4.CommandText = "select * from Att_Users where user_code ='" + dr[0] + "' and machine_ip ='" + IP_txt.Text + "'";
rd4 = cmd4.ExecuteReader();
// SELECT ID FROM INVOICE_HEAD ORDER BY ID DESC LIMIT 1
if (rd4.HasRows)
{
rd4.Read();
string sqlString = "insert into att_download (User_ID,Verify_Date,Verify_Time,Verify_Type,Verify_State,WorkCode,CREATE_USER,CREATE_DATE,CREATE_TIME,User_Name,Emp_Code,Machine_IP) "
+ "values (@User_ID,@Verify_Date,@Verify_Time,@Verify_Type,@Verify_State,@WorkCode,@CREATE_USER,@CREATE_DATE,@CREATE_TIME,@User_Name,@Emp_Code,@Machine_IP)";
using (SqlCommand cmd = new SqlCommand(sqlString, conn))
{
DateTime now = DateTime.Now;
cmd.Parameters.Add(new SqlParameter("@User_ID", dr[0]));
cmd.Parameters.Add(new SqlParameter("@Verify_Date", dr[1]));
cmd.Parameters.Add(new SqlParameter("@Verify_Time", dr[2]));
cmd.Parameters.Add(new SqlParameter("@Verify_Type", dr[3]));
cmd.Parameters.Add(new SqlParameter("@Verify_State", dr[4]));
cmd.Parameters.Add(new SqlParameter("@WorkCode", dr[5]));
cmd.Parameters.Add(new SqlParameter("@CREATE_USER", Main_UserName));
cmd.Parameters.Add(new SqlParameter("@CREATE_DATE", DateTime.Today.ToString("yyyy-MM-dd")));
cmd.Parameters.Add(new SqlParameter("@CREATE_TIME", now.ToString("HH:mm:ss")));
cmd.Parameters.Add(new SqlParameter("@User_Name", rd4["user_name"]));
cmd.Parameters.Add(new SqlParameter("@Emp_Code", rd4["Emp_Code"]));
cmd.Parameters.Add(new SqlParameter("@Machine_IP", IP_txt.Text));
cmd.ExecuteNonQuery();
}
rd4.Close();
}
}
а вот код vb.net:
For Each dr As DataRowView In Logs_Grid.Items
Dim cmd2 As New SqlCommand
Dim rd2 As SqlDataReader
Dim ds2 As New DataSet
'Dim CustomerIDfromtheTbl
ds2.Clear()
cmd2.Connection = conn
'SELECT TOP 1 WITH TIES * FROM International ORDER BY News_ID DESC
cmd2.CommandText = "SELECT * FROM att_download where Machine_IP = '" & IP_txt.Text & "' and User_ID = '" & dr(0) & "' and Verify_Date = '" & Format(Convert.ToDateTime(dr(1)), ("yyyy-MM-dd")) & "' and Verify_Time = '" & Format(Convert.ToDateTime(dr(2)), "HH:mm:ss") & "' "
rd2 = cmd2.ExecuteReader
'SELECT ID FROM INVOICE_HEAD ORDER BY ID DESC LIMIT 1
If rd2.HasRows Then
rd2.Read()
'MessageBox.Show("موجود مسبقا" + " " + rd2.Item("User_ID").ToString)
rd2.Close()
Else
If dr(1) >= From_Date.EditValue And dr(1) <= To_Date.EditValue Then
Dim cmd4 As New SqlCommand
Dim rd4 As SqlDataReader
Dim ds4 As New DataSet
'Dim CustomerIDfromtheTbl
ds4.Clear()
cmd4.Connection = conn
'SELECT TOP 1 WITH TIES * FROM International ORDER BY News_ID DESC
cmd4.CommandText = "select * from Att_Users where user_code ='" & dr(0) & "' and machine_ip ='" & IP_txt.Text & "'"
rd4 = cmd4.ExecuteReader
'SELECT ID FROM INVOICE_HEAD ORDER BY ID DESC LIMIT 1
If rd4.HasRows Then
rd4.Read()
Dim sqlString As String = "insert into att_download (User_ID,Verify_Date,Verify_Time,Verify_Type,Verify_State,WorkCode,CREATE_USER,CREATE_DATE,CREATE_TIME,User_Name,Emp_Code,Machine_IP) " _
& "values (@User_ID,@Verify_Date,@Verify_Time,@Verify_Type,@Verify_State,@WorkCode,@CREATE_USER,@CREATE_DATE,@CREATE_TIME,@User_Name,@Emp_Code,@Machine_IP)"
Using cmd As SqlCommand = New SqlCommand(sqlString, conn)
cmd.Parameters.Add(New SqlParameter("@User_ID", dr(0)))
cmd.Parameters.Add(New SqlParameter("@Verify_Date", dr(1)))
cmd.Parameters.Add(New SqlParameter("@Verify_Time", dr(2)))
cmd.Parameters.Add(New SqlParameter("@Verify_Type", dr(3)))
cmd.Parameters.Add(New SqlParameter("@Verify_State", dr(4)))
cmd.Parameters.Add(New SqlParameter("@WorkCode", dr(5)))
cmd.Parameters.Add(New SqlParameter("@CREATE_USER", Main_UserName))
cmd.Parameters.Add(New SqlParameter("@CREATE_DATE", Format(Date.Today, ("yyyy-MM-dd"))))
cmd.Parameters.Add(New SqlParameter("@CREATE_TIME", Format(TimeOfDay, "hh:mm:ss")))
cmd.Parameters.Add(New SqlParameter("@User_Name", rd4.Item("user_name").ToString))
cmd.Parameters.Add(New SqlParameter("@Emp_Code", rd4.Item("Emp_Code").ToString))
cmd.Parameters.Add(New SqlParameter("@Machine_IP", IP_txt.Text))
cmd.ExecuteNonQuery()
End Using
rd4.Close()
End If
End If
End If
Next
ошибка генерируется из этой строки:
else if (dr[1] >= From_Date.EditValue && dr[1] <= To_Date.EditValue)
код XAML:
<DataGrid x:Name = "Logs_Grid" IsReadOnly = "True" SelectionUnit = "FullRow" AutoGenerateColumns = "False" CanUserAddRows = "True" Margin = "138,179,10,10">
<DataGrid.Resources>
<Style BasedOn = "{StaticResource {x:Type DataGridColumnHeader}}" TargetType = "{x:Type DataGridColumnHeader}">
<Setter Property = "Background" Value = "#F78A09" />
<Setter Property = "Foreground" Value = "#F0F0F0" />
</Style>
<Style TargetType = "ScrollBar" >
<Setter Property = "Background" Value = "#FAFAFA" />
</Style>
<Style TargetType = "DataGridCell">
<Style.Triggers>
<Trigger Property = "IsSelected" Value = "True">
<Setter Property = "Background" Value = "#360E05"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header = "كوده بالجهاز" x:Name = "UserID" IsReadOnly = "True" Binding = "{Binding Path=UserID}" Foreground = "#F0F0F0"/>
<DataGridTextColumn Header = "تاريخ البصمة" x:Name = "VerifyDate" IsReadOnly = "True" Binding = "{Binding Path=VerifyDate}" Foreground = "#F0F0F0" />
<DataGridTextColumn Header = "توقيت البصمة" x:Name = "VerifyTime" IsReadOnly = "True" Binding = "{Binding Path=VerifyTime}" Foreground = "#F0F0F0"/>
<DataGridTextColumn Header = "نوع البصمة" x:Name = "VerifyType" IsReadOnly = "True" Binding = "{Binding Path=VerifyType}" Foreground = "#F0F0F0"/>
<DataGridTextColumn Header = "حالة البصمة" x:Name = "VerifyState" IsReadOnly = "True" Binding = "{Binding Path=VerifyState}" Foreground = "#F0F0F0"/>
<DataGridTextColumn Header = "كود العمل" x:Name = "WorkCode" IsReadOnly = "True" Binding = "{Binding Path=WorkCode}" Foreground = "#F0F0F0"/>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType = "DataGridRow" >
<Setter Property = "Background" Value = "#8CB3EF"></Setter>
</Style>
</DataGrid.RowStyle>
</DataGrid>
<dxe:DateEdit x:Name = "From_Date" HorizontalAlignment = "Left" Margin = "10,251,0,0" VerticalAlignment = "Top" Width = "120"/>
<dxe:DateEdit x:Name = "To_Date" HorizontalAlignment = "Left" Margin = "10,314,0,0" VerticalAlignment = "Top" Width = "120"/>
Если вы включите Option Strict в VB, вы получите ту же ошибку. Когда Option Strict выключено, VB пытается преобразовать переменную за вас, C# этого не делает. Вам нужно будет привести вашу переменную к правильному типу данных. Что-то типа:
else if ((DateTime)dr[1] >= From_Date.EditValue && (DateTime)dr[1] <= To_Date.EditValue)
Или используйте метод, чтобы получить правильную переменную
else if (dr.GetDateTime(1) >= From_Date.EditValue && dr.GetDateTime(1) <= To_Date.EditValue)
@MohamadSalama ошибка вроде сказать это. EditValue имеет тип Object, но его необходимо преобразовать в DataTime. Некоторым нравится: (DateTime) From_Date.EditValue
Я попробовал и получил ту же ошибку: оператор '<=' не может применяться к операндам типа DateTime и object