我搜索了这个问题,但我想任何人都面临过这个问题。我正在尝试使用ExecuteQuery进行IN操作。
IEnumerable<TAssets> results = db.ExecuteQuery<TAssets>
("SELECT * FROM TAssets " +
" WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {0})" +
" and CompanyId in ({1}) ",
labelid,
string.Join(",", companyIdList)
);
return results.ToList();
问题是 string.Join(“,”,companyIdList)返回'61,70'。然后它尝试将其转换为整数。为什么?我该怎么办?
ERROR:Conversion failed when converting the nvarchar value '61,70' to data type int.
System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value '61,70' to data type int.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
at System.Data.SqlClient.SqlDataReader.Read()
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReaderBase`1.Read()
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
任何建议?或者你能告诉我使用ExecuteQuery的IN运算符吗?
答案 0 :(得分:1)
这里的事情是它们是参数化的,这通常是一件好事。
我不是说这是最好的解决方案,但你应该可以这样做:
// Note that the first {} is escaped.
var sql = string.Format(
"SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {{0}}) and CompanyId in ({0})",
string.Join(",", companyIdList));
IEnumerable<TAssets> results = db.ExecuteQuery<TAssets>(sql, labelid);
return results.ToList();
它实际上做的是它将companyIds添加到sql字符串而不是让ExecuteQuery
参数化它。只要注意sql注入,并确保你的int
数组中只有companyId
。
sql
- 变量将是:
SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {0}) and CompanyId in (61,70)
答案 1 :(得分:0)
您正在构建的声明导致:
"SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = 1) and CompanyId in ('61,70')"
您需要分别解释每个值,以便输出如下:
"SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = 1) and CompanyId in ('61','70')"
这一行
string.Join("','", companyIdList)
结合领先和结束&#39;应该做的。
更好的方法是动态创建SqlParameters但