sql命令占用了很多空间

时间:2014-12-09 07:57:29

标签: sql asp.net space

大家好我是用asp.net构建一个web应用程序并使用sql(MS SQL server 2000),现在接近完成后我发现我的代码的sql部分占用了大量的空间...而且我是想知道有哪些方法可以让它更容易维护?甚至可能改成其他语言? 这是我的sql代码构建方式的一个简单示例(我的代码中有一些更长的命令但是它们以这种方式构建):

Dim connectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ToString()    

Dim query As String = "SELECT  workerName FROM [poWorker] WHERE ( companyId = @companyId ) AND (workerId=@workerId) "
        Using con As New SqlConnection(connectionString)
          con.Open()
          Using da As New SqlDataAdapter()
            Using command As New SqlCommand(query, con)
                 command.Parameters.Add(New SqlParameter("@workerId", Session("userId")))
                 command.Parameters.Add(New SqlParameter("@companyId", Session("companyId")))
                 Dim ds As New DataSet()
                 da.SelectCommand = command
                 da.Fill(ds, "test")
                 If ds.Tables(0).Rows.Count = 1 Then
                      managerName = ds.Tables(0).Rows(0)(0).ToString()
                 End If
            End Using
          End Using
          con.Close()
       End Using

这占用了很多空间,我用这种方式编写了很多sql。我确信有一些解决方案可以让它更容易维护,可能使用更新的技术?也许如果我能找到一种方法从1-2个函数调用所有sql命令,但到目前为止我没有做这样的事情,因为它们之间存在很大差异。

3 个答案:

答案 0 :(得分:1)

从代码访问数据库的现代方法是使用ORM。 Microsoft为.NET Framework提供的是Entity Framework。这允许您编写如下的查询:

Dim worker as Worker = 
     dbContext.Workers
              .Where(Function (w) (w.companyId = Session("companyId") and
                     w.workerId = Session("userId")))
              .SingleOrDefault()

If worker IsNot Nothing Then
   managerName = worker.workerName
End If

与将SQL字符串拼接在一起相比,此方法还为动态查询提供了更强大的方法。例如,您可以动态交换Where子句,OrderBy子句等,并且仍然具有完全类型安全的代码。

实体框架没有内置的SQL Server 2000支持,但显然有一个workaround

答案 1 :(得分:1)

在您给出的示例中,您可以使用ExecuteScalar简化代码 - 因为您只返回单个值。例如:

Dim query As String = "SELECT  workerName FROM [poWorker] WHERE ( companyId = @companyId ) AND (workerId=@workerId) "
Using con As New SqlConnection(connectionString)
    con.Open()
    Using command As New SqlCommand(query, con)
        command.Parameters.Add(New SqlParameter("@workerId", Session("userId")))
        command.Parameters.Add(New SqlParameter("@companyId", Session("companyId")))
        managerName = command.ExecuteScalar().ToString();
    End Using
con.Close()
End Using

答案 2 :(得分:0)

现代的方法是不直接使用SQL,而是使用实体框架等OR-Mapper,它允许您使用Linq进行查询。

您在上面显示的查询会缩短为更短的内容:

using(new context = MyAppDbContext())
{
  var workerId = Session["userId"];
  var companyId = Session["companyId"];
  managerName = context.PoWorker
    .Single(w => w.companyId == companyId && w.workerId == workerId)
    .workerName;
}

很抱歉使用C#语法,但我希望你能弄明白这个意图。