none
为什么我不能向SQL数据库写入数据 RRS feed

  • 问题

  • 目前遇到一个问题,很让人头疼,请高人帮我看一下是什么问题。

    问题的具体情况是这样的:

    我的程序分三层:1.(数据访问层)DataAccessLayer.cs  2.(操作执行层)OperationExcuteLayer.cs  3.Form层。

    在DataAccessLayer中,有如下代码:

     

      public static Boolean EditRecord( string cmdText,CommandType cmdType,List <SqlParameter >cmdParameters)//对数据库中的单条记录进行编辑操作

            {

                SqlConnection ConncetNow =new SqlConnection ();

                ConncetNow .ConnectionString =TheConnectionString ;

                ConncetNow .Open ();

                SqlCommand  comm=new SqlCommand ();

                comm.Connection = ConncetNow;

                comm.CommandType =cmdType ;

                comm .CommandText =cmdText ;

                if (cmdParameters !=null )

                { 

                    foreach (SqlParameter pa in cmdParameters )

                     comm .Parameters .Add (pa);

                }

                try

                { comm.ExecuteNonQuery(); }

                catch (SqlException ex)

                { return false; }

                finally {

                    comm .Parameters .Clear ();

                    comm.Dispose ();

                    ConncetNow .Close ();

                    ConncetNow .Dispose ();

                }

                return true ;

            }

     

      public static SqlParameter CreateParameters(string paName, DbType theType, string paValue) //创建要执行的SQL语句的参数数组。

            {

                SqlParameter pa = new SqlParameter();

                pa.ParameterName = paName;

                pa.DbType = theType;

                pa.Value = paValue;

                return pa;

            }

     

    在OperationExcuteLayer层中,有如下代码:

     

     

            public static void InputMonthSalarysDetails(string XH, string StaffName, string BasicSalarys, string PositionSubsidy, string DiplomaSubsidy, string RentSubsidy,

                                string PhoneSubsidy, string TrafficSubsidy, string LenghOfServiceSalarys, string AttendanceDays, string PerformanceSalarys,

                                string OvertimeReward, string ProvidentFund, string Medicare, string Absenteeism, string SickLeave, string EventLeave, string TheDepartment )  

                            //  将新生成的元组写入数据库

            {

     

                string MySQL = @"insert into        MonthSalarys(Number,Name,BasicSalarys,PositionSubsidy,DiplomaSubsidy,RentSubsidy,PhoneSubsidy,TrafficSubsidy,

                               LenghOfServiceSalarys,AttendanceDays,ShouldBeSalarys,AttendancSalarys,PeformanceSalarys,OvertimeReward,ProvidentFund,Medicare,

                               Absenteeism,SickLeave,EventLeave,ActualSalarys,Department,Year,Month)values(@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l,@m,@n,@o,@p,@q,@r,

                               @s,@t,@u,@v,@w)";

                List<SqlParameter> thePara = new List<SqlParameter>();

                thePara.Add(DataAccessLayer.CreateParameters("@a", DbType.String, XH));

                thePara.Add(DataAccessLayer.CreateParameters("@b", DbType.String, StaffName));

                thePara.Add(DataAccessLayer.CreateParameters("@c", DbType.String, BasicSalarys));

                thePara.Add(DataAccessLayer.CreateParameters("@d", DbType.String, PositionSubsidy));

                thePara.Add(DataAccessLayer.CreateParameters("@e", DbType.String, DiplomaSubsidy));

                thePara.Add(DataAccessLayer.CreateParameters("@f", DbType.String, RentSubsidy));

                thePara.Add(DataAccessLayer.CreateParameters("@g", DbType.String, PhoneSubsidy));

                thePara.Add(DataAccessLayer.CreateParameters("@h", DbType.String, TrafficSubsidy));

                thePara.Add(DataAccessLayer.CreateParameters("@i", DbType.String, LenghOfServiceSalarys));

                thePara.Add(DataAccessLayer.CreateParameters("@j", DbType.String, AttendanceDays));

                float ShouldBeSalarys = 0;

                if (BasicSalarys.Trim() != "")

                    ShouldBeSalarys += float.Parse(BasicSalarys);

                if (PositionSubsidy.Trim() != "")

                    ShouldBeSalarys += float.Parse(PositionSubsidy);

                if (DiplomaSubsidy.Trim() != "")

                    ShouldBeSalarys += float.Parse(DiplomaSubsidy);

                if (RentSubsidy.Trim() != "")

                    ShouldBeSalarys += float.Parse(RentSubsidy);

                if (TrafficSubsidy.Trim() != "")

                    ShouldBeSalarys += float.Parse(TrafficSubsidy);

                if (LenghOfServiceSalarys .Trim ()!="")

                    ShouldBeSalarys +=float.Parse(LenghOfServiceSalarys);

                if ((!PhoneSubsidy.EndsWith("%")) && (!PhoneSubsidy.EndsWith("报")&&(PhoneSubsidy .Trim ()!="")))

                    ShouldBeSalarys += float.Parse(PhoneSubsidy);

     

                thePara.Add(DataAccessLayer.CreateParameters("@k", DbType.String, ShouldBeSalarys.ToString()));

                float AttendanceSalarys = ShouldBeSalarys - float.Parse(VerifyTheValue(Absenteeism)) - float.Parse(VerifyTheValue(SickLeave))

                                           - float.Parse(VerifyTheValue(EventLeave));

     

                thePara.Add(DataAccessLayer.CreateParameters("@l", DbType.String, AttendanceSalarys.ToString()));

                thePara.Add(DataAccessLayer.CreateParameters("@m", DbType.String, PerformanceSalarys));

                thePara.Add(DataAccessLayer.CreateParameters("@n", DbType.String, OvertimeReward));

                thePara.Add(DataAccessLayer.CreateParameters("@o", DbType.String, ProvidentFund));

                thePara.Add(DataAccessLayer.CreateParameters("@p", DbType.String, Medicare));

                thePara.Add(DataAccessLayer.CreateParameters("@q", DbType.String, Absenteeism));

                thePara.Add(DataAccessLayer.CreateParameters("@r", DbType.String, SickLeave));

                thePara.Add(DataAccessLayer.CreateParameters("@s", DbType.String, EventLeave));

                float TheActualSalarys = AttendanceSalarys + float.Parse(VerifyTheValue(PerformanceSalarys)) + float.Parse(VerifyTheValue(OvertimeReward))

                                         - float.Parse(VerifyTheValue(ProvidentFund)) - float.Parse(VerifyTheValue(Medicare));

     

                thePara.Add(DataAccessLayer.CreateParameters("@t", DbType.String, TheActualSalarys.ToString()));

                thePara.Add(DataAccessLayer.CreateParameters("@u", DbType.String, TheDepartment ));

                thePara.Add(DataAccessLayer.CreateParameters("@v", DbType.String, CurrentYear));

                thePara.Add(DataAccessLayer.CreateParameters("@w", DbType.String, CurrentMonth));

                if (!DataAccessLayer.EditRecord(MySQL, CommandType.Text, thePara))//将元组写入数据库。

                    MessageBox .Show ("Failed");

     

            } 

     

     public static string VerifyTheValue(string str) //验证输入是否有空值,如有的话,将其转换为“0”。

            {

                string TheValue;

                if (str.Equals(""))

                    TheValue = "0";

                else TheValue = str;

                return TheValue;

            }

     

    最后,我在Form层调用上面的代码

     

     private void button2_Click(object sender, EventArgs e) 

            {

     

     

     

                    OperationExcuteLayer.InputMonthSalarysDetails(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text,

                                                         textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, textBox13.Text, textBox14.Text,

                                                         textBox15.Text, textBox16.Text, textBox17.Text, textBox18.Text, textBox19.Text, textBox21.Text );

              }

             执行这一段代码的目的当然是希望向SQL写入数据。但奇怪的是不能写入!为此,我又做了一个实验性的数据库EXPERIMENT,这个数据库与上面的数据库唯一的区别是

             此数据库只有一张含4列的表(其列名为,Number,Name,Age,Sex);同样使用上面DataAccessLayer层的方法,来向数据库写入数据,然后在操作层写入如下代码:

     

     public static Boolean  InputEmploeeDetails(string XH, string StaffName, string age, string sex)

     

     

            {

     

                string MySQL = @"insert into MonthSalarys( Number,Name,Age,Sex)values(@a,@b,@c,@d)";

                List<SqlParameter> thePara = new List<SqlParameter>();

                thePara.Add(dataAccess.CreateParameters("@a", DbType.String, XH));

                thePara.Add(dataAccess.CreateParameters("@b", DbType.String, StaffName));

                thePara.Add(dataAccess.CreateParameters("@c", DbType.String, age));

                thePara.Add(dataAccess.CreateParameters("@d", DbType.String, sex));

                Boolean isOK = false;

     

                isOK=dataAccess.EditRecord(MySQL, CommandType.Text, thePara);

                return isOK;

            }

     

      public static void  InputToDB(string str1, string str2, string str3, string str4)

            {

                string MySQL = "insert into EMPLOEE(Number,Name,Age,Sex) Values(@a,@b,@c,@d)";

                List<SqlParameter> para = new List<SqlParameter>();

                para.Add(dataAccess.CreateParameters("@a", DbType.String, str1));

                para.Add(dataAccess.CreateParameters("@b", DbType.String, str2));

                para.Add(dataAccess.CreateParameters("@c", DbType.String, str3));

                para.Add(dataAccess.CreateParameters("@d", DbType.String, str4));

                if (dataAccess.EditRecord(MySQL, CommandType.Text, para))

                    MessageBox.Show("OK");

                else

                    MessageBox.Show("FAILED");

            }

    最后调用执行:

     Excute.InputToDB(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);

    其结果是居然能向数据库写入数据!这是什么原因呢,希望高人多指教,急切等待回复中。

     

     

     

     

     

     

     

     

     

    2011年9月1日 7:49

答案

  • 你好

    或者你可以嘗試在 

         catch (SqlException ex)

    上加入一些CODE 看看 有沒有 Exception的出現

    E.G.

         catch (SqlException ex){

    MessageBox.Show(ex.Message);

    }

    看看這個Exception是什麼

    Please correct me if my concept is wrong


    Chi
    • 已标记为答案 changer168 2011年9月1日 8:51
    2011年9月1日 8:36

全部回复

  • 你好

    或者你可以嘗試在 

         catch (SqlException ex)

    上加入一些CODE 看看 有沒有 Exception的出現

    E.G.

         catch (SqlException ex){

    MessageBox.Show(ex.Message);

    }

    看看這個Exception是什麼

    Please correct me if my concept is wrong


    Chi
    • 已标记为答案 changer168 2011年9月1日 8:51
    2011年9月1日 8:36
  • 非常感谢你的指导,问题我已经找到了。谢谢!
    2011年9月1日 8:52