我是.net中的新编程。对于第一个项目,我想将数据写入sql server数据库。这是一个非常基本的程序,有一个表单,一些用于输入的文本框和一个用于输出的文本框。该计划的目的是跟踪我的培训。我还有一个输出文本框,问题是该文本框中没有任何内容(“test”除外)。我想这是一个简单的问题,但我无法弄明白。
(正如我所说的,我是.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 :(得分:1)
您的SqlServer类不应继承WriteToDatabase类,因为WriteToDatabase类继承Form类。您的代码中实际发生的是您在创建SqlServer类时创建新表单,并且该表单上的文本框将随值更新。如果在创建SqlServer类的新实例后调用方法sql.Show(),则可以看到这一点。
以下代码将更新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.";
}
}
}
}
答案 1 :(得分:0)
由于您尝试向TextBox
添加多行,因此应将TextBox
的{{3}}属性设置为true
。
我建议
Multiline
代替"\r\n"
Environment.NewLine
代替tOutput.Text += ...
答案 2 :(得分:-1)
这更简单地写为:
public void WriteToOutput(string output)
{
this.tOutput.Text += output + "\r\n";
}

当输出字符串输出到文本框时,没有理由返回字符串。还要确保在客户端为多行启用了文本框。 另外,我建议在文本框的名称前面加上" txtOutput"的性质。因此,当您的代码库增长时,您不会混淆自己或任何在代码中查找特定控件/对象的人。
另外,我建议丢弃sqlwriter,而是获取实体框架的版本。实体框架和其他对象关系映射器是工业中实际使用的,因为sql-select语句的打开和关闭变得太繁琐而无法管理。
Plus实体框架如果您正在使用像visual studio这样的智能环境,那么在调试自己的代码时需要一目了然的错误堆栈跟踪。
Plus学习实体框架让您了解linq。几年前,当我开始使用.net编码时,每个新手都应该向这个方向推,我知道我希望自己就是这样。