我的Access数据库的L_Logins表中有4个字段 ID为自增列 另外三个字段为 UserName,PassWord,Email我用C#向该表插入数据的时候遇到问题。
1 如果我的Sql 语句不包含ID,则会抛出异常,说我的Sql中的字段和表字段不一致。插入失败。
代码如下:
string cmdString = @"INSERT INTO T_Logins VALUES(@UserName,@PassWord,@Email)";
            OleDbParameter[] oleParameters = new OleDbParameter[] 
            {
                //new OleDbParameter("@ID",1),
                new OleDbParameter("@UserName",loginsModel.UserName),
                new OleDbParameter("@PassWord",loginsModel.PassWord),
                new OleDbParameter("@Email",loginsModel.Email)
            };
2 如果我在Sql语句中增加ID这个字段 则又不抛异常说我没有为ID指定默认值。插入失败。
代码如下:
string cmdString = @"INSERT INTO T_Logins VALUES(@ID,@UserName,@PassWord,@Email)";
            OleDbParameter[] oleParameters = new OleDbParameter[] 
            {
                new OleDbParameter("@ID",OleDbType.BigInt),
                new OleDbParameter("@UserName",loginsModel.UserName),
                new OleDbParameter("@PassWord",loginsModel.PassWord),
                new OleDbParameter("@Email",loginsModel.Email)
            };3 既然说没有指定默认值,那我就给ID指定默认值为1。第一条数据可以插入,第二条数据肯定又报错了,因为主键重复。插入失败。
string cmdString = @"INSERT INTO T_Logins VALUES(@ID,@UserName,@PassWord,@Email)";
            OleDbParameter[] oleParameters = new OleDbParameter[] 
            {
                new OleDbParameter("@ID",1),
                new OleDbParameter("@UserName",loginsModel.UserName),
                new OleDbParameter("@PassWord",loginsModel.PassWord),
                new OleDbParameter("@Email",loginsModel.Email)
            };
        
            return (int)AccessHelper.ExecuteNonQuery(cmdString, oleParameters);4 既然这样所有情况都试验了,那我就再改一下Sql语句把要的字段加上吧。同样是异常,说INSERT INTO 语句有错。
于是有如下代码: string cmdString = @"INSERT INTO T_Logins(UserName,PassWord,Email) VALUES(@UserName,@PassWord,@Email)";
            OleDbParameter[] oleParameters = new OleDbParameter[] 
            {
                new OleDbParameter("@UserName",loginsModel.UserName),
                new OleDbParameter("@PassWord",loginsModel.PassWord),
                new OleDbParameter("@Email",loginsModel.Email)
            };
        
            return (int)AccessHelper.ExecuteNonQuery(cmdString, oleParameters);我都要 崩溃了求大家帮忙。

解决方案 »

  1.   

    第一个,inert字段必须匹配
    第二个,你是有id参数,但是没有给id赋值,你好好看看,你只是说明了id的类型
    第三个,id是主键吧,你每次都赋值为1,不允许重复
    第四个,
    string cmdString = @"INSERT INTO T_Logins([UserName],[PassWord],[Email]) VALUES(@UserName,@PassWord,@Email)";
      

  2.   

    INSERT INTO T_Logins([UserName],[PassWord],[Email]) VALUES(?,?,?)
      

  3.   

    谢谢各位的回答,所有问题的原因都是由于Accesss关键字引起的。
    UserName 和 PassWord在Access中是关键字,所以不能直接写
    string cmdString = @"INSERT INTO T_Logins(UserName,PassWord,Email) VALUES(@UserName,@PassWord,@Email)";
    也不能用[]把字段括起来,在Sql Server中可以这样,但在Access中这样不行。
    string cmdString = @"insert into T_Logins(UserName,PassWord,Email) VALUES (@UserName,@PassWord,@Email)";应该用键盘1左边的那个键 · 把字段括起来,这样才有用。
    string cmdString = @"insert into T_Logins(`UserName`,`PassWord`,Email) VALUES (@UserName,@PassWord,@Email)";我在网上找了很久,都没有给出正确答案的,不得不去求教一个有10年开发经验的高人。经验丰富也是一种资本呀,人家捣鼓几下就把问题解决了。
      

  4.   

    因为ID是一个自增字段,所以在Sql语句中可以不写它。