OledbException - 字段太小而无法接受数据量

Posted

技术标签:

【中文标题】OledbException - 字段太小而无法接受数据量【英文标题】:OledbException - Field too small to accept amount of data 【发布时间】:2016-12-01 22:48:45 【问题描述】:

我正在尝试使用 OleDb 将新记录插入 Access 数据库,使用 SQL 命令将新记录插入名为“tblThread”的实体中(如果您想知道,则包含讨论帖子);这是通过一个按钮完成的,该按钮将从两个控件(都是文本框)中获取值。

如果您想查看以下布局:https://gyazo.com/c43abf4ce055ff997b908badb57f549a 但是,单击“提交讨论”按钮后,插入新记录的控件出现错误显示:

https://gyazo.com/1dbdb33290649af04f092533560b1d8c

下面是这个按钮的 Click 事件的代码:

请注意:

absDefault._memberType = 'Teacher'(在这种情况下)

    private void btnCreate_Click(object sender, EventArgs e)

    OleDbConnection objConnection = new OleDbConnection(absDefault.conString);
    OleDbCommand objCommand = new OleDbCommand();
    objCommand.Connection = objConnection;

    if (MessageBox.Show("[Piltover]: Are you sure you would like to create this thread", "", MessageBoxButtons.YesNo) == DialogResult.No)
    
        return; // Does not execute remaining code
    
    else if (txtTitle.TextLength == 0)
    
        MessageBox.Show("[Piltover]: You have not created a title");
    
    else if (mtxtDescription.TextLength == 0)
    
        MessageBox.Show("[Piltover]: You have not added description to your thread");
    
    else
    
        // DBConnection class is only used within this else block and is not needed anywhere else in this form
        DataSet ds; DataRow dRow;
        DatabaseConnection objConnect = new DatabaseConnection(); // Instantiating an object from DBConnectionClass and checking if an identical title exist is much faster than the OLEDB process (shown within try block below)
        objConnect.Connection_String = absDefault.conString;
        objConnect.SQL = "SELECT * FROM tblThread"; ds = objConnect.GetConnection;
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        
            dRow = ds.Tables[0].Rows[i];
            if (txtTitle.Text.ToUpper() == dRow.ItemArray.GetValue(1).ToString())
            
                MessageBox.Show("[Piltover]: Thread already exist with the title name given");
                return; 
            
        
    
    // FIX - test to see if it works

    try
    
        objConnection.Open();

        // Insert new thread record; avoids SQL injection
        objCommand.CommandText = String.Format("INSERT INTO tblThread ([Title], [Description], [ID], [Username], [TeacherBool]) VALUES (@title, @desc, @id, @username, @teacherbool)");//, absDefault.newThreadMemberType);
        objCommand.Parameters.AddWithValue("@title", txtTitle.Text);
        objCommand.Parameters.AddWithValue("@desc", mtxtDescription.Text);
        objCommand.Parameters.AddWithValue("id", absDefault._idNumber);

        if (absDefault._memberType == "Teacher")
        
            currentTeacher = new csTeacher(absDefault._idNumber, "Teacher");
            objCommand.Parameters.AddWithValue("@teacherbool", "True");
            objCommand.Parameters.AddWithValue("@username", currentTeacher.Username);
        
        else // else 'Student'
        
            currentStudent = new csStudent(absDefault._idNumber, "Student");
            objCommand.Parameters.AddWithValue("@teacherbool", "False");
            objCommand.Parameters.AddWithValue("@username", currentStudent.Username);
        

        objCommand.ExecuteNonQuery();
        MessageBox.Show("[Piltover]: Thread created");

        objConnection.Close();
    
    catch (Exception Ex)
    

        MessageBox.Show(Ex.ToString());
    

我猜问题出在属性 [Description] 上,不过,我已将数据类型设置为长文本: https://gyazo.com/2d99c945a0a0b98a1e48e8abaf043c2f

如果您想知道我的 DatabaseConnection 类中包含什么: http://pastebin.com/RQs6qPEz

我感到困惑的是,我的输入在边界内(如果这是问题所在,则少于 255 个字符): 例如,https://gyazo.com/c43abf4ce055ff997b908badb57f549a 如您所见,标签“描述”之外的“屏蔽文本框”包含的值少于 255 个字符。

尝试调试以尝试找到解决方案/答案。

【问题讨论】:

您是否在数据库中保存 True/False 字符串 @LarsTech 仅用于属性 [TeacherBool]。验证规则设置为:'True' or 'False' 是的,但是“True”是一个字符串。只需使用 True。 【参考方案1】:

System.Data.OleDb 允许我们将@names 用于参数(及其占位符),但它忽略名称并将参数视为严格的位置。因此,参数的声明顺序必须与它们在命令文本中出现的顺序相同。

在您指定的命令文本中

... VALUES (@title, @desc, @id, @username, @teacherbool)

但是当您通过AddWithValue 创建参数时,您按以下顺序执行...

@title
@desc
id
@teacherbool
@username

...这不一样。

您需要交换在if 块中声明@teacherbool 和@username 参数的顺序。

【讨论】:

有趣。我可能会迟到,但我仍然会感谢你。

以上是关于OledbException - 字段太小而无法接受数据量的主要内容,如果未能解决你的问题,请参考以下文章

插入Access数据库时发生错误,请联系开发人员.字段太小而不能接受所要添加的数据

无法打开更多表 - 未处理 OleDbException

Spark在StandAlone模式下提交任务,spark.rpc.message.maxSize太小而出错

相机 API - 图像太小

System.Data.OleDb.OleDbException:定义的字段太多

Qt - 即使 QMainWindow 太小也允许停靠