C#执行sql语句向access数据库表插入数据问题

时间:2022-01-28 13:21:38
各位:
    我现在有一个项目,需要用到access数据库,
程序中执行insert 语句成功后,打开对应的access数据表查看,发现没有插入数据.

但同样的insert语句在access的sql视图运行后,发现数据可以插入到表中。

所以,我想问问大家,为什么在程序中运行OK,没有报异常,调试中发现影响的行数为1,但实际上没有插入数据。

这种情况到底是什么原因??

9 个解决方案

#1


还是贴出来代码吧~

#2


就是通过调用ExecuteCommand(string sql, params OleDbParameter[] values)


 public static int AddCszm(CszmInfo cszm)
        {
            int y=0;
            string sql = "insert into cszm(inputDate,childName,sex,birthDate,birthAddress,birthWeek,healthInfo,weight,height,motherName,"+
                         "motherAge,motherNationality,motherNation,motherID,fatherName,fatherAge,fatherNationality,fatherNation,fatherID,"+
                         "birthAddrType,deliveryAgencies,homeAddress,issueDate) "+
                         "values('"+cszm.InputDate+"','"+cszm.ChildName+"','"+cszm.Sex+"','"+cszm.BirthDate+"','"+cszm.BirthAddress+
                         "',"+cszm.BirthWeek+",'"+cszm.HealthInfo+"',"+cszm.Weight+","+cszm.Height+",'"+cszm.MotherName+
                         "',"+cszm.MotherAge+",'"+cszm.MotherNationality+"','"+cszm.MotherNation+"','"+cszm.MotherID+
                         "','"+cszm.FatherName+"',"+cszm.FatherAge+",'"+cszm.FatherNationality+"','"+cszm.FatherNation+
                         "','" + cszm.FatherID + "','" + cszm.BirthAddrType + "','" + cszm.DeliveryAgencies + 
                         "','"+cszm.HomeAddress+"','"+cszm.IssueDate+"')";

            y = DBHelper.ExecuteCommand(sql,null);

            return y;
        }


 public static int ExecuteCommand(string sql, params OleDbParameter[] values)
        {
            using (OleDbConnection conn = new OleDbConnection(ConnecttionString))
            {
                OleDbCommand cmd = new OleDbCommand();
                PrepareCommand(cmd, conn, sql, values);
                return cmd.ExecuteNonQuery();
            }
        }


#3


这个问题应该是调试的问题。
每次重新DEBUG的时候,会把数据库清空。
直接去运行那个EXE文件再试一下。

#4


你的项目中有数据库文件吗?

#5


是不是你看错文件了? 

#6


另外:上面的prepareCommand方法定义如下:
private static void PrepareCommand(OleDbCommand cmd, OleDbConnection conn, string cmdText, OleDbParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            cmd.CommandType = CommandType.Text;

            if (cmdParms != null)
            {
                foreach (OleDbParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

#7


ACCESS支持带参数的cmd么?楼主可以考虑把sql拼完之后去执行,而不是以传参数的格式

#8


3楼正解,原来程序一直都没有问题,只是自己都在调试状态看结果,所以误导了自己!

#9


如果返回值显示影响行数是1的话,那说明程序没问题

如果你是把数据库文件添加到项目的话

在视图中显示的是临时数据库信息,每次运行完会清空,你可以调试的时候对比一下。

debug目录下的mdb和项目目录中的原mdb,就知道区别了,每次调试,临时数据库都会重新拷贝原数据库文件

#1


还是贴出来代码吧~

#2


就是通过调用ExecuteCommand(string sql, params OleDbParameter[] values)


 public static int AddCszm(CszmInfo cszm)
        {
            int y=0;
            string sql = "insert into cszm(inputDate,childName,sex,birthDate,birthAddress,birthWeek,healthInfo,weight,height,motherName,"+
                         "motherAge,motherNationality,motherNation,motherID,fatherName,fatherAge,fatherNationality,fatherNation,fatherID,"+
                         "birthAddrType,deliveryAgencies,homeAddress,issueDate) "+
                         "values('"+cszm.InputDate+"','"+cszm.ChildName+"','"+cszm.Sex+"','"+cszm.BirthDate+"','"+cszm.BirthAddress+
                         "',"+cszm.BirthWeek+",'"+cszm.HealthInfo+"',"+cszm.Weight+","+cszm.Height+",'"+cszm.MotherName+
                         "',"+cszm.MotherAge+",'"+cszm.MotherNationality+"','"+cszm.MotherNation+"','"+cszm.MotherID+
                         "','"+cszm.FatherName+"',"+cszm.FatherAge+",'"+cszm.FatherNationality+"','"+cszm.FatherNation+
                         "','" + cszm.FatherID + "','" + cszm.BirthAddrType + "','" + cszm.DeliveryAgencies + 
                         "','"+cszm.HomeAddress+"','"+cszm.IssueDate+"')";

            y = DBHelper.ExecuteCommand(sql,null);

            return y;
        }


 public static int ExecuteCommand(string sql, params OleDbParameter[] values)
        {
            using (OleDbConnection conn = new OleDbConnection(ConnecttionString))
            {
                OleDbCommand cmd = new OleDbCommand();
                PrepareCommand(cmd, conn, sql, values);
                return cmd.ExecuteNonQuery();
            }
        }


#3


这个问题应该是调试的问题。
每次重新DEBUG的时候,会把数据库清空。
直接去运行那个EXE文件再试一下。

#4


你的项目中有数据库文件吗?

#5


是不是你看错文件了? 

#6


另外:上面的prepareCommand方法定义如下:
private static void PrepareCommand(OleDbCommand cmd, OleDbConnection conn, string cmdText, OleDbParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            cmd.CommandType = CommandType.Text;

            if (cmdParms != null)
            {
                foreach (OleDbParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

#7


ACCESS支持带参数的cmd么?楼主可以考虑把sql拼完之后去执行,而不是以传参数的格式

#8


3楼正解,原来程序一直都没有问题,只是自己都在调试状态看结果,所以误导了自己!

#9


如果返回值显示影响行数是1的话,那说明程序没问题

如果你是把数据库文件添加到项目的话

在视图中显示的是临时数据库信息,每次运行完会清空,你可以调试的时候对比一下。

debug目录下的mdb和项目目录中的原mdb,就知道区别了,每次调试,临时数据库都会重新拷贝原数据库文件