C# critera表达式中的数据类型不匹配

C# critera表达式中的数据类型不匹配,c#,winforms,oledb,C#,Winforms,Oledb,我非常需要这方面的帮助: " 说明:以一个按钮(到达、离开)的形式实现功能。仅使用一个按钮实现案例,并自动确定到达或离开(根据数据库中的记录) 我的目标 -第一次点击按钮设置到达时间,第二次点击按钮设置出发时间,并将其保存到数据库表-工作日。。。 我得到的错误 -到达时间被记录下来,但当我第二次点击按钮时,我得到了“条件表达式中的数据类型不匹配”的错误 这是我的密码 int counter = 0; List<DateTime> dateList = new List<Date

我非常需要这方面的帮助:

" 说明:以一个按钮(到达、离开)的形式实现功能。仅使用一个按钮实现案例,并自动确定到达或离开(根据数据库中的记录)

我的目标 -第一次点击按钮设置到达时间,第二次点击按钮设置出发时间,并将其保存到数据库表-工作日。。。 我得到的错误 -到达时间被记录下来,但当我第二次点击按钮时,我得到了“条件表达式中的数据类型不匹配”的错误

这是我的密码

int counter = 0;
List<DateTime> dateList = new List<DateTime>();
public void button1_Click(object sender, EventArgs e)
{
    counter++;            
    DateTime arrivalTime = DateTime.Now;
    dateList.Add(arrivalTime);
    if (counter == 1)
    {
        string write = "Insert into Weekdays (Arrival) values('" + dateList[0].ToString() + "');";
        OleDbCommand read = new OleDbCommand(write, sc);
        OleDbDataReader reading;
        try
        {
            sc.Open();
            reading = read.ExecuteReader();
            MessageBox.Show("Arrival time saved!.");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        sc.Close();
    }
    if(counter == 2)
    {
        string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" +"';";
        OleDbCommand read1 = new OleDbCommand(update, sc);
        OleDbDataReader reading1;
        try
        {
            sc.Open();
            reading1 = read1.ExecuteReader();
            MessageBox.Show("Departure time saved!.");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        sc.Close();
    }
}
int计数器=0;
列表日期列表=新列表();
公共无效按钮1\u单击(对象发送者,事件参数e)
{
计数器++;
DateTime-arrivalTime=DateTime.Now;
日期列表。添加(到达时间);
如果(计数器==1)
{
string write=“插入到工作日(到达)值('“+dateList[0].ToString()+”);”;
OleDbCommand read=新的OleDbCommand(write,sc);
OLEDB数据读取器读取;
尝试
{
sc.Open();
reading=read.ExecuteReader();
MessageBox.Show(“节省的到达时间!”);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
sc.Close();
}
如果(计数器==2)
{
string update=“update Weekdays SET deposition=”+DateTime.Now+“'WHERE Arrival=”“+”;”;
OleDbCommand read1=新的OleDbCommand(更新,sc);
OLEDB数据读取器读取1;
尝试
{
sc.Open();
reading1=read1.ExecuteReader();
MessageBox.Show(“节省出发时间!”);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
sc.Close();
}
}
谢谢大家!

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" +"';";
这不应该吗

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" + dateList[0] "';";
提示:我在条件中添加了
dateList[0]

这不应该吗

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" + dateList[0] "';";
提示:我在条件中添加了
dateList[0]

这不应该吗

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" + dateList[0] "';";
提示:我在条件中添加了
dateList[0]

这不应该吗

string update = "UPDATE Weekdays SET Departure = '" + DateTime.Now + "' WHERE Arrival ='" + dateList[0] "';";
提示:我在条件中添加了
日期列表[0]

IChram很可能会解决您的问题,但是您在这里遇到了一些其他问题,这些问题可能不是导致错误消息的原因,但是不好的做法

首先,参数化您的查询,使您不易受到漏洞的影响(我承认在您的特定示例中,这似乎不是真正的风险,但最好始终以正确的方式进行操作):

考虑到您的详细信息,您可能不需要担心时区,但我仍然建议使用
DateTime.UtcNow
而不是
DateTime.Now
,因为,同样,最好只将日期/时间值存储在UTC中,这样您就不必担心计算出存储值的时区

我假设在您的示例代码中,
sc
是一个
OleDbConnection
对象,因此如果这不是真的,您可以忽略我在这里对它的引用
OleDbCommand
OleDbConnection
实现接口。这意味着,如果您在块中实例化这些类,这些类将被设置为在自身之后进行清理,因此我建议您像这样重新编写代码:

try
{
    using (var sc = new OleDbConnection("[YOUR_CONNECTION_STRING]"))
    {
        using (var read = new OleDbCommand())
        {
            read.Connection = sc;
            if (counter == 1)
            {
                //set up insert command
                //parameterize it
            }
            if (counter == 2)
            {
                //set up update command
                //see my suggestion above on how this should be parameterized
            }

            sc.Open();

            //your command doesn't return any results, so why use read.ExecuteReader()?
            //read.ExecuteNonQuery() will work fine for your purposes and doesn't instantiate
            //another object
            var rowsAffected = read.ExecuteNonQuery();
        }
        //at this point, regardless of whether you encounter an error, your command object is cleaned up
    }
    //now your connection is automatically closed/disposed of properly, again regardless of whether
    //you encounter an error
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}
请注意,我已将您的
read.ExecuteReader()
更改为
read.ExecuteNonQuery()
:您不需要使用
ExecuteReader()
,因为您的命令不返回结果集,所以这样可以避免实例化
OleDbDataReader

同样,伊克拉姆的回答应该让你摆脱眼前的问题,但我会认真考虑我在这里提出的变化。 ichramm很可能会解决您的问题,但您还有一些其他问题,这些问题可能不会导致错误消息,但都是不好的做法

首先,参数化您的查询,使您不易受到漏洞的影响(我承认在您的特定示例中,这似乎不是真正的风险,但最好始终以正确的方式进行操作):

考虑到您的详细信息,您可能不需要担心时区,但我仍然建议使用
DateTime.UtcNow
而不是
DateTime.Now
,因为,同样,最好只将日期/时间值存储在UTC中,这样您就不必担心计算出存储值的时区

我假设在您的示例代码中,
sc
是一个
OleDbConnection
对象,因此如果这不是真的,您可以忽略我在这里对它的引用
OleDbCommand
OleDbConnection
实现接口。这意味着,如果您在块中实例化这些类,这些类将被设置为在自身之后进行清理,因此我建议您像这样重新编写代码:

try
{
    using (var sc = new OleDbConnection("[YOUR_CONNECTION_STRING]"))
    {
        using (var read = new OleDbCommand())
        {
            read.Connection = sc;
            if (counter == 1)
            {
                //set up insert command
                //parameterize it
            }
            if (counter == 2)
            {
                //set up update command
                //see my suggestion above on how this should be parameterized
            }

            sc.Open();

            //your command doesn't return any results, so why use read.ExecuteReader()?
            //read.ExecuteNonQuery() will work fine for your purposes and doesn't instantiate
            //another object
            var rowsAffected = read.ExecuteNonQuery();
        }
        //at this point, regardless of whether you encounter an error, your command object is cleaned up
    }
    //now your connection is automatically closed/disposed of properly, again regardless of whether
    //you encounter an error
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}
请注意,我已将您的
read.ExecuteReader()
更改为
read.ExecuteNonQuery()
:您不需要使用
ExecuteReader()
,因为您的命令不返回结果集,所以这样可以避免实例化
OleDbDataReader

同样,伊克拉姆的回答应该让你摆脱眼前的问题,但我会认真考虑我在这里提出的变化。 ichramm很可能会解决您的问题,但您还有一些其他问题,这些问题可能不会导致错误消息,但都是不好的做法

首先,参数化您的查询,使您不易受到漏洞的影响(我承认在您的特定示例中,这似乎不是真正的风险,但最好始终以正确的方式进行操作):

考虑到您的详细信息,您可能不需要担心时区,但我仍然建议使用
DateTime.UtcNow
而不是
DateTime.Now
,因为,同样,最好只在UTC中存储日期/时间值,这样您就不必工作了