C#文件读写语法

补充一下前面没记录的C#的语法。

懒得抄书了,把大作业的边边角角拉出来做例子,简要说明一下。以后直接copy当模板用。

说明

大作业是喜闻乐见的教务管理系统。

任务书要求用数据库。我按照课本用的微软的SQL Server,由于考虑到答辩与提交打分等原因,尽量做好环境的可迁移性,即换一台电脑也能正常跑程序。

数据库

我本想直接用远程数据库,在服务器上开一个sql server的1433端口直连。

至于安装,服务器是CentOS,第一次在linux上用SQL Server,全程看的教程:

centos7.x中安装SQL

教程很详细。最后服务也成功绿了。本地成功连接,但是出乎意料的,服务器宕机了。。。

SQLServer太吃内存了,负载拉满。

然后就想到迁移为mysql。毕竟mysql不怎么吃资源。

迁移过程出了点小岔子。数据导出的SQL脚本在mysql跑出了Error,SQLServer和mysql在语法上有点小出入。例如自增主键,在SQLServer里为 primary key identity(1,1),表示从1开始,步长为1;而mysql里为 primary key auto_increment,还有编码等等若干小问题,要修改以来也挺麻烦的。

懒得处理了。干脆把导出的脚本给老师自己弄去,照着建个SqlServer数据库,然后本地连接就能跑了。

注意,user+pwd的方式连接SQL Server时需要设置项目:

  1. 开启SQL Server身份验证:
  2. 登陆用户授权:
  3. 设置密码,也选强制密码策略:

打包

关于程序打包,用的Visual Studio里的一个插件:

Microsoft Visual Studio Installer Projects

学校的机子环境:.NET 4.5.2

程序开发环境: .NET 4.7.2

使用注意:

打包程序本身也是.NET Framework框架依赖,所以选择打包程序本身的框架版本尤为重要,否则在旧机子上安装程序时会因为缺少最新版本的.NET Framework而无法运行。

生成一个msi文件和exe文件,复制msi,提交作业。

文件读写

由于是直接安装程序,又没有远程数据库。那么连接数据库是个问题。本地数据库名和密码要和程序里的ConnectionString一致,临时改来改去也麻烦。

想了个很傻的办法:在程序第一次启动时新建一个配置文件,专门用来连数据库的,连接成功后保存文件,以后每次启动连库时从文件里读取就好了。

这个办法在实际项目中很蠢,但是临时交个作业问题不大。

代码

登陆窗口(文件读)

程序的登陆窗口添加Load事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/// <summary>
/// 初始化数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Login_Load(object sender, EventArgs e)
{
string path = @"C:\Program Files\manager";
if (Directory.Exists(path) != true)
{
Directory.CreateDirectory(path);
}
path = @"C:\Program Files\manager\manager.conf";
FileStream fs = null;
BinaryReader reader = null;
try
{
fs = new FileStream(path, FileMode.OpenOrCreate);
reader = new BinaryReader(fs);
reader.BaseStream.Seek(0, SeekOrigin.Begin);
string conn = reader.ReadString();
connectionString = conn;
}
catch
{
reader.Close();
fs.Close();
MessageBox.Show("无法读取配置文件");
if (connectionString == null || connectionString.Trim() == "")
{
config config = new config();
config.ShowDialog();
}
}
reader.Close();
fs.Close();
try
{
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
conn.Close();
}
catch
{
MessageBox.Show("连接失败");
config config = new config();
config.ShowDialog();
}
}

登陆窗口(文件写)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace test1
{
public partial class config : Form
{
public config()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
string path = @"C:\Program Files\manager\manager.conf";
string uid = textBox1.Text.Trim();
string pwd = textBox2.Text.Trim();
string initial = textBox3.Text.Trim();
string source = textBox4.Text.Trim();
string connectionString = "uid=" + uid + ";pwd=" + pwd + ";initial catalog=" + initial + ";data source=" + source + ";Timeout = 900;";
Console.WriteLine(connectionString);
try
{
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
conn.Close();
}
catch
{
MessageBox.Show("连接失败,请检查输入");
}
FileStream fs = null;
BinaryWriter writer = null;
try
{
fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
writer = new BinaryWriter(fs);
writer.BaseStream.Seek(0, SeekOrigin.Begin);
writer.Write(connectionString);
}
catch (Exception ex)
{
MessageBox.Show("文件保存出错" + ex.Message);
}
writer.Close();
fs.Close();
Login.connectionString = connectionString;
Close();
}
}
}