3

I am migrating an existing .NET 2.0, SQL Server codebase to a .NET 4.0, SQL Server 2008 environment.

The design pattern is that all app calls to the database go through a stored procedure. So there's a get[object name] stored procedure that needs to be created or altered for most select statements.

So the disadvantages of this architecture to me are already evident: inconvenience.

What are the advantages of this highly enforced stored procedure design? (now in .NET 4.0 as opposed to using an ORM).


AndroidL sending data to my chat server, getting truncated

I'm trying to make a simple chat server. It works fine on the iphone, but not all the chats are going through on the android.

My idear was to use the http protocol so I can use the standard sfkd on the iphone and android to talk to my server

I'm using the URLConnection connection class on the android. When I was tacing the code on my server, I noticed that I was getting the length of the post data sent in the header. I'm not setting any length value on the URLConnection class. I figured since I was not setting the size in the header that is why its not working. I could not find any info about this.

code that reads in haeder on my server

I have my server code and android code below,

public int ReadHeader()
     {
        // read in one line
         int PageId=0;

    //   try{
            request = new StringBuffer(1000);
            System.out.println("get connection reading in header \r");
            //InputStream in = new BufferedInputStream( connection.getInputStream() );
            StopFlag=false;

            String out;
            // the first line shouls have the page
            out=ReadLine();

            int p;
            p=out.lastIndexOf("stop");
            if (p!=-1)
                PageId=1;
            p=out.lastIndexOf("enter");
            if (p!=-1)
                PageId=2;
            p=out.lastIndexOf("add");
            if (p!=-1)
                PageId=3;
            p=out.lastIndexOf("exit");
            if (p!=-1)
                PageId=4;
            p=out.lastIndexOf("update");
            if (p!=-1)
                PageId=5;

            int MessageSize=0;
            do{
                out=ReadLine();

                // check for content size
                // GET SIZR OF DATA SENT

                if (out.contains("Length"))
                {
                    System.out.println("found length \r");
                    int pes=out.indexOf(' ');
                    String Length=out.substring(pes+1);
                    System.out.println("found size");
                    System.out.println(Length); 
                    //MessageSize=(int)Length;
                    MessageSize= Integer.parseInt( Length) ;
                                      //MessageSize=36;     
                }
            } while(out!="finish header" && out!="");

            System.out.println("finsih header \r"); 
            ClientMessage=ReadSize(MessageSize); 
            /*
         } catch(IOException ec)
            {
                System.out.println(ec.getMessage());    
            }
        */
       return PageId;
     }

// CODE ON ANDROID 
           String data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode( cGlobals.UserName, "UTF-8"); data += "&" + URLEncoder.encode("comment", "UTF-8") + "=" + URLEncoder.encode( s, "UTF-8");
                           cGlobals.Message=""; // THIS IS NOT TKING IN ANY INFO ABOUT THE LENGTH OF data                           URLConnection conn = url.openConnection();
                           // set timeouts to 5 seconds
           //              conn.setConnectTimeout(1000*5);
           //              conn.setReadTimeout(5*1000);
                           conn.setDoOutput(true);


                           OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());


                      wr.write(data);
                       wr.flush();
                       wr.close();
4

3 回答 3

6

实际上——与流行的看法相反——性能不再是存储过程的优势之一——不再是。正确编写的带有参数的“内联”SQL 查询同样快,由 SQL Server“编译”一次(在首次使用之前),并且与任何存储过程一样长时间地保留在 SQL Server 的过程缓存中。

但是存储过程确实有优势——我想提两个主要的:

  1. 保护用户免受基础表的影响。这也意味着:它是您安全系统中的另一层。您的数据库用户不需要访问这些表 - 因此他们也无法通过 Excel 或 Access 或其他一些工具访问这些表来对这些表造成任何影响。仅此一项就可以带来巨大的好处。

  2. 第二点是有一层存储过程可以给你的DBA一个优化的地方。作为开发人员,您只调用存储过程 - DBA 可以调整它们,微调它们,使它们运行得更快。只要参数列表和返回结果集保持不变 - 作为前端开发人员,您甚至不会注意到(至少不会以负面的方式!)

于 2012-10-19T20:31:07.147 回答
3

我对对象的 INSERT/UPDATE/DELETE 采用存储过程的方法,并在应用程序代码中执行 SELECT。优点:

  • 业务逻辑和数据清晰分离
  • 数据安全性更好,因为它是在数据库层控制的。
  • 在业务逻辑中执行 SELECT 是一种折衷方案,如果他们获得数据库登录凭据,任何人都可以读取表数据,但他们无法修改它(假设您正确设置对象级别权限(表只读)),但我不必为 where 条件的每个变体编写一个存储过程。
  • 当您编写自己的数据适配器与 ORM 时,更容易自定义数据操作
  • ORM 很好,但是 ORM 通常有很多开销,我喜欢我的应用程序为它们运行的​​机器创建尽可能少的工作的方法。另外,我确切地知道发生了什么,并且幕后发生的“魔术”更少

缺点:

  • 如果您不使用 ORM,您可以生成大量代码,这意味着需要维护更多。
  • 可以公平地说,编写自己的数据适配器是在重新发明轮子。更多的控制总是要付出代价的
于 2012-10-19T20:42:52.463 回答
-3

存储过程最大的好处是——执行时间。如果你有“繁重”的 SQL 查询,你应该使用 SP。

于 2012-10-19T20:26:02.227 回答