通用和数据库
本文关键字:数据库 | 更新日期: 2023-09-27 17:56:57
我敢肯定有人问过这个问题;但我找不到确切的背景。 这是一种新手或不明智的方法吗? 或者这是一种可以接受的方法。
我有一个项目正在做。 我有这四个表:
- 客户
- 地址
- 网站
- 登录
所以数据库是基本的,没有什么太疯狂的。
但是我已经创建了一个Restful Service
将我的客户端链接到我的服务器。 执行我的 Crud 操作需要一个简单的Insert Command
.
喜欢:
string sqlInsertStr = "INSERT INTO Customer (First, Last, Phone, Email)
VALUES (@first, @last, @phone, @email)";
所以这将处理我的四个表中的一个;我的想法是这两种方法之一:
- 使用
Generic
存储每个单独的查询;然后循环循环访问每个查询。 - 使用包含一系列要循环访问的
Stored Procedures
Generic
。
我的目标是避免循环访问和写入数据库的多个strings
。
我的推理是,当客户端修改单个字段或整个配置文件时;它将全等处理所有表。 SQL
我知道在尝试跨多个表插入数据时它有局限性。
这是一个糟糕的方法吗;这个特别是相当小和简单的。 所以我不想发疯;但它是为了学校。 所以我试图了解我是否提出了一个有效的解决方案,如果我是,它被认为是正确的解决方案吗?
对此事的任何投入和解释都将很棒。
更新:
对于混乱,我深表歉意;是的,我有一个对象模型 - 它包含每个表的每一列的所有信息。 我的问题是这样的:
SQL
不喜欢跨多个表Inserting
。 所以这适用于一个表:
using (connection)
{
string sqlInsertStr = "INSERT INTO Customer (First, Last, Phone, Email)
VALUES (@first, @last, @phone, @email)";
connection = new SqlConnection(connectionStr);
command = new SqlCommand();
command.Connection = connection;
command.Connection.Open();
command.CommandText = sqlInsertStr;
SqlParameter firstParam = new SqlParameter(@"first", cust.First);
SqlParameter lastParam = new SqlParameter(@"last", cust.Last);
SqlParameter phoneParam = new SqlParameter(@"phone", cust.Phone);
SqlParameter emailParam = new SqlParameter(@"email", cust.Email);
command.Parameters.AddRange(new SqlParameter[]
{ firstParam, lastParam, phoneParam, emailParam});
command.ExecuteNonQuery();
command.Connection.Close();
}
这将很容易写入一个表;但是需要插入到其他表的所有其他数据呢? 我是否需要为每个表创建一个sqlInsertStr
? 或者我不能简单地做这样的事情:
using(connection)
{
list<string> sqlInsertStr = new list<string>();
sqlInsertStr.Add("INSERT INTO Customer (First, Last, Phone, Email)
VALUES (@first, @last, @phone, @email)"l
sqlInsertStr.Add("INSERT INTO Address (Street, City, State, Zip, Country)
VALUES (@Street, @City, @State, @Zip, @Country)";
connection = new SqlConnection(connectionStr);
command = new SqlCommand();
command.Connection = connection;
command.CommandText = sqlInsertStr;
// Repeat with Parameters and etc.
}
那么,本质上使用Generic
或StringBuilder
不允许我只包含一个字符串来处理具有正确数据的所有这些插入吗? 还是我完全过度思考/混淆了自己。 我还在学习,所以解释会很棒。
基于这里关于使其工作的众多问题,我建议不要试图通过泛型太多来变得聪明。 对于任何问题,我推荐的方法是:
- 让它工作 - 通过任何必要的手段(甚至{喘息}复制和粘贴)
- 让它变得更好 - 重构、泛型等。
- 使其更快 - 首先通过分析和查看最慢的部分
太多人试图在它工作之前做 2) 和 3),最终花费更多时间进行黑客攻击或微优化只是为了让它工作。 如果你先让它工作,你总是可以扔掉你的优化并重新开始,你仍然有一个工作产品!
总而言之,不要担心泛型 - 创建四个存储库(每个表一个),然后分析并查看泛型是否可以更干净。
评论您的更新
我是否完全过度思考/困惑自己
听起来像。 不要试图让一个类处理所有类型的 CRUD 操作,只是为了避免在多个位置使用相同的连接/命令代码。 每个存储库(我松散地使用该术语,意思是处理 CRUD 操作的某个类)都应该有自己的连接/命令代码。 如果以后你决定可以创建一个处理垃圾工作的基类,那很好 - 或者你可以使用ORM层,如实体框架或NHibernate来处理它。 或者你可以有一个混合物。 在你让它工作后,无论什么效果最好。:)