-1

我确定有人问过这个问题;但我找不到确切的上下文。这是新手还是不明智的方法?或者这是一种可以接受的方法。

我有一个正在处理的项目。我有这四个表:

  • 顾客
  • 地址
  • 地点
  • 登录

所以数据库是基本的,没什么太疯狂的。

但是我创建了一个Restful Service将我的客户端链接到我的服务器。执行我的 Crud 操作需要一个简单的Insert Command.

像:

 string sqlInsertStr = "INSERT INTO Customer (First, Last, Phone, Email) 
         VALUES (@first, @last, @phone, @email)";

这样就可以处理我的四张桌子之一;我的想法是这两种方法之一:

  1. 使用 aGeneric来存储每个单独的 Query;然后循环迭代每个查询。
  2. 使用Generic包含一系列的 aStored Procedures进行迭代。

我的目标是避免多次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允许我只包含一个字符串来处理所有带有正确数据的插入吗?还是我完全过度思考/困惑自己。我还在学习,所以解释会很棒。

4

1 回答 1

3

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

  1. 让它发挥作用 - 以任何必要的方式(甚至 {gasp} 复制和粘贴)
  2. 让它变得更好——重构、泛化等。
  3. 让它更快——首先分析和查看最慢的部分

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

说了这么多,不用担心泛型 - 创建四个存储库(每个表一个),然后分析并查看泛型是否可以更清洁。

评论你的更新

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

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

于 2013-01-30T22:23:58.820 回答