使用的数据库是 Microsoft Access
Dim cmd As New Odbc.OdbcCommand
cmd.CommandText = "Alter Table HTML Add Field1 Meno Null" ' Meno 为备注型
cmd.ExecuteNonQuery()
添加一个新的列之后,再使用下面的语句插入新的记录
cmd.CommandText = "Insert Into HTML (Path,Field1) Values (?,?)"
cmd.Parameters.Add("@Path", "")
cmd.Parameters.Add("@Field1", "")
就出现了一个很奇怪的现象
1. 当 cmd.Parameters.Item(1).Value 的值的长度小于255字节时,能成功添加记录
2. 当长度在 256字节---1千多字节之间,就出现下面的错误
ERROR [HY104] [Microsoft][ODBC Microsoft Access Driver]Invalid precision value
3. 当长度大于 2000多字节,甚至7000多字节的时候,却又能成功添加
请问问题出在那?
谢谢
---------------------------------------------------------------
胡国宏的看法:
请尝试按下面的代码写:
cmd.CommandText = "Insert Into HTML (Path,Field1) Values (?,?)"
cmd.Parameters.Add("@Path", OdbcType.VarChar)
cmd.Parameters.Add("@Field1",OdbcType.VarChar )
cmd.Parameters.Item(0).Value =""
cmd.Parameters.Item(1).Value =""
因为Parameters.Add方法是个重载函数,如下:
1、 Overloads Public Function Add(String, Object) As OdbcParameter
2、 Overloads Public Function Add(String, OdbcType) As OdbcParameter
你使用的是重载方式 1
但方式1是个危险的函数,如下面的代码:
cmd.Parameters.Add("@Field1",0)
你的本意可能是给参数赋值0,但编译器却将0解释成 int类型,最后自然调用的是重载函数 2
所以我建议不要使用重载方式 1
至于 chenc82 () 提到当长度在 256字节---1千多字节之间,就出现下面的错误
ERROR [HY104] [Microsoft][ODBC Microsoft Access Driver]Invalid precision value
我认为与使用重载函数Add(String, Object)有关,因为没有指定参数类型,
所以Parameters类的内部可能会根据Object的值选择合适的参数类型。
而选择的类型可能与你定义的字段类型不兼容,所以出错。