通过 Linq-to-SQL 调用存储过程时出现异常
当我的代码尝试执行 .dbml
文件中存在的存储过程时,我得到以下堆栈跟踪。
异常查找传输:System.Data.SqlClient.SqlException:
对象名称“t_wfe_user_role”无效。
在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔值breakConnection)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject 状态对象)
在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream, BulkCopySimpleResultSet BulkCopyHandler、TdsParserStateObject 状态对象)
在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
在 System.Data.SqlClient.SqlDataReader.get_MetaData()
在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串resetOptionsString)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、布尔值 异步)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、字符串 方法,DbAsyncResult 结果)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔值 returnStream、字符串 方法)
在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior行为,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)
在 System.Data.Common.DbCommand.ExecuteReader()
在 System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询、QueryInfo queryInfo、IObjectReaderFactory 工厂、对象 [] ParentArgs、对象 [] userArgs、ICompiledSubQuery[] 子查询、对象 最后结果)
在 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(表达式查询,QueryInfo[] queryInfos,IObjectReaderFactory 工厂,Object[] userArguments、ICompiledSubQuery[] 子查询)
在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式 查询)
在 System.Data.Linq.DataContext.ExecuteMethodCall(对象实例,MethodInfo methodInfo,Object[] 参数)
在 LinqDataClasses.DataClasses.WorkflowsDataContext.sp_wfe_transfer_task_force(Nullable1 p_d2_user_ref,可为空
1 p_d2_diary_ref,可为空1 p_state_ref, C:\Documents 中可空
1 p_transfer_ref) 和 设置\管理员\我的 文档\SPSM-Bidragshantering_Origo\SPSM\Main\CommonData\LinqDataClasses\DataClasses\Workflows.designer.cs:line 347
在 C:\Documents and Settings\Administrator\My 中的 SPSM.ContinueWorkflows.ContinueWFs(Int32[] 案例,字符串类型) 文档\SPSM-Bidragshantering_Origo\SPSM\Main\SIS\Applications\SIS-PreliminaryDecision\ContinueWorkflows.cs:line 67
我唯一的怀疑是,多元化本身已经发生了一些问题。数据库中没有名为 t_wfe_user_role
的表。它名为 t_wfe_user_roles
,但随后 Linq 在 .dbml
文件的 GUI 中将其重命名为 t_wfe_user_role
。该表是一个有两个外键的连接表。
有什么想法吗!?
这是我调用存储过程的代码片段。调用在最后(sp_wfe_transfer_task_force):
public class ContinueWorkflows
{
public AppVariables _APPVARS = new Utility.AppVariables();
public void ContinueWFs(int[] cases, string type)
{
foreach (int Case in cases)
{
if (Case != 0)
{
_APPVARS = (Utility.AppVariables)System.Web.HttpContext.Current.Session["CommonAppVariables"];
LinqDataClasses.DataClasses.WorkflowsDataContext wfdc = new LinqDataClasses.DataClasses.WorkflowsDataContext(_APPVARS.SQLConnectionString);
LinqDataClasses.DataClasses.t_wfe_workflow wf = wfdc.t_wfe_workflows.Where(p => p.c_d2_case_ref == Case && p.c_cancelled != true).FirstOrDefault();
if (wf != null)
{
LinqDataClasses.DataClasses.t_wfe_state state = wfdc.t_wfe_states.Where(p => p.c_workflow_ref == wf.c_rowid && p.c_cancelled != true).FirstOrDefault();
if (state != null)
{
LinqDataClasses.DataClasses.t_wfe_transfer transfer;
if (type == "Beslut")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Till beslut" && p.c_cancelled != true).FirstOrDefault();
if (transfer == null)
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång direkt till beslut" && p.c_cancelled != true).FirstOrDefault();
}
if (transfer == null)
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång till beslut" && p.c_cancelled != true).FirstOrDefault();
}
}else if (type == "BVS")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Stopp" && p.c_cancelled != true).FirstOrDefault();
}
else if (type == "TUFF")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Preliminärt besked" && p.c_cancelled != true).FirstOrDefault();
}
else // SIS Prel Besked
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång till preliminärt besked" && p.c_cancelled != true).FirstOrDefault();
}
if (transfer != null)
{
//Do transfer
int transref = transfer.c_rowid;
wfdc.sp_wfe_transfer_task_force(1, _APPVARS.DiaryRef, state.c_rowid, transref);
}
}
}
}
}
}
}
I get the following stack trace when my code tries to execute a store procedure that is present in the .dbml
file.
Exception finding transfer:System.Data.SqlClient.SqlException:
Invalid object name 't_wfe_user_role'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior
behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[]
parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object
lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[]
userArguments, ICompiledSubQuery[] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression
query)
at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
at LinqDataClasses.DataClasses.WorkflowsDataContext.sp_wfe_transfer_task_force(Nullable1
1 p_d2_diary_ref, Nullable
p_d2_user_ref, Nullable1 p_state_ref,
1 p_transfer_ref) in C:\Documents and
Nullable
Settings\Administrator\My
Documents\SPSM-Bidragshantering_Origo\SPSM\Main\CommonData\LinqDataClasses\DataClasses\Workflows.designer.cs:line
347
at SPSM.ContinueWorkflows.ContinueWFs(Int32[] cases, String type) in C:\Documents and Settings\Administrator\My
Documents\SPSM-Bidragshantering_Origo\SPSM\Main\SIS\Applications\SIS-PreliminaryDecision\ContinueWorkflows.cs:line
67
My only suspect is that pluralization has some how tripped itself. There are no table named t_wfe_user_role
in the DB. It is called t_wfe_user_roles
, but then Linq renames it t_wfe_user_role
in the GUI of the .dbml
file. This table is a connection table with two foreign keys.
Any ideas!?
This is a code snippet from where I call the store procedure. The call is at the end (sp_wfe_transfer_task_force):
public class ContinueWorkflows
{
public AppVariables _APPVARS = new Utility.AppVariables();
public void ContinueWFs(int[] cases, string type)
{
foreach (int Case in cases)
{
if (Case != 0)
{
_APPVARS = (Utility.AppVariables)System.Web.HttpContext.Current.Session["CommonAppVariables"];
LinqDataClasses.DataClasses.WorkflowsDataContext wfdc = new LinqDataClasses.DataClasses.WorkflowsDataContext(_APPVARS.SQLConnectionString);
LinqDataClasses.DataClasses.t_wfe_workflow wf = wfdc.t_wfe_workflows.Where(p => p.c_d2_case_ref == Case && p.c_cancelled != true).FirstOrDefault();
if (wf != null)
{
LinqDataClasses.DataClasses.t_wfe_state state = wfdc.t_wfe_states.Where(p => p.c_workflow_ref == wf.c_rowid && p.c_cancelled != true).FirstOrDefault();
if (state != null)
{
LinqDataClasses.DataClasses.t_wfe_transfer transfer;
if (type == "Beslut")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Till beslut" && p.c_cancelled != true).FirstOrDefault();
if (transfer == null)
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång direkt till beslut" && p.c_cancelled != true).FirstOrDefault();
}
if (transfer == null)
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång till beslut" && p.c_cancelled != true).FirstOrDefault();
}
}else if (type == "BVS")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Stopp" && p.c_cancelled != true).FirstOrDefault();
}
else if (type == "TUFF")
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Preliminärt besked" && p.c_cancelled != true).FirstOrDefault();
}
else // SIS Prel Besked
{
transfer = wfdc.t_wfe_transfers.Where(p => p.c_from_step_ref == state.c_step_ref && p.c_name == "Övergång till preliminärt besked" && p.c_cancelled != true).FirstOrDefault();
}
if (transfer != null)
{
//Do transfer
int transref = transfer.c_rowid;
wfdc.sp_wfe_transfer_task_force(1, _APPVARS.DiaryRef, state.c_rowid, transref);
}
}
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果重新生成数据模型没有问题,那么您可以关闭复数和生成类。
在视觉工作室
在“工具”菜单上,单击“选项”。
(注意:如果“数据库工具”节点不可见,请选择“显示所有设置”。)
否则
您可以通过右键单击 dbml 设计器窗口中的表并选择属性来更改生成的名称。有一个名为“名称”的字段,您应该能够使用它来定义自定义名称。
if there is no issue with re generating data model then you can turn off pluralization and the generate class .
in visual studio
On the Tools menu, click Options.
(Note:Select Show all settings if the Database Tools node is not visible.)
otherwise
You can change the generated name by right-clicking the table in the dbml designer window and selecting properties. There is a field called 'name' with which you should be able to define a custom name.