MySQL 数据访问层:您如何存储查询?
Posted
技术标签:
【中文标题】MySQL 数据访问层:您如何存储查询?【英文标题】:MySQL Data Access Layer: How do you store your queries? 【发布时间】:2012-05-30 17:24:44 【问题描述】:我作为独立开发者构建这个项目已经有一段时间了,虽然我在前端和中间层很自在,但我并不认为我正在按照我应该的方式来做数据库,原因是因为我根本不知道任何其他方式。我目前获取数据的方式是在我的 mysql 工作台中测试查询,并将 SQL 作为字符串文字复制并粘贴到一个方法中,该方法调用数据库、提取数据并混合我的对象。
直到最近,当我不得不创建一个查询的怪物时,这才真正成为问题,这让我想到也许有更好的方法来做到这一点。我没有分离出正式的 DAL,所以我知道那里还有改进的空间,但我很好奇存储 SQL 字符串的正确方法是什么。我假设在 VS10 中内置了一个工具,我可以在其中将 SQL 作为 SQL 而不是作为字符串来操作和使用。
【问题讨论】:
听起来是 MyBatis 的好案例:mybatis.org/dotnet.html visual studio 有一个可能有用的实体框架,但它增加了很大的 ORM 复杂性。 我只是在寻找一个放置文件的地方,可能扩展名为.sql
,并且能够以某种方式在代码中引用它们。那可能吗?也许我什至可以传入可以引用其属性和方法的对象?
【参考方案1】:
您应该在存储过程中执行此操作。这将基本上格式化和存储您的查询。您设置从代码传入的参数,然后读出结果。
例子:
C#方法:
private void SetNote()
const string sql = "sp_SelectControllerNoteByID";
using (var conn = MocSystem.GetMocDbConnection())
using (var comm = new SqlCommand(sql, conn))
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@ControllerNoteID", ControllerNoteId));
try
conn.Open();
using (var rdr = comm.ExecuteReader())
while (rdr.Read())
CommentText = rdr["NoteText"].ToString();
_commentor = new User(new Guid(rdr["NoteAuthor"].ToString()));
CommentDate = (DateTime)rdr["NoteDate"];
MocRequestId = (int)rdr["MocRequestID"];
catch (Exception ex)
HasError = true;
ErrorMessage += "\nThere was a problem building the note: " + ex.Message;
DBMS(本例中为sql server)上的存储过程:
ALTER proc [dbo].[sp_SelectControllerNoteByID]
@ControllerNoteID int
AS
SELECT
ControllerNoteID,
NoteText,
NoteDate,
NoteAuthor,
MocRequestID
FROM
ControllerNotes
WHERE
ControllerNoteID = @ControllerNoteID
所以这里我们调用存储过程,在这种情况下它只是一个简单的选择语句,然后我们通过 ADO 将它读入一个对象。现在,通过这种方式,您可以修改查询而无需重新编译。除非您添加参数,否则您还必须在代码中更新这些参数。
【讨论】:
以上是关于MySQL 数据访问层:您如何存储查询?的主要内容,如果未能解决你的问题,请参考以下文章