通用和数据库

本文关键字:数据库 | 更新日期: 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)";

所以这将处理我的四个表中的一个;我的想法是这两种方法之一:

  1. 使用Generic存储每个单独的查询;然后循环循环访问每个查询。
  2. 使用包含一系列要循环访问的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.
}

那么,本质上使用GenericStringBuilder不允许我只包含一个字符串来处理具有正确数据的所有这些插入吗? 还是我完全过度思考/混淆了自己。 我还在学习,所以解释会很棒。

通用和数据库

基于这里关于使其工作的众多问题,我建议不要试图通过泛型太多来变得聪明。 对于任何问题,我推荐的方法是:

  1. 让它工作 - 通过任何必要的手段(甚至{喘息}复制和粘贴)
  2. 让它变得更好 - 重构、泛型等。
  3. 使其更快 - 首先通过分析和查看最慢的部分

太多人试图在它工作之前做 2) 和 3),最终花费更多时间进行黑客攻击或微优化只是为了让它工作。 如果你先让它工作,你总是可以扔掉你的优化并重新开始,你仍然有一个工作产品!

总而言之,不要担心泛型 - 创建四个存储库(每个表一个),然后分析并查看泛型是否可以更干净。

评论您的更新

我是否完全过度思考/困惑自己

听起来像。 不要试图让一个类处理所有类型的 CRUD 操作,只是为了避免在多个位置使用相同的连接/命令代码。 每个存储库(我松散地使用该术语,意思是处理 CRUD 操作的某个类)都应该有自己的连接/命令代码。 如果以后你决定可以创建一个处理垃圾工作的基类,那很好 - 或者你可以使用ORM层,如实体框架或NHibernate来处理它。 或者你可以有一个混合物。 在你让它工作后,无论什么效果最好。:)