我如何将数组传递给执行存储命令?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何将数组传递给执行存储命令?相关的知识,希望对你有一定的参考价值。

如何将以逗号分隔的整数数组传递给实体中的ExecuteStoreCommand作为参数我无法执行此:

this.ObjectContext.ExecuteStoreCommand("INSERT INTO SurveyPatientListMrns 
  (UserData, MrnId) SELECT DISTINCT '{0}' , MrnId 
FROM PatientVisits WHERE (FacilityId = {1})
AND (UnitId IN ({2}))", userData, facilityId, (string.Join(",", unitIds)));

这里(string.Join(",", unitIds))是一个字符串,由于逗号的原因,我无法将其转换为整数。那我该如何传递参数?

FYI,unitIds是整数数组

答案

尽管看起来像string.Format操作,ExecuteStoreCommand在内部构建参数化查询以提高性能并帮助保护您免受SQL注入攻击。 (MSDN)

当将string.Join用作ExecuteStoreCommand的参数时,它不会将该结果视为IN子句的值列表,而是将一个字符串恰好看起来像一个字符串。基本上它将生成一个如下所示的IN子句:

(UnitId IN ('1,2,3'))

显然不是您想要的。

在传递string.Join之前,您将必须使用uinitIdsExecuteStoreCommand版本的列表来构建SQL命令。

string query = @"INSERT INTO SurveyPatientListMrns  (UserData, MrnId) 
    SELECT DISTINCT '{0}' , MrnId 
    FROM PatientVisits WHERE (FacilityId = {1}) AND 
    (UnitId IN (" + string.Join(",", unitIds) + "))";
this.ObjectContext.ExecuteStoreCommand(query, userData, facilityId);

由于存在SQL注入攻击的可能,通常应避免动态构建SQL查询,但是在这种情况下,您知道unitIds是整数列表,因此应该可以。

另一答案

与答案相同,只是使用强类型结果集进行演示。

以上是关于我如何将数组传递给执行存储命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何将选定的微调器 id 传递给片段

如何在不将图像保存在本地的情况下将捕获的图像(Surface View)传递给另一个片段?

如何将值的“数组”传递给我的存储过程?

如何将图像视图从改造加载的片段传递给子片段?

如何将活动值传递给片段[重复]

如何将活动中的意图传递给已打开的片段