Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EXECUTE sp_executesql@SQL Linq返回VOID_Linq_Stored Procedures_Void - Fatal编程技术网

EXECUTE sp_executesql@SQL Linq返回VOID

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,然

我尝试过谷歌搜索,但没有成功,唯一的问题不是没有找到解决方案:

SP

林克

将SP拖到DBML中时,我收到以下消息:无法检测到以下存储过程的返回类型。为每个存储过程设置返回类型

提前感谢您的帮助


Clare:-)

如果您正在使用DBML并在MS SQL Studio中手动创建s/p。 请执行以下操作

  • 从数据库中删除存储过程,然后重新创建它
  • 在MS SQL Studio中使用新创建的存储过程运行测试,确保返回数据
  • 从DBML设计器中删除s/p,保存它,重新编译,重新启动Visual Studio,然后再次添加它
  • 如果遇到问题,请张贴屏幕截图和dbml文件以查看

  • 如果您正在使用DBML并在MS SQL Studio中手动创建s/p。 请执行以下操作

  • 从数据库中删除存储过程,然后重新创建它
  • 在MS SQL Studio中使用新创建的存储过程运行测试,确保返回数据
  • 从DBML设计器中删除s/p,保存它,重新编译,重新启动Visual Studio,然后再次添加它
  • 如果遇到问题,请张贴屏幕截图和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,因为它比设计器更能检测存储的过程返回类型

    这里的问题似乎是这样一个事实:如果传入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的方法。
    看一看linq中的动态SQL。一旦设置了扩展方法,这将是一个更简洁的解决方案。

    如果在存储过程中使用动态SQL,那么当visual studio创建linq对象时,它无法判断响应的类型。(Linq只喜欢在强类型环境中工作) 您可以尝试在VisualStudio中手动更改它,这是错误消息告诉您要执行的操作

    • 在VisualStudio中,将DBML文件打开到designer视图中,并按正常方式添加SP
    • 确定错误消息,然后从设计器中的列表中选择SP的名称。右键单击并点击属性
    • 在“属性”对话框中,您可以找到一个可以手动设置的“返回类型”。尝试一下,看看你能从中得到什么
    然而,我不推荐它。首先,如果删除并重新创建linq对象,您必须再次执行此操作,其次,它可能仍然无法满足您的需要。 我建议您回到绘图板,想出一种避免动态SQL的方法。
    看一看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