- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常大的问题,似乎无法在互联网上找到任何其他人遇到我的问题。我当然希望 StackOverflow 可以帮助我...
我正在编写一个 ASP.NET MVC 应用程序,我正在使用带有 Linq To Sql 的存储库概念作为我的数据存储。关于从 View 中选择行,一切都很好。并捕获非常基本的业务规则约束。但是,我在删除、插入和更新的存储过程映射中遇到了问题。让我解释一下:
我们的 DBA 已投入大量工作将业务逻辑放入我们所有的存储过程中,这样我就不必担心这一点。当然,我进行基本验证,但他管理数据完整性和日期约束冲突等......我面临的问题是所有存储过程(我的意思是所有)都有 5 个附加参数(6 个用于插入) 向我提供信息。这个想法是,当出现问题时,我可以用我们数据库中的适当信息提示用户。
例如:
sp_AddCategory(
@userID INT,
@categoryName NVARCHAR(100),
@isActive BIT,
@errNumber INT OUTPUT,
@errMessage NVARCHAR(1000) OUTPUT,
@errDetailLogID INT OUTPUT,
@sqlErrNumber INT OUTPUT,
@sqlErrMessage NVARCHAR(1000) OUTPUT,
@newRowID INT OUTPUT)
从上面的存储过程中,前 3 个参数是唯一用于“创建”类别记录的参数。剩下的参数只是用来告诉我方法内部发生了什么。如果存储过程中的业务规则被破坏,当业务规则被破坏时,他不会使用 SQL 'RAISEERROR' 关键字。相反,他使用 OUTPUT 参数向我提供有关错误的信息。他对我们数据库中的每个存储过程都这样做,甚至是更新和删除。所有“获取”调用都是使用自定义 View 完成的。它们都经过了测试,目的是让我的工作更轻松,因为我不必添加业务逻辑来捕获所有各种场景以确保数据质量。
正如我所说,我正在使用 Linq To Sql,但我现在遇到了一个问题。问题是我的“Category”模型对象只有 4 个属性:CategoryID、CategoryName、UserId 和 IsActive。当我打开设计器开始为插入映射我的属性时,我意识到我真的没有(简单的)方法来考虑额外的参数,除非我将它们添加到我的模型对象中。
理论上我想做的是:
// note: Repository Methods
public void AddCategory(Category category)
{
_dbContext.Categories.InsertOnSubmit(category);
}
public void Save()
{
_dbContext.SubmitChanges();
}
然后在我的 CategoryController 类中,我只需执行以下操作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
var category = new Category();
try
{
UpdateModel(category); // simple validation here...
_repository.AddCategory(category);
_repository.Save(); // should get error here!!
return RedirectToAction("Index");
}
catch
{
// manage friendly messages here somehow... (??)
// ...
return View(category);
}
}
使用 Linq to Sql 管理此问题的最佳方法是什么?我(个人)认为将所有这些附加属性添加到每个模型对象是没有意义的......例如,'Get' 应该永远不会有错误并且我不希望我的存储库方法返回一个Get 调用的对象类型,但 CUD 调用接受另一种对象类型。
这是我为解决问题所做的工作。我摆脱了我所有存储库上的“Save()”方法。相反,我向每个存储库添加了一个“Update()”方法,并在每次 CUD(即创建/更新/删除)调用时实际将数据提交到数据库。
我知道每个存储过程都有相同的参数,所以我创建了一个类来保存它们:
public class MySprocArgs
{
private readonly string _methodName;
public int? Number;
public string Message;
public int? ErrorLogId;
public int? SqlErrorNumber;
public string SqlErrorMessage;
public int? NewRowId;
public MySprocArgs(string methodName)
{
if (string.IsNullOrEmpty(methodName))
throw new ArgumentNullException("methodName");
_methodName = methodName;
}
public string MethodName
{
get { return _methodName; }
}
}
我还创建了一个 MySprocException,它在其构造函数中接受 MySprocArgs:
public class MySprocException : ApplicationException
{
private readonly MySprocArgs _args;
public MySprocException(MySprocArgs args) : base(args.Message)
{
_args = args;
}
public int? ErrorNumber
{
get { return _args.Number; }
}
public string ErrorMessage
{
get { return _args.Message; }
}
public int? ErrorLogId
{
get { return _args.ErrorLogId; }
}
public int? SqlErrorNumber
{
get { return _args.SqlErrorNumber; }
}
public string SqlErrorMessage
{
get { return _args.SqlErrorMessage; }
}
}
现在这就是一切汇集的地方......使用我在最初查询中开始的示例,“AddCategory()”方法可能如下所示:
public void AddCategory(Category category)
{
var args = new MySprocArgs("AddCategory");
var result = _dbContext.AddWidgetSproc(
category.CreatedByUserId,
category.Name,
category.IsActive,
ref args.Number, // <-- Notice use of 'args'
ref args.Message,
ref args.ErrorLogId,
ref args.SqlErrorNumber,
ref args.SqlErrorMessage,
ref args.NewRowId);
if (result == -1)
throw new MySprocException(args);
}
现在在我的 Controller 中,我只需执行以下操作:
[HandleError(ExceptionType = typeof(MySprocException), View = "SprocError")]
public class MyController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Category category)
{
if (!ModelState.IsValid)
{
// manage friendly messages
return View(category);
}
_repository.AddCategory(category);
return RedirectToAction("Index");
}
}
管理新的 MySprocException
的诀窍是简单地使用 HandleError 属性捕获它,并将用户重定向到理解 MySprocException 的页面。
希望对大家有所帮助。 :)
最佳答案
我认为您不能将输出参数添加到任何 LINQ 类,因为这些参数不会保留在数据库的任何表中。
但是您可以通过以下方式在 LINQ 中处理输出参数。
使用设计器将您希望调用的存储过程添加到您的 .dbml。
在你的代码中调用你的存储过程
using (YourDataContext context = new YourDataContext())
{
Nullable<int> errNumber = null;
String errMessage = null;
Nullable<int> errDetailLogID = null;
Nullable<int> sqlErrNumber = null;
String sqlErrMessage = null;
Nullable<int> newRowID = null;
Nullable<int> userID = 23;
Nullable<bool> isActive=true;
context.YourAddStoredProcedure(userID, "New Category", isActive, ref errNumber, ref errMessage, ref errDetailLogID, ref sqlErrNumber, ref sqlErrMessage, ref newRowID);
}
关于asp.net-mvc - 将存储过程与具有附加参数的 Linq To Sql 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1423179/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!