通用和数据库

时间:2013-01-30 22:11:20

标签: c# sql database generics stored-procedures

我确信这已被问过;但我找不到确切的背景。这会是一个新手或不明智的方法吗?或者这是一种可接受的方法。

我有一个我正在研究的项目。我有这四个表:

  • 客户
  • 地址
  • 网站
  • 登录

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

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

像:

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

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

  1. 使用Generic存储每个查询;然后循环迭代每个查询。
  2. 使用包含一系列Generic的{​​{1}}进行迭代。
  3. 我的目标是避免多个Stored 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. } Generic允许我只包含一个字符串来处理所有带有正确数据的插入?或者我完全过度思考/混淆自己。我还在学习,所以解释会很棒。

1 个答案:

答案 0 :(得分:3)

基于numerous questions这里有关它的工作原理,我建议不要试图通过泛化太多来聪明。我对任何问题的建议方法是:

  1. 让它工作 - 以任何必要的方式(甚至{喘气}复制和粘贴)
  2. 让它变得更好 - 重构,泛化等等。
  3. 让它更快 - 通过剖析并首先查看SLOWEST的作品
  4. 太多人尝试做2)和3)甚至工作并最终花费更多时间进行黑客攻击或微观优化只是为了让它发挥作用。如果你让它先工作,你总是可以抛弃你的优化并重新开始,你仍然有一个可用的产品!

    所有这一切,不要担心泛型 - 创建四个存储库(每个表一个),然后分析并查看Generics是否可以制作更清洁。

    评论您的更新

      我完全过度思考/混淆自己

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