我作为独立开发人员构建这个项目已经有一段时间了,虽然我在前端和中间层很舒服,但我真的不认为我正在按照我应该的方式做数据库,原因是因为我根本不知道任何其他方式。我目前获取数据的方式是在我的 MySQL 工作台中测试查询,并将 SQL 作为字符串文字复制并粘贴到调用数据库的方法中,提取数据并混合我的对象。
直到最近,这才真正成为问题,当时我不得不创建一个查询的怪物,这让我想到也许有更好的方法来做到这一点。我没有分离出正式的 DAL,所以我知道那里还有改进的余地,但我很好奇存储 SQL 字符串的正确方法是什么。我假设 VS10 中内置了一个工具,我可以在其中将 SQL 作为 SQL 而不是字符串来操作和使用。
最佳答案
您应该在存储过程中执行此操作。这基本上会格式化并存储您的查询。您设置从您的代码传入的参数,然后读出结果。
例子:
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 将它读出到一个对象中。现在,通过这种方式,您无需重新编译即可修改查询。除非您添加参数,否则您还必须更新代码中的参数。
关于asp.net - MySQL 数据访问层 : How do you store your queries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10732211/