大家遇到过没有 :在插入数据时,当需要插入的值的长度超过字段宽度时,就要出错。

时间:2021-03-16 21:23:05
我在vb.net中用连接的是access数据库,在插入数据时,有个奇怪的现象,就是,当需要插入的值的长度超过字段宽度时,就要出错。不知道大家遇到过没有?
  比如表 k_bhzbm 的字段 HZ 的字段大小是 1 。在access中直接执行插入命令:INSERT INTO k_bhzbm (HZ) VALUES ( "三个字") ,能够通过,只是字段HZ中只保存“三”字。
  但是,如果执行以下代码,则在BqPCommand.ExecuteNonQuery()方法中出错。当然如果把插入命令中的“三个字”改为“三”,就不会出错了。
  为什么会这样呢?

   Dim m As Boolean = False   '
   Dim sCmdtxt As String 
   Dim tran As Data.OleDb.OleDbTransaction
   Dim BqPCommand As New System.Data.OleDb.OleDbCommand

   tran = q_Conn.BeginTransaction(IsolationLevel.ReadCommitted)
   BqPCommand.Connection = q_Conn
   BqPCommand.Transaction = tran
   sCmdtxt="INSERT INTO k_bhzbm (HZ) VALUES ( "三个字  ") "
   Try
     BqPCommand.CommandText = sCmdtxt
     m = BqPCommand.ExecuteNonQuery()    '执行此处时出错。
     tran.Commit()  
   Catch e As Exception
     m = False
     Try
       tran.Rollback()
     Catch ex As Exception
     End Try
   End Try

附:我在vb.net中用下面的方式连接的access数据库,
Public q_Conn As New System.Data.OleDb.OleDbConnection
Dim l_conn As String 
l_conn=" Provider=Microsoft.Jet.OLEDB.4.0 ;  Data Source= e:\school\bqssxsgl.db ;Persist Security Info=False;Jet OLEDB:Database Password=12345678 "
q_Conn.ConnectionString = l_conn
q_Conn.Open()

25 个解决方案

#1


这是肯定的,在SQL中错误描述为什么未能将二进制截断之类的

#2


如何解决这个问题??

#3


在插入之前把字符串截断,使其长度不超过字段长度

#4


那这个工作量有些大哟,作为前端开发工具而言,要根据每个字段的大小来计算,有些不太现实哟.

#5


把数据库字段加长!

#6


没办法的事!用输入控件的MaxLength 属性来限制输入的字符数!

#7


1.加长数据库字段
2.页面输入时做判断,超过限制字段就不让输入,自动截断,或提示用户输入过长.

#8


如果你想让他随便输  但是加的时候就一个 那么 直接用left(xxx,1) 就可以了
不然就想后晌的说得 maxlength设置成1

#9


1、每次接受用户输入的时候都要做检查的,比如数据类型、长度、有无特殊字符等等。这是必须的

2、做一个函数,传入字段的长度和文本,然后返回合适的文本部分,这样工作量也不是很大

3、把textbox的最大长度设一下,但是1还是少不了要检查类型和字符的

#10


没有必要在输入了以后再做检查,除非这种输入是需要转换的。比如:1000-1010要转换为1000,1001,1002...1010。
对于一般的情况,限制用户输入的字符的长度是最好的办法,他输入了很长,却给人家截取了,那么他会知道截取了什么吗?这种结果是他想要的吗?所以,友好的设计程序要体现在很细微的地方!

#11


个人认为比较赞同  hamadou(闵峰) 的方法。
再一个问题请大家帮忙看一下这个问题。
http://community.csdn.net/Expert/topic/4051/4051894.xml?temp=.8955652

#12


赞同  hamadou(闵峰) 的方法

#13


最简单的方法就是在数据库中将此字段的长度加大

#14


设置输入框的长度吧,加宽数据库字段,再长也会有可能超过的

#15


用输入控件的MaxLength 属性来限制输入的字符数!

#16


在数据库中把字段长度加长,然后定义空间的MAXLENGTH属性

#17


你可以根据数据字段的长度再输入时候给于判断,免得出现类似情况,要不就把字段长度设的足够!

#18






这是前期调研有问题!!

#19


捕捉错误!!!

#20


现在,我的想法是:编写一个继承于文本框的类mytxt,在这个类中,当用DataBindings.Add方法绑定数据时,想办法找出绑定字段的宽度,再设置mytxt的MaxLength 属性

#21


怪了,用下面方法得到的字段宽度始终是-1.
i = tb.Columns(zd).MaxLength()

其中 tb 是 DataTable ,表示表
     zd 是 String  ,表示字段名称

#22


用户输入完成后,提交时判断每个参数的长度,超长的要给用户提示,比方说该值不要超过8位等等。如果用户一定要超过8位,那么就是你的数据库设计失败。
数据库设计是在用户需求分析一结束就要完成的东西,千万不能一边写代码一边更改数据库结构。

#23


to :  njqibin(杉树林)、liuqm(blue)  你的理解有一定的偏差。
  我的意思是说,在数据库设计阶段,已经明确了每个字段的宽度,比如某个表的mc字段是8位,
但在窗口设计中,由于没有设置文本框的MaxLength属性,用户在其中输入内容时,很有可能超过8位,从而造成在更新数据库时出错。而这并非如你们所说的“如果用户一定要超过8位,那么就是你的数据库设计失败。”这层意思。

#24


经过版主的帮助,以上的问题已经解决了.

  编写一个继承于文本框的类BqUTxt,在这个类中,当用DataBindings.Add方法绑定数据时,找出绑定字段的宽度,再设置BqUTxt的MaxLength 属性.
  代码大致如下:
一、将 DataTable 添加到 DataSet 中,并配置架构以匹配数据源中的架构。
   ...
  lAdapter.FillSchema(lPDataset,SchemaType.Mapped, "表名") '得到框架结构
  lAdapter.Fill(lDataset,"表名")
二、编写继承文本框的类BqUTxt,代码如下
Public Class BqUTxt
    Inherits System.Windows.Forms.TextBox
   '编写自己的数据绑定方法,参数分别表示:表名、字段名
    Public Sub Bq_Bind(ByVal tb As DataTable, ByVal zd As String) 
        Dim i As Integer
        Dim m As Boolean
        Dim s As String
        Try
            m = Me.Visible
            If m = False Then
                Me.Visible = True
            End If
            s = tb.Columns.Item(zd).DataType.ToString
            i = tb.Columns.Item(zd).MaxLength
            If s = "System.String" Then '字符型数据才设置文本框的最多允许的字符数
                Me.MaxLength = i
            End If
            Me.DataBindings.Clear()
            Me.DataBindings.Add("Text", tb, zd)
            Me.Visible = m
        Catch ex As Exception
        End Try
    End Sub
    Private Sub BqUTxt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
        '按回车键,就相当于执行一个Tab,到下一个控件
        If e.KeyChar = Chr(13) Then
            e.Handled = True
            System.Windows.Forms.SendKeys.Send("{TAB}")
        End If
    End Sub
    Private Sub BqUTxt_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
        '得到焦点时,就全部选中文本
        sender.SelectAll()
    End Sub
End Class







#25


请版主推荐这个贴子,最好加入到FAQ或者精华贴

#1


这是肯定的,在SQL中错误描述为什么未能将二进制截断之类的

#2


如何解决这个问题??

#3


在插入之前把字符串截断,使其长度不超过字段长度

#4


那这个工作量有些大哟,作为前端开发工具而言,要根据每个字段的大小来计算,有些不太现实哟.

#5


把数据库字段加长!

#6


没办法的事!用输入控件的MaxLength 属性来限制输入的字符数!

#7


1.加长数据库字段
2.页面输入时做判断,超过限制字段就不让输入,自动截断,或提示用户输入过长.

#8


如果你想让他随便输  但是加的时候就一个 那么 直接用left(xxx,1) 就可以了
不然就想后晌的说得 maxlength设置成1

#9


1、每次接受用户输入的时候都要做检查的,比如数据类型、长度、有无特殊字符等等。这是必须的

2、做一个函数,传入字段的长度和文本,然后返回合适的文本部分,这样工作量也不是很大

3、把textbox的最大长度设一下,但是1还是少不了要检查类型和字符的

#10


没有必要在输入了以后再做检查,除非这种输入是需要转换的。比如:1000-1010要转换为1000,1001,1002...1010。
对于一般的情况,限制用户输入的字符的长度是最好的办法,他输入了很长,却给人家截取了,那么他会知道截取了什么吗?这种结果是他想要的吗?所以,友好的设计程序要体现在很细微的地方!

#11


个人认为比较赞同  hamadou(闵峰) 的方法。
再一个问题请大家帮忙看一下这个问题。
http://community.csdn.net/Expert/topic/4051/4051894.xml?temp=.8955652

#12


赞同  hamadou(闵峰) 的方法

#13


最简单的方法就是在数据库中将此字段的长度加大

#14


设置输入框的长度吧,加宽数据库字段,再长也会有可能超过的

#15


用输入控件的MaxLength 属性来限制输入的字符数!

#16


在数据库中把字段长度加长,然后定义空间的MAXLENGTH属性

#17


你可以根据数据字段的长度再输入时候给于判断,免得出现类似情况,要不就把字段长度设的足够!

#18






这是前期调研有问题!!

#19


捕捉错误!!!

#20


现在,我的想法是:编写一个继承于文本框的类mytxt,在这个类中,当用DataBindings.Add方法绑定数据时,想办法找出绑定字段的宽度,再设置mytxt的MaxLength 属性

#21


怪了,用下面方法得到的字段宽度始终是-1.
i = tb.Columns(zd).MaxLength()

其中 tb 是 DataTable ,表示表
     zd 是 String  ,表示字段名称

#22


用户输入完成后,提交时判断每个参数的长度,超长的要给用户提示,比方说该值不要超过8位等等。如果用户一定要超过8位,那么就是你的数据库设计失败。
数据库设计是在用户需求分析一结束就要完成的东西,千万不能一边写代码一边更改数据库结构。

#23


to :  njqibin(杉树林)、liuqm(blue)  你的理解有一定的偏差。
  我的意思是说,在数据库设计阶段,已经明确了每个字段的宽度,比如某个表的mc字段是8位,
但在窗口设计中,由于没有设置文本框的MaxLength属性,用户在其中输入内容时,很有可能超过8位,从而造成在更新数据库时出错。而这并非如你们所说的“如果用户一定要超过8位,那么就是你的数据库设计失败。”这层意思。

#24


经过版主的帮助,以上的问题已经解决了.

  编写一个继承于文本框的类BqUTxt,在这个类中,当用DataBindings.Add方法绑定数据时,找出绑定字段的宽度,再设置BqUTxt的MaxLength 属性.
  代码大致如下:
一、将 DataTable 添加到 DataSet 中,并配置架构以匹配数据源中的架构。
   ...
  lAdapter.FillSchema(lPDataset,SchemaType.Mapped, "表名") '得到框架结构
  lAdapter.Fill(lDataset,"表名")
二、编写继承文本框的类BqUTxt,代码如下
Public Class BqUTxt
    Inherits System.Windows.Forms.TextBox
   '编写自己的数据绑定方法,参数分别表示:表名、字段名
    Public Sub Bq_Bind(ByVal tb As DataTable, ByVal zd As String) 
        Dim i As Integer
        Dim m As Boolean
        Dim s As String
        Try
            m = Me.Visible
            If m = False Then
                Me.Visible = True
            End If
            s = tb.Columns.Item(zd).DataType.ToString
            i = tb.Columns.Item(zd).MaxLength
            If s = "System.String" Then '字符型数据才设置文本框的最多允许的字符数
                Me.MaxLength = i
            End If
            Me.DataBindings.Clear()
            Me.DataBindings.Add("Text", tb, zd)
            Me.Visible = m
        Catch ex As Exception
        End Try
    End Sub
    Private Sub BqUTxt_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
        '按回车键,就相当于执行一个Tab,到下一个控件
        If e.KeyChar = Chr(13) Then
            e.Handled = True
            System.Windows.Forms.SendKeys.Send("{TAB}")
        End If
    End Sub
    Private Sub BqUTxt_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
        '得到焦点时,就全部选中文本
        sender.SelectAll()
    End Sub
End Class







#25


请版主推荐这个贴子,最好加入到FAQ或者精华贴