C#在存储过程中使用动态参数
我正在为SQL Server创建一个存储过程,以便从C#应用程序调用。存储过程包含一些动态创建的SQL,它接收一个参数以执行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
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)
为什么不使用标准参数?为什么不使用标准参数?