y_0017.gif仍然是沟通窗体与数据库桥梁的一种表现形式。以前做的都是一次性添加一条记录,这次需要的是一次性将所有记录都加进去,刚拿到手觉得真的很困难,明明知道是坑,也还会往进跳,没办法啊。后来经过不断查资料,了解写出来个大概。要实现这个过程需要四大模块:

⑴实体类。个中包括文件的属性字段,也就是数据库中对应的表的列名,和这些字段的属性。这个类主要用来剥离应用程序和数据库之间的关系,有了这个实体类,就可以各自进行各自的操作,互不影响。

DBHlper类。这是一个通用数据库访问类,是一个功能类,一个数据库操作类,里面通常包含的是连接数据库的方法。在项目过程中,只要我们有这个类,并且调用这个类里的方法就可以想实现数据库访问这个功能。但是并不包含具体的数据操作方式,只是说拥有这个类就架起了程序与数据库的桥梁,这个DBHelper类仅仅负责将特定的SQL语句丢进数据库。

⑶数据访问类。这是一个特定实体类的数据访问类,专门指定要对数据库进行具体的操作的一个类,主要是发布SQL语句,将SQL语句丢给DBHelper类,然后再经过这个‘帮助’类丢进数据库从而对数据库库进行一系列操作,诸如插入,删除,更新等等

⑷表示层类。用来向用户展示数据,也就是Windows界面。这个比较容易,比较不容易的是上面几个类。

下面做的就是一个目录的所有子文件和所有子目录包含的孙子文件的几个属性一次性都插入到数据库中的一张特定的表里。看看代码:

实体类比较容易就不写了。看看另外两个特殊的类:

j_0057.gif通用数据访问类:

public class DBhelper
{
//连接字符串。表示内容是要连接的数据库和连接所需要的内容
public string connString = @"server=(local);database=AllFilesDB;uid=sa;pwd=514420;";
/// <summary>
/// 采取自动打开的方式得到一张数据表
/// </summary>
/// <param name="sql"></param>
/// <param name="ps"></param>
/// <returns>DataTable dt</returns>
public DataTable getTable(string sql, SqlParameter[] ps)
{
SqlConnection connection = new SqlConnection(connString);
SqlCommand command = connection.CreateCommand();
command.CommandText = sql;
command.Parameters.AddRange(ps);
//在连接好数据库并且将参数传进去后,利用DataTable类填充数据表
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(command);
sda.Fill(dt);
return dt;
}
}

j_0057.gif数据访问类:

public class FileService
{
//向数据库中添加数据
public void AddFileInfos(CardFile cf)
{
//具体要对数据库进行的操作(插入)
string sql = "Insert into AllFiles(fileName, fileDirectory, IsDirectory) values(@fileName, @fileDirectory, @IsDirectory)";
SqlParameter[] ps = new SqlParameter[]
{
new SqlParameter("@fileName",cf.FileName),
new SqlParameter("@fileDirectory",cf.FileDirectory),
new SqlParameter("@IsDirectory",cf.IsDirectory1),
};
//DBhelper里面的方法都不是被声明为类方法,是对象方法,所以西药创建对象才能调用其中的方法
DBhelper db = new DBhelper();
db.getTable(sql, ps);
}
}

j_0057.gif表示层类:

public partial class Form1 : Form
{
public Form1()
{//初始化
InitializeComponent();
}
private void btnBrowers_Click(object sender, EventArgs e)
{
//提示用户选择文件夹的路径的对话框
FolderBrowserDialog obd = new FolderBrowserDialog();
//显示对话框后结果有两个(确定和取消)
DialogResult dr= obd.ShowDialog();
//如果返回的是取消,那么一定意味着用户点了取消按钮
if (dr==DialogResult.Cancel)
{
return;
}
//能走到这儿,一定是意味着用户点了确定按钮,那么久进一步选择路径
string path = obd.SelectedPath;
//将选择好的路径填进文本框
this.txtFilePath.Text = path;
}
/// <summary>
/// 显示文件属性的一个功能函数
/// </summary>
/// <param name="path"></param>
private static void ShowDirectoryInfo(string path)
{
FileService fs = new FileService();
DirectoryInfo di = new DirectoryInfo(path);
//得到根目录的所有子目录(多个子目录构成一个集合)
DirectoryInfo[] dis = di.GetDirectories();
//得到根目录的所有子文件(多个子文件构成一个集合)
FileInfo[] fis = di.GetFiles();
foreach (DirectoryInfo temp in dis)
{//将目录的属性的值作为一个CardFile对象添加到数据库中
CardFile cf = new CardFile();
//将该目录的名字赋给对象的名字属性
cf.FileName = temp.Name;
cf.FileDirectory = temp.Parent.Name;
cf.IsDirectory1 = true;
ShowDirectoryInfo(temp.FullName);
fs.AddFileInfos(cf);
}
foreach (FileInfo temp in fis)
{//将文件的属性的值作为一个CardFile对象添加到数据库中
CardFile cf = new CardFile();
//将该文件的名字赋给对象的名字属性
cf.FileName = temp.Name;
cf.FileDirectory = temp.Directory.Name;
cf.IsDirectory1 = false;
fs.AddFileInfos(cf);
}
}
//设置‘添加’按钮的功能
private void btnAdd_Click(object sender, EventArgs e)
{
string path = this.txtFilePath.Text;
ShowDirectoryInfo(path);
}
}
}

最后就是要做一个符合要求的简单的窗口了。这个比较容易。

211059816.png

后续不断的努力,后续不断的进步,我在成长。。

j_0047.gifAjax的姑娘,加油!j_0047.gif