2015-12-04 5 views
1

Я новичок в программировании в .net. Для первого проекта я хочу записать данные в базу данных sql-сервера. Это очень простая программа с одной формой, несколько текстовых полей для ввода и одна для вывода. Целью программы является отслеживание моего обучения. У меня также есть текстовое поле для вывода, проблема в том, что в этом текстовом поле ничего не отображается (кроме «test»). Я думаю, это простая проблема, но я не могу понять.Вывод не записан в текстовое поле C#

(Как я уже сказал, я новичок в программировании .net, поэтому, если кто-либо из вас, ребята, мог бы дать советы по передовому программированию, тоже будет оценен).

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 
    { 
     public WriteToDatabase() 
     { 
      InitializeComponent(); 
     } 

     private void bWrite_Click(object sender, EventArgs e) 
     { 
      SqlServer sql = new SqlServer(); 
      WriteToOutput("test"); 
      sql.OpenSqlConnection(); 
      sql.WriteToTraining("20151231","10",10.0,5,5); 
      sql.CloseSqlConnection(); 

     } 


     public string WriteToOutput(string output) 
     { 
      this.tOutput.Text += output + "\r\n"; 
      return this.tOutput.Text.ToString(); 
     } 




    } 

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

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

     public void WriteToTraining(string date, string lift, double weight, int reps, int 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())); 
        command.Parameters.Add(new SqlParameter("date", date.ToString())); 
        command.Parameters.Add(new SqlParameter("week", week.ToString())); 
        command.Parameters.Add(new SqlParameter("reps", date.ToString())); 
        command.Parameters.Add(new SqlParameter("lift", date.ToString())); 
        command.ExecuteNonQuery(); 
       } 
       WriteToOutput("Data successfully written to database."); 

      } 
      catch 
      { 
       WriteToOutput("Data not written to database."); 
      } 
     } 

    } 
} 
+0

Поскольку вы не показать свойства вашего текстового поля, я предполагаю, что ваше текстовое поле является одной строкой, в то время как вы должны включить его многоуровневые возможности (либо из конструктора форм, либо через свойства), чтобы показать дополнительный текст, добавленный символами новой строки. – Jure

+0

Также я считаю, что это плохой класс, чтобы получить свой логический класс базы данных из класса, который наследуется от формы. Вы должны сделать свой класс SqlServer самостоятельным, а не наследовать от формы. – Jure

ответ

1

Ваш класс SqlServer не должен наследовать от класса WriteToDatabase как класс WriteToDatabase наследует форму класс. Что на самом деле происходит в вашем коде, так это то, что вы создаете новую форму при создании класса SqlServer, и текстовое поле в этой форме обновляется со значениями. Вы можете увидеть это, если вы вызовете метод sql.Show() после создания нового экземпляра класса SqlServer.

Следующий код будет обновлять значения на форме WriteToDatabase:

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 
    { 
     public WriteToDatabase() 
     { 
      InitializeComponent(); 
     } 
    private void bWrite_Click(object sender, EventArgs e) 
    { 
     SqlServer sql = new SqlServer(); 
     WriteToOutput("test"); 
     WriteToOutput(sql.OpenSqlConnection()); 
     WriteToOutput(sql.WriteToTraining("20151231", "10", 10.0, 5, 5)); 
     WriteToOutput(sql.CloseSqlConnection()); 

    } 

    public void WriteToOutput(string output) 
    { 
     this.tOutput.Text += output + "\r\n"; 
    } 
} 

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 WriteToTraining(string date, string lift, double weight, int reps, int 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())); 
       command.Parameters.Add(new SqlParameter("date", date.ToString())); 
       command.Parameters.Add(new SqlParameter("week", week.ToString())); 
       command.Parameters.Add(new SqlParameter("reps", date.ToString())); 
       command.Parameters.Add(new SqlParameter("lift", date.ToString())); 
       command.ExecuteNonQuery(); 
      } 
      return "Data successfully written to database."; 

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

} 

}

+0

Спасибо за ваш четкий ответ. Это решило мою проблему !! – hatsjie

-1

Это более просто, как написано:

public void WriteToOutput(string output) 
 
     { 
 
      this.tOutput.Text += output + "\r\n"; 
 
     }

Там нет никаких оснований для возврата строки, когда это выход в текстовое поле. Также убедитесь, что ваше текстовое поле включено для нескольких строк на стороне клиента. Также я рекомендую префикс имени ваших текстовых полей с чем-то вроде «txtOutput», так что, когда ваша кодовая база растет, вы не путаете себя или кого-либо, просматривающего ваш код в отношении того, какой конкретный элемент управления/объекта.

Также я рекомендую выбросить sqlwriter и вместо этого захватить версию структуры сущности. Структура Entity и другие объектно-реляционные сопоставители - это то, что фактически используется в промышленности, потому что открытие и закрытие операторов sql-select становятся слишком утомительными для управления.

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

Плюс учебная структура сущности дает вам понимание linq. Каждый новичок должен быть заперт в этом направлении. Я знаю, что хотел бы, чтобы я был, когда начал писать в .net несколько лет назад.

+0

Изучение всей структуры для чего-то, что уже (в основном) функционала, кажется, в лучшем случае излишне. EF хорош для приложений корпоративного уровня, но это, безусловно, не похоже на то, с чем работает OP. Чтобы добавить к этому, EF и Linq также имеют довольно большое количество накладных расходов для чего-то, что представляется очень простым приложением. – user2366842

+0

Ваше мнение верное, однако он решает этот вопрос только на поверхностном уровне, моя перспектива рассматривает то, что лучше всего подходит для разработчика. Имейте в виду, что часть его вопроса просила совета. –

+0

Спасибо за ответ, я рассмотрю структуру сущности. Не для этого проекта, но это хорошо знать или, по крайней мере, иметь представление о том, что они используют в отрасли. Кроме того, спасибо за советы, использовали их для улучшения моего кода :). – hatsjie

0

Поскольку вы пытаетесь добавить несколько строк в вашем TextBox, вы должны установить Multiline свойство вашего TextBox в true.

И я предлагаю

+0

Использовал ваш совет, спасибо за это! – hatsjie

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