我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃

Posted

技术标签:

【中文标题】我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃【英文标题】:I keep crashing with Inserting a record using OleDbConnection and OleDbCommand 【发布时间】:2012-04-26 16:15:26 【问题描述】:
        OleDbConnection conn = new OleDbConnection(connectionString);
        conn.Open();
        cmd = new OleDbCommand(sqlQuery, conn);
        cmd.CommandText = "INSERT INTO tickets (ProblemIncidentDate, ProblemIncidentTime, user, StateTagNumber, ProblemType, ProblemDescription, ProblemStatus) VALUES (@ProblemDate,@ProblemTime,@userIDNumber,@StateTag,@ProblemType,@ProblemDescription,@ProblemStatus)";
        cmd.Parameters.Add("@ProblemDate", OleDbType.Date).Value = labelProblemDate.Text.Trim();
        cmd.Parameters.Add("@ProblemTime", OleDbType.DBTimeStamp).Value = labelProblemTime.Text.Trim();
        cmd.Parameters.Add("@userIDNumber", OleDbType.Integer).Value = Convert.ToInt32(userID.ToString());
        cmd.Parameters.Add("@StateTag", OleDbType.VarChar).Value = textBoxStateTagNumber.Text.Trim();
        cmd.Parameters.Add("@ProblemType", OleDbType.VarChar).Value = comboBoxProblemType.SelectedItem.ToString();
        cmd.Parameters.Add("@ProblemDescription", OleDbType.VarChar).Value = textBoxProblemDescription.Text.Trim();
        cmd.Parameters.Add("@ProblemStatus", OleDbType.VarChar).Value = "Open";            
        cmd.ExecuteNonQuery();          //At this line exception is generating 
        conn.Close(); 

我的数据库是 Microsoft Access 2007

这里是字段类型

ID                  AutoNumber
ProblemIncidentDate Date/Time
ProblemIncidentTime Date/Time
user                Number
StateTagNumber      Text
ProblemType         Text
ProblemDescription  Memo
ProblemResolution   Memo
ProblemStatus       Text

我不知道为什么会崩溃

控制台消息显示

System.Data.dll 中发生了“System.Data.OleDb.OleDbException”类型的第一次机会异常

【问题讨论】:

你得到什么错误? 发布错误时会有所帮助。通常错误消息包含有关问题所在的提示。 尝试在[user] 周围加上括号,它可能是关键字。此外,您正在将字符串传递到 Integer 和 DateTime 字段中。 拉尔斯 - 你是对的。将 [] 放在用户周围解决了它 【参考方案1】:

尝试使用正确的数据类型,例如

cmd.Parameters.Add("@ProblemDate", OleDbType.Date).Value = DateTime.Parse(labelProblemDate.Text.Trim());

cmd.Parameters.Add("@userIDNumber", OleDbType.Integer).Value = Convert.Int32(userID.ToString());

【讨论】:

必须是时间跨度。查看msdn.microsoft.com/en-us/library/yy6y35y8.aspx上的列表 即使修复了数据类型,我仍然崩溃。【参考方案2】:

转换自我的评论:

尝试在 [user] 周围加上括号,它可能是关键字。此外,您正在将字符串传递到 Integer 和 DateTime 字段中。

【讨论】:

【参考方案3】:

我曾与不同的 OleDb 提供者合作,发现有些不喜欢命名参数,而是只使用“?”作为参数的占位符。请注意,参数需要以与插入相同的顺序添加(就像您一样),所以尝试更改为..

insert into YourTable( fld1, fld2, fld3 ) values ( ?, ?, ? )

【讨论】:

以上是关于我一直在使用 OleDbConnection 和 OleDbCommand 插入记录而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

JSON.net 直接从 oledbconnection 序列化

如何使用 C# 和 OleDbConnection 读取 .xlsx 和 .xls 文件?

使用 OLEDBConnection 将新记录插入到带有 Visual Basic 的表中

将 OleDbConnection 刷新到 Access DB - 最佳实践

OleDbConnection 处理很慢(2s)

OLEDBConnection 到 Excel 不喜欢网络共享路径