C#INSERT到Access DB备注类型字段在使用OLEDB 12.0时被截断

时间:2012-05-31 17:44:07

标签: c# ms-access

这令我感到沮丧,我还没有找到合适的答案或解决方案。有很多帖子和回复,但实际上没有一个解释工作解决方案。

Access漏洞配置表包括:

Field Name        Data Type
cveid             Test
logicaltest       Memo

使用完全唯一的数据填充完全空的漏洞配置表的相关代码位:

mycon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + accessDb + ";Persist Security Info=False");
mycon.Open();

...

insertCommand = new OleDbCommand("INSERT INTO vulnerableconfiguration (cveid, logicaltest) VALUES (@cveid, @logicaltest);", mycon);
insertCommand.Parameters.Add("@cveid", OleDbType.Char).Value = cve_id);
insertCommand.Parameters.Add("@logicaltest", OleDbType.LongWChar).Value = vulnerable_configuration);
insertCommand.ExecuteNonQuery();

逻辑测试字段值被截断,我不知道为什么。即使第一条记录也从780个字符截断到370个!所有备忘录字段都应符合备忘录大小限制。没有错误。我已经调试了它,并且insertCommand Parameters中设置的值具有完整值,但是当执行该命令时,Access DB具有截断值。

如果有人有任何想法,对于遇到这个问题的每个人来说都会很棒。

请不要将我推荐给http://allenbrowne.com/ser-63.html,这些案例都不涉及这个直接的Access插入案例。此外,Access 2007/2010没有Memo数据类型的最大长度设置,它应该会增长。

为什么我使用Access?这是用于Access DB的导入工具,用于查找目的。其他人可以编写一些简单的查询和报告来获取他们想要的信息。不被用作后端,而MSSQL对于此目的来说太重了。

谢谢!

更新

为memo字段参数切换到OleDbType.LongWChar但是一旦填充了Access记录,我仍然会得到相同的截断。

4 个答案:

答案 0 :(得分:1)

您每http://support.microsoft.com/kb/320435

使用错误的OleDbType
  

insertCommand.Parameters.Add(“@ logicaltest”,OleDbType.Char).Value = vulnerability_configuration);

应该是

  

insertCommand.Parameters.Add(“@ logicaltest”,OleDbType.LongVarWChar).Value = vulnerability_configuration);

答案 1 :(得分:1)

您正在为Memo字段声明OleDbType.Char,它看起来不正确..您需要一个更大的字段来保存备注数据,请尝试OleDbType.LongVarWChar

查看此链接也会非常有帮助 OleDbType DataTypes

答案 2 :(得分:0)

由于您正在使用Memo字段的OleDbType.Char数据类型,因此截断值是正常的。对于“备注”字段,请使用OleDbType.LongVarWChar作为数据类型。如果您对其他数据类型有更多麻烦,请查看this page,它具有Acces to OleDb等效性的所有良好列表

答案 3 :(得分:0)

看看这个链接: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4ee6d674-5942-494e-8d7b-9c6f377d0ab6/

我已经通过将字段的文本格式更改为“Rich Text”来解决问题。