2015-12-09 3 views
0

Я новичок в программировании .net, и у меня есть проблема с записью intput из формы на sql-сервер. В базу данных записывается только одна запись, а в других записях говорится: «Данные не записываются в базу данных». Также мой cmbbox не обновляется после того, как данные записываются в базу данных, хотя я запускаю метод UpdateInitialWeek(). Я не хочу писать «код спагетти» и хотел бы, чтобы моя программа была структурированной. Поэтому любые советы очень ценятся (я уже знаю, что лучше использовать Entity Framework для обработки данных, что я узнаю в конце концов;)).Только одна запись, написанная на сервере sql + combobox, не обновляется

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace Write_to_database 
{ 
    public partial class WriteToDatabase : Form 
    { 
     SqlServer sql = new SqlServer(); 

     public WriteToDatabase() 
     { 
      sql.OpenSqlConnection(); 
      InitializeComponent(); 
      this.UpdateInitialWeek(); 
      sql.CloseSqlConnection(); 
     } 

     private void btnWrite_Click(object sender, EventArgs e) 
     { 
      WriteToOutput(sql.OpenSqlConnection()); 
      if (txtMilitaryPress.Text != "") 
       WriteToOutput(sql.InsertToTraining(ConvertDate(dtMilitaryPress.Value), "Military Press", txtMilitaryPress.Text.ToString(), txtRepMilitaryPress.Text.ToString(), cmbMilitaryPress.Text.ToString())); 
      if (txtDeadlift.Text != "") 
       WriteToOutput(sql.InsertToTraining(dtDeadlift.Value.ToString(), "Deadlift", txtDeadlift.Text.ToString(), txtRepDeadlift.Text.ToString(), cmbDeadlift.Text.ToString())); 
      if (txtBenchPress.Text != "") 
       WriteToOutput(sql.InsertToTraining(dtBenchPress.Value.ToString(), "Bench Press", txtBenchPress.Text.ToString(), txtRepBenchPress.Text.ToString(), cmbBenchPress.Text.ToString())); 
      if (txtBackSquat.Text != "") 
       WriteToOutput(sql.InsertToTraining(dtBackSquat.Value.ToString(), "Back Squat", txtBackSquat.Text.ToString(), txtRepBackSquat.Text.ToString(), cmbBackSquat.Text.ToString())); 
      this.UpdateInitialWeek(); 
      WriteToOutput(sql.CloseSqlConnection()); 
     } 

     //Write output to textbox 
     public void WriteToOutput(string output) 
     { 
      this.txtOutput.AppendText(output + Environment.NewLine); 
     } 

     //Convert date for sql server 
     public string ConvertDate(DateTime date) 
     { 
      return date.ToString("MM/dd/yyyy"); 
     } 

     //Update comboboxes to set right training week 
     public void UpdateInitialWeek() 
     { 
      this.cmbBackSquat.Text = CheckWeek(sql.GetDataTraining("Back Squat")); 
      this.cmbBenchPress.Text = CheckWeek(sql.GetDataTraining("Bench Press")); 
      this.cmbDeadlift.Text = CheckWeek(sql.GetDataTraining("Deadlift")); 
      this.cmbMilitaryPress.Text = CheckWeek(sql.GetDataTraining("Military Press")); 
     } 

     //Training week +1 except for week 4 --> back to 1 
     public string CheckWeek(string trainingWeek) 
     { 
      int trWeek = Int32.Parse(trainingWeek); 
      if (trWeek == 4) 
       trWeek = 1; 
      else 
       trWeek += 1; 
      return trWeek.ToString(); 
     } 


    } 

    public class SqlServer 
    { 
     SqlConnection con = new SqlConnection("Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;"); 
     public string OpenSqlConnection() 
     { 
      try 
      { 
       con.Open(); 
       return "Connection to: " + "'Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;'" + " successful."; 
      } 
      catch 
      { 
       return "Connection to: " + "'Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;'" + " failed."; 
      } 
     } 

     public string CloseSqlConnection() 
     { 
      try 
      { 
       con.Close(); 
       return "Connection to: " + "'Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;'" + " successfully closed"; 
      } 
      catch 
      { 
       return "Connection to: " + "'Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;'" + " not closed."; 
      } 
     } 

     public string InsertToTraining(string date, string lift, string weight, string reps, string week) 
     { 
      try 
      { 
       using (SqlCommand command = new SqlCommand("INSERT INTO LIFT_HISTORY VALUES(@date,@lift,@weight,@reps,@week)", con)) 
       { 
        command.Parameters.Add(new SqlParameter("weight", weight.ToString())); //SqlDbType.NVarChar 
        command.Parameters.Add(new SqlParameter("date", date.ToString())); 
        command.Parameters.Add(new SqlParameter("week", week.ToString())); 
        command.Parameters.Add(new SqlParameter("reps", reps.ToString())); 
        command.Parameters.Add(new SqlParameter("lift", lift.ToString())); 
        command.ExecuteNonQuery(); 
       } 
       return "Data successfully written to database."; 

      } 
      catch 
      { 
       return "Data not written to database."; 
      } 
     } 

     public string GetDataTraining(string where) 
     { 
      int trainingWeek; 
      //using (SqlCommand command = new SqlCommand("SELECT WEEK_OF_TRAINING FROM dbo.LIFT_HISTORY WHERE [DATE] = (SELECT MAX([DATE]) FROM dbo.LIFT_HISTORY WHERE LIFT = 'Deadlift') AND LIFT = 'Deadlift')", con)) 
      using (SqlCommand command = new SqlCommand("SELECT WEEK_OF_TRAINING FROM dbo.LIFT_HISTORY WHERE LIFT = '"+ where +"' ORDER BY [DATE] DESC", con)) 
      { 
       trainingWeek = (Int32)command.ExecuteScalar(); 
      } 
      return trainingWeek.ToString(); 
     } 

    } 
} 
+0

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

ответ

2

Есть некоторые проблемы с вашим кодом, но это нормально для теперь, когда вы все еще учусь, например:

public WriteToDatabase() 
    { 
     sql.OpenSqlConnection(); 
     InitializeComponent(); 
     this.UpdateInitialWeek(); 
     sql.CloseSqlConnection(); 
    } 

должно быть:

public void WriteToDatabase() 
    { 
     sql.OpenSqlConnection(); 
     InitializeComponent(); 
     this.UpdateInitialWeek(); 
     sql.CloseSqlConnection(); 
    } 

Это потому, что вы ничего не возвращаете, вместо этого вы хотите объявить тип переменной, в которую вы возвращаетесь.

Хорошо, прежде всего, я хотел бы предложить вам использовать слой-ориентированное кодирование. Например:

Начну тару класс сущностей:

namespace Entities 
{ 
public class LiftingStory 
    { 
    public string Weight { get; set; } 
    public string Date { get; set; } 
    public string Week { get; set; } 
    public string Reps { get; set; } 
    public string Lift { get; set; } 
    } 
} 

Затем вы начинаете создавать слой «для доступа к данным»

using System.Data; 
using System.Configuration; 
using Entities; 

namespace DataAccess 
{ 
public class DataLiftingStory 
{ 
    public bool insertLifting(LiftingStory obj) //correction: should be LiftingStory instead of DataLiftingStory because I'm retrieving a LiftingStory objecto to be proccesed. 
    { 
     //we're creating a new connection to Database, but it will need string parameter 
     //you can get it directly from the connectionstring on the Web.config in this way 
     // ConfigurationManager.ConnectionStrings["nameParameterOfYourConnString"].ConnectionString 
     //instead of that I'll do it with a string for making more easier to understand 

     string connectionString = "Data Source=WINSERVER;Initial Catalog=TRAINING;Integrated Security=SSPI;"; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 

      //now I'll create the command 
      using (SqlCommand command = new SqlCommand()) 
      { 

       //so now I've to say what type of command I'm making up. In your case is "Text" because you're being explicit with the query 
       //I suggest you to use stored procedures btw. 
       command.CommandType = CommandType.Text; 

       //now the command text will be your query 
       command.CommandText = "INSERT INTO LIFT_HISTORY VALUES(@date,@lift,@weight,@reps,@week)"; 

       //now we set the parameters 
       command.Parameters.Add(new SqlParameter("date", obj.Date)); 
       command.Parameters.Add(new SqlParameter("lift", obj.Lift)); 
       command.Parameters.Add(new SqlParameter("weight", obj.Weight)); 
       command.Parameters.Add(new SqlParameter("reps", obj.Reps)); 
       command.Parameters.Add(new SqlParameter("week", obj.Week)); 

       try 
       { 
        command.Connection = connection; 
        command.Connection.Open(); 

        //now we're executing the query and if we get more than 0 that will means that it inserted or modified a row 
        //then it will return true and going out from method. 
        if (command.ExecuteNonQuery() > 0) 
         return true; 
       } 
       catch (Exception) 
       { 
        //If it fails return false 
        return false; 
        throw; 
       } 
       finally 
       { 
        //then we close the connection 
        command.Connection.Close(); 
       } 

      //if not failed but it didn't anything, it will return false 
      return false; 
      } 
     } 
    } 

Теперь это самая легкая часть бизнеса.

using System.Web; 
using Entities; 
using DataAccess; 
namespace Business 
{ 
    public class BusinessLiftingStory 
    { 
    public bool insertLifting(LiftingStory obj) 
    { 
     DataLiftingStory dataLifting = new DataLiftingStory(); 
     dataLifting.insertLifting(obj); 
    } 
    } 
} 

Так что последний шаг, чтобы заполнить объект в «View-слое» и вызвать метод из бизнеса:

 LiftingStory obj = new LiftingStory(); 
     obj.Weight = string.Empty; 
     obj.Date = string.Empty; //put values from comboBoxes 
     obj.Reps = string.Empty; 
     obj.Lift = string.Empty; 
     obj.Week = string.Empty; 
     BusinessLiftingStory busObj = new BusinessLiftingStory(); 
     busObj.insertLifting(obj); 

Combo коробки не являются освежающими данными, так как метод DataBind(), не забудьте в тот момент, когда вы хотите «перерисовать» свой comboBox, вам нужно будет установить DataSource = null, затем снова получить источник данных, а затем DataBind.

используйте метод Init() для этого, если хотите.

private void Init() 
{ 
    cmbWeight.DataSource = null; 
    cmbWeight.DataSource = //new Datasource 
    //dont forget to set the values and text fields 
    cmbWeight.DataBind(); 
} 

Таким образом, у вас будет заказ в вашем коде, я надеюсь, что это вам поможет.

Привет :)

PS: Извините за длительный ответ.

+2

Отличный ответ. Оберните свое соединение и объект команды в Использование операторов для +1 :) – HardCode

+0

Спасибо Пабло, очень хорошо, что вы дали такой расширенный ответ :) !! Это очень полезная информация для меня! – hatsjie

+0

Благодарим вас за советы @HardCode Я делал это для образовательных целей ахахаха, но лучше сразу научиться «лучшим практикам» :) –

-1

может быть, попытайтесь распечатать сведения об исключении либо ваше возвращение строки или консоль и т.д.

вместо поймать { возвращения «Данные не записываются в базу данных.»; }

..

catch(Exception ex) 
       { 
        return "Data not written to database." + ex.Message; 
       } 

..

https://msdn.microsoft.com/en-us/library/system.exception.message(v=vs.110).aspx

Смежные вопросы