OLEDB 参数插入的奇怪异常

Posted

技术标签:

【中文标题】OLEDB 参数插入的奇怪异常【英文标题】:Weird exception with OLEDB Parameter Insert 【发布时间】:2012-07-01 23:51:07 【问题描述】:

尝试使用参数将数据插入 Access 数据库时出现奇怪的错误。我遇到问题的地方是:-

                thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, Date_End, Time_Start, Time_End, Name, Description, Event_Type, Buy_Tickets_URL) VALUES (@VenID, @DStart, @DEnd, @evTime, @evTime, @Name, @Des, @EvType, @SysUrl);";

                //Other Parameters already inserted here
                string desc = GetDesc(rec.EvName);
                thisCommand.Parameters.AddWithValue("@Des", desc);
                thisCommand.ExecuteNonQuery();

其他参数都不会导致问题,但是当尝试将数据插入描述字段时,我收到一个数据库异常,指出该字段太小而无法接受数据量。问题是我的程序在抛出错误时只尝试插入 3 个字符,并且描述字段是一个备忘录,因此应该能够容纳 65000 多个字符。在 CommandText 中手动插入值时,一切正常,因此它必须与参数属性有关。

【问题讨论】:

插入三个字符是没有问题的,但是参数必须按正确的顺序列出。您在示例中只显示了一个参数,其他参数是否按照您的命令文本中出现的顺序排列? 名称被很好地插入到数据库中,只有尝试插入到描述字段中才会出现异常 我运行了我在下面发布的示例代码,它对我有用。我不明白为什么你不能插入到描述中,除非其中一个参数有问题。 刚看到订单有点不对劲,没想到要按订单设置参数 谢谢! 参数名称无关紧要,在您拥有的场景中不与 MS Access 一起使用,您可以轻松使用 ?作为@VenID。重要的是顺序。 【参考方案1】:

参数名称只是给你一个指导,例如,这个运行,注意所有参数都具有相同的名称!另请注意,保留字 Name 由方括号转义。

    thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, " +
    "Date_End, [Name], Description, Event_Type, Buy_Tickets_URL) " +
    "VALUES (@VenID, @DStart, @DEnd, @Name, @Des, @EvType, @SysUrl);";


    thisCommand.Parameters.AddWithValue("@Des", 1);
    thisCommand.Parameters.AddWithValue("@Des", DateTime.Now.Date);
    thisCommand.Parameters.AddWithValue("@Des", DateTime.Now.Date);
    thisCommand.Parameters.AddWithValue("@Des", "abc");
    thisCommand.Parameters.AddWithValue("@Des", "abc");
    thisCommand.Parameters.AddWithValue("@Des", 1);
    thisCommand.Parameters.AddWithValue("@Des", "abc");

保留字

Jet ACE

【讨论】:

Name 是保留字没有问题(Names 是保留字),但指出必须按顺序添加参数(在我原来的问题上的 cmets 中)所以最好的答案。【参考方案2】:

也许您需要在描述中添加大括号。 [Description]

并更改您的参数,例如:

 thisCommand.CommandText = "INSERT INTO Events (Venue_ID, Date_Start, Date_End, Time_Start, Time_End, Name, [Description], Event_Type, Buy_Tickets_URL) VALUES (@VenID, @DStart, @DEnd, @evTime, @evTime, @Name, @Des, @EvType, @SysUrl);

            //Other Parameters already inserted here
            string desc = GetDesc(rec.EvName);
           // thisCommand.Parameters.AddWithValue("@Des", desc);
            thisCommand.Parameters.Add("@Des", OleDbType.VarChar, 6000).Value = desc;
            thisCommand.ExecuteNonQuery();

问候

【讨论】:

描述不是Jet 或ACE 中的保留字,但名称是。我认为您应该修改该答案。

以上是关于OLEDB 参数插入的奇怪异常的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 3.5 C# 网站中的 Oledb 溢出错误

MS Access 2013 从 VBA 调用插入查询并出现奇怪的错误

PDOStatement :: execute():SQLSTATE [HY093],批量插入时的奇怪行为

使用线性内核调整 SVM 时,R 插入符号异常缓慢

C# OleDb 插入带参数的整数

OLEDB 连接抛出异常“参数太少”