Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OleDb将DateTime插入Access时出现问题_C#_Winforms_Ms Access - Fatal编程技术网

C# 使用OleDb将DateTime插入Access时出现问题

C# 使用OleDb将DateTime插入Access时出现问题,c#,winforms,ms-access,C#,Winforms,Ms Access,我在尝试将一行数据插入Access时遇到“条件表达式中的数据类型不匹配”错误。经过一番周折后,我把问题缩小到日期时间 这是我的密码: class ABGDA { private OleDbConnection dbConn; private OleDbCommand dbCmd; private OleDbDataReader dbReader; private string sConnection; private string sql; pri

我在尝试将一行数据插入Access时遇到“条件表达式中的数据类型不匹配”错误。经过一番周折后,我把问题缩小到日期时间

这是我的密码:

class ABGDA
{
    private OleDbConnection dbConn;
    private OleDbCommand dbCmd;
    private OleDbDataReader dbReader;
    private string sConnection;
    private string sql;
    private ABG abg;

    public void insertProgressNotes(ABG ABG)
    {
        abg = ABG;

        sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                      "Data Source=SimEMR.accdb";
        dbConn = new OleDbConnection(sConnection);
        dbConn.Open();

        sql = "INSERT INTO ABG (AccountNo, LabDate, PAO2, PACO2, SAO2, Bicarbonate, BaseExcess, " + 
            "O2Setting, SetRate, SetPEEP, FiO2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";

        dbCmd = new OleDbCommand();
        dbCmd.CommandText = sql;
        dbCmd.Connection = dbConn;

        dbCmd.Parameters.Add("AccountNo", OleDbType.Integer).Value = abg.AccountNo;
        dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = abg.LabDate;
        dbCmd.Parameters.Add("PAO2", OleDbType.Double).Value = abg.PAO2;
        dbCmd.Parameters.Add("PACO2", OleDbType.Double).Value = abg.PACO2;
        dbCmd.Parameters.Add("SAO2", OleDbType.Double).Value = abg.SAO2;
        dbCmd.Parameters.Add("Bicarbonate", OleDbType.Double).Value = abg.Bicarbonate;
        dbCmd.Parameters.Add("BaseExcess", OleDbType.Double).Value = abg.BaseExcess;
        dbCmd.Parameters.Add("O2Setting", OleDbType.Char).Value = abg.O2Setting;
        dbCmd.Parameters.Add("SetRate", OleDbType.Double).Value = abg.SetRate;
        dbCmd.Parameters.Add("SetPEEP", OleDbType.Double).Value = abg.SetPeep;
        dbCmd.Parameters.Add("FiO2", OleDbType.Double).Value = abg.FiO2;

        dbCmd.ExecuteNonQuery();
        dbConn.Close();
    }
}
abg.LabDate是使用DateTime.Now获得的

奇怪的是,我在另一个类中使用DBTimeStamp作为insert语句,而than似乎工作得很好。有人知道我的问题是什么吗

更新:似乎我找到了一个解决方案,但我不知道为什么它会起作用。我将abg.LabDate更改为字符串并保存了当前日期/时间

abg.LabDate = DateTime.Now.ToString();
然后当我将它插入数据库时,我将它解析回一个日期时间,这就起作用了

dbCmd.Parameters.Add("LabDate", OleDbType.DBTimeStamp).Value = DateTime.Parse(abg.LabDate);

我认为该错误是由于
DateTime
中存在毫秒部分,Access不会处理该部分,因此您可以截断毫秒部分并尝试插入,或者在只有
DateTime的情况下尝试插入。现在
然后在Access中使用等效的
Now()
函数

insert into table1 (datecolumn) values (Now()) // Date() if not interested in the time part

我知道这个问题很老了。但我只是在使用Access和MS SQL数据库时提到了这一点。Access中的字段类型为Date/Time,MSSQL中的字段类型为Datetime

我的解决方案是使用OleDbType.Date

    dbCmd.Parameters.Add("LabDate", OleDbType.Date).Value = DateTime.Now;

您可以打印insert语句生成的SQL吗?代码在传递到DB之前生成的SQL?你的约会对象可能只需要被八爪兽(又名磅或数字符号)包围@gangreen我该怎么做?当我将鼠标悬停在dbCmd.CommandText上时,它仍然只显示我设置的初始字符串up@TheColonel您的LabDate将有毫秒,我认为access将无法处理这些毫秒,因此请尝试截断该部分。我希望您不会因此遇到语言环境问题,因为您经常会以不明确的日期结束,哪一条通道将由美国决定。如果LabDate始终为Now(),为什么不将表中的默认值设置为Now(),并将date保留在更新之外?我不知怎的让它神奇地工作了。查看我的原始帖子,了解我做了什么。不知道为什么works@TheColonel我猜结果字符串没有毫秒部分,您是否尝试了
Now()
函数我认为更适合您。Now()函数是否只在sql中工作?稍后,有几个东西将在同一日期连接到此对象。我遇到了相同的问题。我发现,如果DateTime对象的milleseconds组件为0,它就可以工作。如果不是0,则会按照您所述失败。请参阅。Mike Lowery的链接将指向Microsoft的OleDbType枚举与MSAccess数据类型。一个非常有用的资源!
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider = microsoft.ace.oledb.12.0;data source = E:\\Sohkidatabase\\Sohki.accdb";
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"INSERT INTO Challan_No(challan,goods,quantity,nwlm,rate,total,ident,taaff,dateissue,nature,factory,expected,palce,date)VALUES
                (" + labelchallan.Text + ",'" + textGood.Text + "'," + combQuit.Text + "," + combNwlm.Text + "," + textRate.Text + "," + textvalu.Text + ",'" + textIdent.Text + "','" + texttfclass.Text + "','" + dateTimeIssue.Text + "','" + textNatup.Text + "','" + textFact.Text + "','" + textExpDu.Text + "','" + textPlace.Text + "','" + dateTimeDate.Text + "')";
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
System.Windows.Forms.MessageBox.Show("Recrod Succefully Created");
con.Close();