您的位置:首页 > 数据库

C#操作Access数据库的若干问题记录

2016-11-17 12:50 218 查看
最近做一个数据填报软件,用的C#,操作Access数据库的时候遇到了一些问题,走了很多弯路,记录如下:

1. 报错,提示INSERT INTO语法错误,然后用生成的sql语句放在Access 2010中测试,提示:

“”Microsoft Access 设置1字段为Null是因为类型转换失败,它未将0记录添加到表是因为键值冲突,没有添加0记录是因为锁定冲突,没有添加0记录是因为有效性规则冲突...”



其实,这个提示在本例中有一定的误导性,网上查,有不少说法是主键ID的问题,最后我试出来发现和主键问题,无关,其实是字段类型转换出错的问题:

表中有两个字段,abs1和abs2,设定为数字类型,但是赋值的时候因为忽略掉,所以就用了空白字符串"",所以数据库认为这个空白字符串无法转换成数字,就报错了,所以解决方法是把字段换成文本类型,或者这两个字段给个默认值0。



2. 上个问题是解决了,接着运行程序,继续报错,提示还是INSERT INTO 语法错误,这次还是把生成的SQL语句放在Access2010中测试,通过,没问题。这样,问题就比较清楚了,同样的SQL语句在Access2010中可以执行而在C#中无法执行,说明两者对语句的处理有着不同的机制,语句如下:

insert into t_detect (no, channel, item, ...) values ("NO1","X1","农药残留",...);

看似很正常的语句,语法上没有问题,结合网上查到的一些别人分享的信息,联想到了关键字冲突的问题,于是查了一下,这里的第一个字段是no,而“no”正是Access的关键字,而Access2010有这样的处理机制让语句通过,但C#没有,于是报错。
解决方法,要么是改字段名,要么是在语句中给字段名加中括号,修改如下:

/// <summary>
/// 构造SQL的各列名
/// </summary>
public string toSQLCols()
{
return
"[no], channel, item, ...";
}

再次测试,问题解决!

由于C#操作Access不是很熟悉,这两个问题卡住了两天,让这次经验教训变得非常深刻。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐