【发布时间】:2016-12-07 08:29:11
【问题描述】:
我目前正在尝试从我的简单 C# 应用程序中捕获插入 SQL 查询,但是当我尝试使用添加到 userIDList 参数中的用户 ID 将数据插入数据库时,出现错误说
传入的请求参数过多。服务器支持一个 最多 2100 个参数。
userIDList 有时会包含 60 个以上的数组,然后会弹出错误。
我的 SQL CommandText 将包含
"SELECT * FROM TIME_ATTENDANCE_REPORT WHERE TRXDATETIME = @Date AND USERID IN (001,002,003,004,....)
所以我认为如果超过某个数字,就会弹出错误
这是我的示例代码:
List<string> userIDList = new List<string>();
using (SqlCommand sqlDBComm = new SqlCommand())
{
openConnection();
SqlDataReader sqlDBReader;
sqlDBReader = null;
sqlDBComm.CommandText = "SELECT * FROM TIME_ATTENDANCE_REPORT WHERE TRXDATETIME = @Date AND USERID IN (" + string.Join(",", userIDList) + ") ORDER BY USERID ASC ";
sqlDBComm.Parameters.Add("@Date", SqlDbType.DateTime);
sqlDBComm.Parameters["@Date"].Value = GetDateFrom;
sqlDBComm.Connection = sqlDB;
sqlDBComm.CommandType = CommandType.Text;
try
{
sqlDBReader = sqlDBComm.ExecuteReader();
t.Load(sqlDBReader);
sqlDBReader.Close();
if (t.Rows.Count > 0)
{
status = "Update";
}
else
{
status = "Insert";
}
}
catch (Exception errMsg)
{
MessageBox.Show("Error Code: " + errMsg.ToString());
}
finally
{
sqlDBReader.Close();
closeConnection();
}
}
还有其他解决方案可以解决这个问题吗? 谢谢
【问题讨论】:
-
这有点奇怪,因为你没有使用参数(你可能应该是,顺便说一句);你也没有使用 LINQ,所以你可能不需要那个标签。但是,问题:您使用的是什么版本的 sql-server?最简单的“修复”可能是
string_split,但这只是 2016 年;否则,自定义拆分 UDF 或表值参数可能是很好的替代品。但是:您确定示例代码是出错的代码吗?因为不会创建很多参数(只有 2 个) -
@MarcGravell 我使用的是 SQL Server 2014,自定义拆分 UDF 是什么意思?
-
@MarcusZac 编写与
string_split执行相同操作的UDF(通过CREATE FUNCTION)只需少量工作(但速度较慢); @Cetin 提供了一个例子