大家好我是用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命令,但到目前为止我没有做这样的事情,因为它们之间存在很大差异。
答案 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#语法,但我希望你能弄明白这个意图。