Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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
C#在存储过程中使用动态参数_C#_Sql Server_Stored Procedures_Dynamic - Fatal编程技术网

C#在存储过程中使用动态参数

C#在存储过程中使用动态参数,c#,sql-server,stored-procedures,dynamic,C#,Sql Server,Stored Procedures,Dynamic,我正在为SQL Server创建一个存储过程,以便从C#应用程序调用。存储过程包含一些动态创建的SQL,它接收一个参数以执行sp_executesql,但当我从我的C#app运行它时,我无法得到结果 当我从SQLServerManagementStudio调用该过程时,我得到了所有结果 例如:我得到我的桌子产品 id | Descrip 1 Pen 2 Pencil 3 Table 我创建我的存储过程 CREATE PROCEDURE [dbo].[proc_getprodu

我正在为SQL Server创建一个存储过程,以便从C#应用程序调用。存储过程包含一些动态创建的SQL,它接收一个参数以执行
sp_executesql
,但当我从我的C#app运行它时,我无法得到结果

当我从SQLServerManagementStudio调用该过程时,我得到了所有结果

例如:我得到我的桌子产品

id | Descrip
1    Pen
2    Pencil
3    Table
我创建我的存储过程

CREATE PROCEDURE [dbo].[proc_getproductslist]
    @idProducts varchar(max)
AS
BEGIN

    DECLARE @SQL nvarchar(max)

    SET @SQL = 'SELECT * FROM Products WHERE id IN ('+@idProducts +')'

    EXEC sp_executesql @SQL
END
如果我在SSMS中执行:

EXECUTE proc_getproductslist '''1'',''2'''
这管用!但是从C#app上看,这不起作用

C#代码:

当我从C#应用程序调用存储过程时,它不会返回任何内容

请告诉我如何使这个工作

感谢您在C#code中使用
CommandType=CommandType的Select命令的参数名。StoredProcedure
必须与Sql代码中定义的参数名匹配。试一试

   cmd1.Parameters.Add("@idProducts", SqlDbType.VarChar).Value = "1,2";
在C#code参数中,使用
CommandType=CommandType.StoredProcess的Select命令的名称必须与Sql代码中定义的参数名称匹配。试一试

   cmd1.Parameters.Add("@idProducts", SqlDbType.VarChar).Value = "1,2";
在TSQL中,已转义“”。在C#中并非如此。第一个和最后一个'表示字符串文字。在C#中,“开始和结束字符串文字

所以

应该是

cmd1.Parameters.Add("@numguia", SqlDbType.VarChar).Value = "'1','2'";
或者因为它似乎是一个整数列表

cmd1.Parameters.Add("@numguia", SqlDbType.VarChar).Value = "1,2";
乙二醇

输出

null
success
在TSQL中“”是转义的。在C#中不是这样。第一个和最后一个“表示字符串文字。在C#中”开始和结束字符串文字

所以

应该是

cmd1.Parameters.Add("@numguia", SqlDbType.VarChar).Value = "'1','2'";
或者因为它似乎是一个整数列表

cmd1.Parameters.Add("@numguia", SqlDbType.VarChar).Value = "1,2";
乙二醇

输出

null
success

为什么不使用表值参数呢,这正是它们的设计初衷

首先创建您的类型:

CREATE TYPE dbo.ListOfInt AS TABLE (Value INT NOT NULL);
那么你的程序就这么简单了

CREATE PROCEDURE [dbo].[proc_getproductslist]  @idProducts dbo.ListOfInt READONLY
AS
BEGIN
    SELECT  * 
    FROM    Products 
    WHERE   id IN (SELECT Value FROM @idProducts);

END
不需要动态SQL。作为一个简短的旁白

最后,调用您的过程(为了简洁起见,删除try/catch)


为什么不使用表值参数呢,这正是它们的设计初衷

首先创建您的类型:

CREATE TYPE dbo.ListOfInt AS TABLE (Value INT NOT NULL);
那么你的程序就这么简单了

CREATE PROCEDURE [dbo].[proc_getproductslist]  @idProducts dbo.ListOfInt READONLY
AS
BEGIN
    SELECT  * 
    FROM    Products 
    WHERE   id IN (SELECT Value FROM @idProducts);

END
不需要动态SQL。作为一个简短的旁白

最后,调用您的过程(为了简洁起见,删除try/catch)


为什么不使用标准参数?为什么不使用标准参数?