C# OLEDBEException-字段太小,无法接受数据量

C# OLEDBEException-字段太小,无法接受数据量,c#,ms-access,oledb,C#,Ms Access,Oledb,我试图使用OleDb将一条新记录插入Access数据库,使用SQL命令将其插入名为“tblThread”的实体(如果您想知道,其中包含讨论帖子);这是通过一个按钮完成的,该按钮将从两个控件(都是文本框)获取值 以下是布局,如果您想查看: 但是,单击“提交讨论”按钮后,插入新记录的控件将显示错误: 下面是此按钮单击事件的代码: 请注意: absDefault.\u memberType='Teacher'(在本场景中) private void btn创建\u单击(对象发送方,事件参数e) {

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

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

下面是此按钮单击事件的代码:

请注意:

  • absDefault.\u memberType='Teacher'(在本场景中)

    private void btn创建\u单击(对象发送方,事件参数e)
    {
    OleDbConnection objConnection=新的OleDbConnection(absDefault.conString);
    OleDbCommand objCommand=新的OleDbCommand();
    objCommand.Connection=objConnection;
    如果(MessageBox.Show(“[Piltover]:是否确实要创建此线程“,”,MessageBoxButtons.YesNo)=DialogResult.No)
    {
    return;//不执行剩余的代码
    }
    else if(txtTitle.TextLength==0)
    {
    Show(“[Piltover]:您还没有创建标题”);
    }
    else if(mtxtDescription.TextLength==0)
    {
    Show(“[Piltover]:您尚未向线程添加描述”);
    }
    其他的
    {
    //DBConnection类仅在此else块中使用,在此表单中的其他任何位置都不需要
    数据集ds;数据行dRow;
    DatabaseConnection objConnect=new DatabaseConnection();//从DBConnectionClass实例化对象并检查是否存在相同的标题比OLEDB进程快得多(如下面的try块所示)
    objConnect.Connection_String=absDefault.conString;
    objConnect.SQL=“SELECT*FROM tblThread”ds=objConnect.GetConnection;
    对于(int i=0;i
我猜问题在于属性[Description],尽管我已经将数据类型设置为长文本:

如果您想知道我的DatabaseConnection类中包含哪些内容:

我感到困惑的是,我的输入在边界内(如果有问题,输入少于255个字符): 例如 如您所见,标签“Description”之外的“masked textbox”包含的值少于255个字符


我已尝试调试,试图找到解决方案/答案。

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

在命令文本中指定

。。。值(@title、@desc、@id、@username、@teacherbool)
但是,当您通过
AddWithValue
创建参数时,您将按照以下顺序进行操作

@title
@描述
身份证件
@教师布尔
@用户名
。。。这是不一样的


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

是否在数据库中保存真/假字符串?@LarsTech仅用于属性[teacherbool]。验证规则设置为:“True”或“False”是的,但“True”是一个字符串。用真的,有趣的。我可能会迟到,但我还是会感谢你的。
    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());
    }
}