EXECUTE sp_executesql@SQL Linq返回VOID
我尝试过谷歌搜索,但没有成功,唯一的问题不是没有找到解决方案: SP 林克 将SP拖到DBML中时,我收到以下消息:无法检测到以下存储过程的返回类型。为每个存储过程设置返回类型 提前感谢您的帮助EXECUTE sp_executesql@SQL Linq返回VOID,linq,stored-procedures,void,Linq,Stored Procedures,Void,我尝试过谷歌搜索,但没有成功,唯一的问题不是没有找到解决方案: SP 林克 将SP拖到DBML中时,我收到以下消息:无法检测到以下存储过程的返回类型。为每个存储过程设置返回类型 提前感谢您的帮助 Clare:-)如果您正在使用DBML并在MS SQL Studio中手动创建s/p。 请执行以下操作 从数据库中删除存储过程,然后重新创建它 在MS SQL Studio中使用新创建的存储过程运行测试,确保返回数据 从DBML设计器中删除s/p,保存它,重新编译,重新启动Visual Studio,然
Clare:-)如果您正在使用DBML并在MS SQL Studio中手动创建s/p。 请执行以下操作
如果您正在使用DBML并在MS SQL Studio中手动创建s/p。 请执行以下操作
这里的问题似乎是这样一个事实:如果传入CustomerName对象,则在存储过程中生成的SQL将无效(并受SQL注入的约束): CustomerForename永远不会像“%+@CustomerName+%”。您没有将参数传递到sp_executeSQL调用中。相反,在CustomerName参数前面加上%通配符,然后按如下所示添加第二个where子句:
IF @CustomerName IS NOT NULL
SET @SQL = @SQL + ' AND (CustomerForename LIKE @CustomerName OR CustomerSurname LIKE @CustomerName)'
然后调用sp_ExecuteSql,如下所示:
EXECUTE sp_executesql @SQL, N'@CustomerName NVarChar(150)', @CustomerName
现在,您实际上应该从proc中获得一个结果集。这可以解决存储过程无法确定返回类型的问题。如果没有,则需要在LINQtoSQL设计器(或DBML)中手动创建一个返回类型,然后将其显式设置为存储过程的返回类型。或者,您可以从数据库中拖动存储过程并将其放到新创建的类型上,以便直接通过设计器自动分配返回类型
您还可以尝试使用SqlMetal生成dbml,因为它比设计器更能检测存储的过程返回类型 这里的问题似乎是这样一个事实:如果传入CustomerName对象,则在存储过程中生成的SQL将无效(并受到SQL注入的影响): CustomerForename永远不会像“%+@CustomerName+%”。您没有将参数传递到sp_executeSQL调用中。相反,在CustomerName参数前面加上%通配符,然后按如下所示添加第二个where子句:
IF @CustomerName IS NOT NULL
SET @SQL = @SQL + ' AND (CustomerForename LIKE @CustomerName OR CustomerSurname LIKE @CustomerName)'
然后调用sp_ExecuteSql,如下所示:
EXECUTE sp_executesql @SQL, N'@CustomerName NVarChar(150)', @CustomerName
现在,您实际上应该从proc中获得一个结果集。这可以解决存储过程无法确定返回类型的问题。如果没有,则需要在LINQtoSQL设计器(或DBML)中手动创建一个返回类型,然后将其显式设置为存储过程的返回类型。或者,您可以从数据库中拖动存储过程并将其放到新创建的类型上,以便直接通过设计器自动分配返回类型
您还可以尝试使用SqlMetal生成dbml,因为它比设计器更能检测存储的过程返回类型 如果在存储过程中使用动态SQL,那么当visual studio创建linq对象时,它无法判断响应的类型。(Linq只喜欢在强类型环境中工作) 您可以尝试在VisualStudio中手动更改它,这是错误消息告诉您要执行的操作
- 在VisualStudio中,将DBML文件打开到designer视图中,并按正常方式添加SP
- 确定错误消息,然后从设计器中的列表中选择SP的名称。右键单击并点击属性
- 在“属性”对话框中,您可以找到一个可以手动设置的“返回类型”。尝试一下,看看你能从中得到什么
看一看linq中的动态SQL。一旦设置了扩展方法,这将是一个更简洁的解决方案。如果在存储过程中使用动态SQL,那么当visual studio创建linq对象时,它无法判断响应的类型。(Linq只喜欢在强类型环境中工作) 您可以尝试在VisualStudio中手动更改它,这是错误消息告诉您要执行的操作
- 在VisualStudio中,将DBML文件打开到designer视图中,并按正常方式添加SP
- 确定错误消息,然后从设计器中的列表中选择SP的名称。右键单击并点击属性
- 在“属性”对话框中,您可以找到一个可以手动设置的“返回类型”。尝试一下,看看你能从中得到什么
看一看linq中的动态SQL。一旦您设置了扩展方法,这将是一个更简洁的解决方案。我不知道这是否是一个输入错误,但您需要使用的是检查CustomerName变量是否为null。如果@CustomerName不是空的,我的下一个建议是避免使用C#关键字作为变量
IF @CustomerName IS NOT NULL
SET @SQL = @SQL + ' AND (CustomerForename LIKE @CustomerName OR CustomerSurname LIKE @CustomerName)'
EXECUTE sp_executesql @SQL, N'@CustomerName NVarChar(150)', @CustomerName