Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
.net 在sql中强制转换多个整数值_.net_Sql_Parameters - Fatal编程技术网

.net 在sql中强制转换多个整数值

.net 在sql中强制转换多个整数值,.net,sql,parameters,.net,Sql,Parameters,我想将来自.net解决方案的多个变量转换为整数。 大概是这样的: 我使用IN关键字来选择多个关键字,因为我不知道客户选择了多少变量,我将它们放在nvarchar变量中 例如: 选择的状态ID:30,40,50 “30,40,50”将其作为sql nvarchar参数传递给sql server 我想把它们转换成整数,得到如下结果: IN(铸造(30,40,50为整型)) 这样我就犯了一个错误 有人能帮我设置正确的sql语法吗。 谢谢,Laziale最好是在客户端构造sql,然后将其发送给sql,因

我想将来自.net解决方案的多个变量转换为整数。 大概是这样的: 我使用IN关键字来选择多个关键字,因为我不知道客户选择了多少变量,我将它们放在nvarchar变量中

例如:

选择的状态ID:30,40,50

“30,40,50”将其作为sql nvarchar参数传递给sql server

我想把它们转换成整数,得到如下结果: IN(铸造(30,40,50为整型)) 这样我就犯了一个错误

有人能帮我设置正确的sql语法吗。
谢谢,Laziale最好是在客户端构造sql,然后将其发送给sql,因为在sql Server端这是不可能的

您可以这样做:

string parameters = "30, 40, 50";
string sqlFormat = "SELECT * FROM MY_TABLE WHERE FIELD IN({0})";
string sql = String.Format(sqlFormat, parameters );
myReader = command.ExecuteReader(sql);
更新


对于那些认为这将为SQL注入打开的朋友,数字列表由应用程序创建,用户仅从列表中选择项目。因此,这对用户和可能的SQL注入不开放。

您使用的是.NET标记。您正在使用ADO.NET吗?您是在设置文本查询,还是在调用存储过程

SELECT *
FROM YourTable
WHERE StatusId IN(CAST('30' AS int),CAST('40' AS int),CAST('50' AS int))
对于普通Transact-SQL,如果您有一个表示值列表的字符串,则必须解析该字符串并将每个值转换为整数。没有像.NET中那样的内置Split()函数,但您确实有用于查找和提取数字的子字符串和函数索引。然后,将它们转换为整数,并将它们存储在一个临时表或表变量中,您将在in子句中使用该临时表或表变量


对于大多数.NET应用程序,对于任何可用的查询命令解析器,您都应该能够将该字符串用作字符串表示的查询的一部分。如果它是基本的ADO,那就是SQL,对于NHibernate,它就是HQL,等等。只需设置一个基于字符串的查询并将其发送到SQL Server,它就会将整个内容解析为一个命令,不需要您进行转换。

您可以在SQL Server端执行此操作,但我不喜欢它:

CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
returns @Results TABLE (Items nvarchar(4000))  
as
begin
declare @index int
declare @slice nvarchar(4000)
select @index = 1
if @String is null return
while @index != 0
begin
select @index = charindex(@Delimiter,@String)
if @index !=0
select @slice = left(@String,@index - 1)
else
select @slice = @String
insert into @Results(Items) values(@slice)
select @String = right(@String,len(@String) - @index)
if len(@String) = 0 break
end return
end
然后:

WHERE someintegerfield IN (select * from dbo.Split('30,40,50', ','))

坏主意。它对sql注入不安全。为什么!?参数是由应用程序构造的,你是说应用程序将SQL注入自身吗?我使用的是存储过程,内容如下:选择OrderId、OrderTotal、BillingCountry、OrderStatus.Name作为OrderStatus,来自DailyOrders的PaymentStatus内部加入DailyOrderStatus上的DailyOrderStatus.OrderStatusID=DailyOrderStatus.OrderStatusID内部加入DailyPaymentStatus上的DailyPaymentStatus.PaymentStatusID,其中日期>转换(@date1作为datetime)和日期<转换(@Date2作为datetime)以及DailyOrders.OrderStatusID(@OrderStatusID)不错,但我不知道他们会在网站上选择多少个参数。有没有办法在存储过程中动态添加参数?