首页 > 解决方案 > 使用 OleDB 在 DBase III DBF 文件中插入日期

问题描述

我正在尝试在 DBase III DBF 文件中插入行,并且在 Date 列上不断出现类型不匹配错误。列是日期(8,0)

我在用

OleDbConnection con2 = new OleDbConnection(@"Provider=VFPOLEDB.1;

.....
receipt.date = rdr.GetDateTime(1); - creating a list of receipts from a SQLite DB
.....
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "INSERT INTO decont (cod, data)" + " VALUES (?, ?)";
cmd2.Parameters.AddWithValue("@cod", Convert.ToInt32(receipts[j].c_id));
cmd2.Parameters.AddWithValue("@data", receipts[j].date); // tried converting parsing
cmd2.ExecuteNonQuery();

我尝试了 n 种格式和解析,甚至尝试使用 {date} {^date} 手动插入,但没有任何效果。

任何帮助,将不胜感激。

标签: c#oledbdbfdbase

解决方案


您可以摆脱参数名称“@”,只保留作为参数名称。您的 AddWithValue() 调用似乎是目标。它可能只是在您认为要转换以应用于您的命令的数据类型上失败。您可能想在发布之前将其分解。此外,为了防止表选择/插入/更新中的参数与列名混淆,我尝试在它们前面加上“p”以区分并帮助避免列与参数的混淆。

正确使用“?” 参数传递的占位符,并以正确的顺序将参数添加为“?” 在命令中表示。

cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "INSERT INTO decont (cod, data) VALUES (?, ?)";

var myInt = Convert.ToInt32(receipts[j].c_id);
var myDate = receipts[j].date;

cmd2.Parameters.AddWithValue("@cod", myInt );
cmd2.Parameters.AddWithValue("@data", myDate ); 
cmd2.ExecuteNonQuery();

现在,我还没有明确地测试有效的数据转换,但是如果你没有分别为 myInt 和 myDate 获得 int 和 date,那么 SQL Insert 显然会失败。

对于微笑和测试,只是为了确保您的查询有效,请尝试使用已知的合法值,例如:

var myInt = 3;
var myDate = DateTime.Now;

cmd2.Parameters.AddWithValue("@cod", myInt );
cmd2.Parameters.AddWithValue("@data", myDate ); 

然后你知道你有正确的数据类型并且可以确认插入函数是否有效。如果数据库文件是 DATE vs DATETIME,您可能需要将其下拉到

// to strip off any time component portion and have it fail.
var myDate = DateTime.Now.Date;  

此外,如果您的表有其他列并且它们不允许 null 并且必须提供,那也会导致插入失败。


推荐阅读