下面是我用来构建这两个项目 ADBTest 和 DBControl 的步骤。
ADBTest 是首先构建的,它实现了
SQLite DB CRUD
功能我用 NuGet 添加了 System.Data.SQLite。public class DBControl : UserControl
{
public static string dbName = "APeople.db";
// Class1
private void UserControl_Load(object sender, EventArgs e)
{
makeDB();
makeFriendsTable();
}
private void makeDB()
{
throw new NotImplementedException();
}
private void makeFriendsTable()
{
throw new NotImplementedException();
}
public class MakeDB
{
public void makeDB()
{
using (SQLiteConnection conn = new SQLiteConnection($"Data Source = '{dbName}';Version=3;"))
if (!File.Exists(dbName))
{
try
{
conn.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
这是frmStart Call
private void btnCreateDB_Click(object sender, System.EventArgs e)
{
Hide();
using (var form = new DBControl.DBControl())
Show();
//DBControl dB = new DBControl();
//dB.Show();
}
两个项目在Visual Studio中加入后放入SQLite后的怪异部分
首先 NuGet 坚持将它们安装在两个项目中
然后创建了数据库和表,但我在解决方案资源管理器中找不到数据库
去 C 驱动器上的源文件夹中查找它在 DBCall 调试文件夹中
我认为这可能是一个设计问题。并不像看起来那么简单,即使使用正确的设计也会带来一些问题,所以这个问题对我来说很有用。
常见的工作是分层工作,一层是接口,一层是逻辑,一层是数据句柄……这就是三层模型。有几种设计可以工作,但这是常见的。
处理数据的层通常称为
Data Layer
(DAL),在微服务或 SQL 服务器中通常称为 Data Service
(DAS)
题目确实很大,不好解释,但你可以参考下图。当然你可以从很多不同的角度来看待这个模型,但你会发现相同的原理:
我从您的案例中了解到,您有一个
DBControl
来处理数据工作。因此,这是对数据库和 SQLite.dll 的引用。顺便说一下,您可以使用 Entity Framework 来处理 SQLite 并为存档制作脚手架。
在任何情况下,此 DBControl 将携带“存储库”以及您调用数据库的方法,即 ADO 或 EF。这是
Persistance
,也可以处理Domain Model
这些方法不会返回 EF 或 DB 模型,而是返回您自己的模型,这些模型将在您的“业务逻辑”中提供帮助和工作。这些是 DBControl 将为其他库或应用程序运行的接口层
export
的类、对象、模型等。
因为
DBControl
将返回您自己的模型,界面不需要 SQLite 参考,但需要 DBControl
参考才能获得您在那里工作的模型
图片是设计遵循,但不是规则。您可以在同一个项目中拥有所有层,每个层都是一个 .cs 文件,或者在同一个文件中,每个层都是一个方法,诀窍在于组织。也许你没有所有的层,这取决于你的设计。
如果您需要此答案的更多详细信息,请发表评论,我很乐意为您提供帮助
首先我必须创建第一个 C# .net 框架项目
然后我创建了类库项目来处理 SQLite 数据库的 CRUD 工作。
然后我将类库附加到第一个项目
然后我使用 NuGet 将系统数据 SQLite 添加到两个项目中。
这似乎违反直觉,但它确实有效。
好的,如何将整数 ID 传递到类库中,我在 SO 人身上找到的大部分代码我们将变量从 CL 传递出去,而不是传递给它。
这是我用来传入 udID 并将其分配给局部变量 newData 的小方法,我可以使用它对类库中的数据库进行 SQL 调用
public void UTBW(int udID)
{
newData = udID;
return;
}
这里是CL中使用newData的代码
public void readUDV()
{
using (SQLiteConnection conn = new SQLiteConnection($"Data Source = '{dbName}';Version=3;"))
{
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand($"SELECT * FROM FriendsData WHERE FID = " + newData , conn))
{
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
fn = rdr["fxFirstName"].ToString().Trim();
ln = rdr["fxLastName"].ToString().Trim();
rt = rdr["fxInfo"].ToString().Trim();
}
}
}
}
}
我面临的另一个问题是如何填充不在类库中的数据网格视图进入阶段离开了可信赖的通用列表。这是填充类库中列表的代码。
public List<object> readData(List<object> list)
{
using (SQLiteConnection conn = new SQLiteConnection($"Data Source = '{dbName}';Version=3;"))
{
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand($"SELECT * FROM FriendsData", conn))
{
using (var rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
gv_parentInt = rdr["FID"].ToString().Trim();
list.Add(gv_parentInt);
gv_firstName = rdr["fxFirstName"].ToString().Trim();
list.Add(gv_firstName);
gv_lastName = rdr["fxLastName"].ToString().Trim();
list.Add(gv_lastName);
}
}
}
}
return list;
}
很好,它将列表返回到需要用列表数据填充 DataGridView 的第一个项目中的表单。
public void loadDGV()
{
frmHDB form = new frmHDB();
{
form.readData(list);
foreach (string str in list)
{
dgvPerson.Rows.Add(list[i], list[i + 1], list[i + 2]);
i = i + 3;
dgvPerson.Sort(dgvPerson.Columns[2], ListSortDirection.Ascending);
}
}
}
我不太确定我的计数器 i = i + 3 它有效
不要忘记您需要将类库 dll 添加到第一个项目。
至于可移植性和类库的不是那么多
我试图将此 CL 附加到另一个项目,并更改了 CL 中的数据库名称。回到我原来的两个项目,什么它退出工作是的,数据库的名称被设置为新的项目数据库名称。两个小时后,我发现了错误的原因。
只需创建一个新的类库,它们不像宣传的那样可移植。