使用ADODB.Command带参数插入SQL Server时遇非空列报错
解决ADODB.Command插入SQL Server时非空列NULL错误的方案
确认参数与SQL语句的绑定逻辑
- 先检查INSERT语句的占位符与参数的对应关系:如果你的SQL语句是
INSERT INTO dbo.TESTE(Column1, Column2) VALUES (@P01, @P02),需保证参数添加的顺序和VALUES里的占位符顺序完全一致;若要按参数名绑定,必须显式设置oCM.NamedParameters = True,否则SQL Server会忽略参数名,仅按参数添加顺序匹配占位符,顺序错误会导致目标列未被赋值。 - 示例开启命名参数的代码:
oCM.NamedParameters = True oCM.CommandText = "INSERT INTO dbo.TESTE(Column1) VALUES (@P01)" oCM.Parameters.Append oCM.CreateParameter("@P01", adVarChar, adParamInput, 50, "非空测试值")
- 先检查INSERT语句的占位符与参数的对应关系:如果你的SQL语句是
验证参数数据类型与长度匹配
- 确保参数的ADO数据类型、长度与SQL Server表中Column1的类型完全匹配:比如Column1是
VARCHAR(50),参数需定义为adVarChar且长度设为50;若类型不匹配(如用adInteger对应字符串列),可能导致参数值无法正确传递,被SQL识别为NULL。 - 避免省略参数长度:部分ADO驱动会将长度为0的字符串参数视为NULL,务必指定与列匹配的长度。
- 确保参数的ADO数据类型、长度与SQL Server表中Column1的类型完全匹配:比如Column1是
排查CommandText与SQL执行逻辑
- 把CommandText中的SQL语句替换为实际参数值,直接在SQL Server Management Studio中执行(比如
INSERT INTO dbo.TESTE(Column1) VALUES ('你的参数值')),确认语句本身能正常插入,排除表结构(如Column1是否真的允许非空)、权限等底层问题。 - 确保INSERT语句中明确指定了Column1的值,不要依赖未设置的默认值。
- 把CommandText中的SQL语句替换为实际参数值,直接在SQL Server Management Studio中执行(比如
检查Execute方法调用
- 若不需要返回记录集,直接使用
oCM.Execute即可,无需赋值给Recordset对象(虽然此操作一般不影响参数传递,但可排除不必要的干扰);同时确认连接对象处于正常打开状态,连接字符串指向正确的数据库实例和库。
- 若不需要返回记录集,直接使用
内容的提问来源于stack exchange,提问作者Cip
相关产品推荐
相关产品推荐

