- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在从事一个项目,该项目将允许用户仅通过选择列来构建查询。
我的应用程序似乎运行良好并生成正确的查询。但是当我执行查询时,我得到以下异常
Column 'Tasks.Duration' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
这里没有做的是我的查询实际上包含正确的 GROUP BY
语句
这是我的应用程序生成的查询
SELECT
[Campaign].[Title] AS [CampaignTitle]
,CASE WHEN [Task].[Duration] <= @p0 THEN @p1 WHEN [Task].[Duration] >= @p2 AND [Task].[Duration] <= @p3 THEN @p4 ELSE @p5 END AS [9pl1WbY1ZkSvSpel3g4xmw]
,COUNT(1) AS [Ib7ZS4arHkSUWhf4saEtmg]
,SUM(CASE WHEN [Task].[Duration] <= @p6 THEN @p7 ELSE @p8 END) AS [xW1GmttC6kWHsc9QIEPN9w]
FROM [Tasks] AS [Task]
INNER JOIN [Campaigns] AS [Campaign] ON [Campaign].[Id] = [Task].[CampaignId]
INNER JOIN [Users] AS [User] ON [User].[Id] = [Task].[CompletedBy]
INNER JOIN [Results] AS [Result] ON [Result].[Id] = [Task].[ResultId]
WHERE
[Result].[IsCompleted] = @p9 AND ( [User].[LastName] = @p10 OR [User].[LastName] = @p11 )
GROUP BY
[Campaign].[Title]
,CASE WHEN [Task].[Duration] <= @p13 THEN @p14 WHEN [Task].[Duration] >= @p15 AND [Task].[Duration] <= @p16 THEN @p17 ELSE @p18 END
HAVING
COUNT(1) >= @p12
ORDER BY
[Campaign].[Title]
,CASE WHEN [Task].[Duration] <= @p19 THEN @p20 WHEN [Task].[Duration] >= @p21 AND [Task].[Duration] <= @p22 THEN @p23 ELSE @p24 END
更好的是,我尝试用参数值手动替换参数名称。然后我接受了他们的输出查询,并在 SSMS 中执行了它,并且没有任何问题。
这就是我执行查询的方式
using (SqlConnection connection = new SqlConnection(this.connectionString))
using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(selectCommand))
{
try
{
selectCommand.Connection = connection;
DataTable table = new DataTable();
sqlAdapter.Fill(table);
return table;
}
catch (Exception e)
{
throw new ReportException(string.Format("{0} {1}", e.Message, e.GetType().FullName));
}
}
这是我用它们的值替换参数的方法
private string GetPlainQuery(SqlCommand selectCommand)
{
string output = selectCommand.CommandText;
for (int i = selectCommand.Parameters.Count - 1; i >= 0; i--)
{
var p = selectCommand.Parameters[i];
string value = p.Value.ToString();
if (p.SqlDbType == SqlDbType.NChar || p.SqlDbType == SqlDbType.NText || p.SqlDbType == SqlDbType.NVarChar || p.SqlDbType == SqlDbType.Text || p.SqlDbType == SqlDbType.Char || p.SqlDbType == SqlDbType.Date || p.SqlDbType == SqlDbType.DateTime || p.SqlDbType == SqlDbType.SmallDateTime)
{
value = string.Format("'{0}'", value.Replace("'", "''"));
}
output = output.Replace(p.ParameterName, value);
}
return output;
}
是什么导致了这个错误?我该如何解决?
已更新
这是我用值替换参数后的查询
SELECT
[Campaign].[Title] AS [CampaignTitle]
,CASE WHEN [Task].[Duration] <= 100 THEN '<100' WHEN [Task].[Duration] >= 100 AND [Task].[Duration] <= 200 THEN 'BETWEEN 100 AND 200' ELSE '>200' END AS [9pl1WbY1ZkSvSpel3g4xmw]
,COUNT(1) AS [Ib7ZS4arHkSUWhf4saEtmg]
,SUM(CASE WHEN [Task].[Duration] <= 100 THEN 1 ELSE 0 END) AS [xW1GmttC6kWHsc9QIEPN9w]
FROM [Tasks] AS [Task]
INNER JOIN [Campaigns] AS [Campaign] ON [Campaign].[Id] = [Task].[CampaignId]
INNER JOIN [Users] AS [User] ON [User].[Id] = [Task].[CompletedBy]
INNER JOIN [Results] AS [Result] ON [Result].[Id] = [Task].[ResultId]
WHERE
[Result].[IsCompleted] = 1 AND ( [User].[LastName] = 'Yo' OR [User].[LastName] = 'Smith' )
GROUP BY
[Campaign].[Title]
,CASE WHEN [Task].[Duration] <= 100 THEN '<100' WHEN [Task].[Duration] >= 100 AND [Task].[Duration] <= 200 THEN 'BETWEEN 100 AND 200' ELSE '>200' END
HAVING
COUNT(1) >= 0
ORDER BY
[Campaign].[Title]
,CASE WHEN [Task].[Duration] <= 100 THEN '<100' WHEN [Task].[Duration] >= 100 AND [Task].[Duration] <= 200 THEN 'BETWEEN 100 AND 200' ELSE '>200' END
最佳答案
我的猜测是错误是由于您在选择列表中的 case 语句与您在 group by 中的不一样。我通常做的是在子查询中解析这些列,以便更容易阅读和维护外部查询。
关于c# - 尝试使用 C# 执行查询时,SqlCommand 返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38643777/
我需要使用 ADO.NET 将一系列命令发送到 SQL 2008,以便逐个执行。我应该为我发送的每个 SQL 创建一个新的 SQLCommand 吗?或者重用相同的 SQLCommand 并仅更改 C
我们可以在将参数传递给 sql 查询时同时使用这两种方法吗? 那么它们之间有什么区别呢? 最佳答案 MSDN article on AddWithValue() 解释两者之间的差异。内是对细微差异的解
我已经彻底搜索,但找不到 SET 的方法我的列数据到我使用 SQL 初始化的变量 UPDATE陈述。 这是导致问题的一段代码: int maxId; SqlConnection dataConnect
使用 SqlParameters是防止数据库查询中的 SQL 注入(inject)的推荐方法。我在哪里可以找到内部清理这些参数的代码/函数?我想在我的自定义实现中重新使用这个函数。我尝试使用 Refl
我目前正在使用 SQL Server 2014 中的 C# 脚本更新和读取值。当使用 SQlCommand 执行非查询时,运行脚本时会弹出错误: IndexOutOfRangeException: A
我最近一直在做一个旧项目。我在项目中发现以前的同事已经创建了一些用于打开与数据库的连接的常用方法。但是我怀疑这个过程是否真的在查询完成后通过 IDispose 处理连接。 方法如下: 连接数据库。 /
抱歉格式化,有点粗糙 我在 C# 中通过 SQLCommand 插入语句时遇到问题。插入完成后,ID 将返回给程序。 我填充了一些变量并编写了一个 SQLCommand。考虑了所有参数。 using
我有以下 SQL 语句(如果我在我的数据库中像这样执行它,它会起作用): IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = '
我有一个 C# 程序,我在其中创建了各种类,所有类都需要调用数据库。所以我决定创建一个静态类来处理所有调用,以便我可以非常轻松地应用影响深远的更改。在那个类中,我有调用 SqlCommand 各个部分
试图只返回前几行,因为我的数据库太大了,但是当我测试我的 SQL 时,我做了一个 select * 并且只返回了第一行。 SqlCommand sqlCmd = new SqlCommand(); S
我对从 SqlCommand 返回的值有疑问,我有这段代码: string sqlSelect = "Select TOP 1 Quotation.SentToSupp as SentToSupp F
我正在 .Net 中创建测试方法,需要更改数据库以设置测试场景。我们使用 SqlCommands 发送查询来更改数据库,为此连接字符串是受信任的连接字符串。所有 DROPS 和 ALTER 查询对于表
我试图通过 SqlCommand 将表名作为参数传递给我的查询,但它似乎不起作用。这是我的代码; SqlConnection con = new SqlConnection( "server=.;us
当我在 SSMS 中执行以下命令时,我得到了预期的结果 - SELECT * FROM [Event] WHERE Active = 'True' AND [Name] LIKE '%P%' 即显示名
我在 C# 中运行一条返回一个值(字符串)的 SQL 命令。然后我试图将它保存到一个变量,但它总是抛出这个异常: A first chance exception of type 'System.In
我有这个 SqlCommand,但我不知道如何给出返回值? string param = Request.QueryString["id"]; System.Data.SqlClient.SqlCon
我对使用 C# 和 ASP.NET 还很陌生,我很好奇在 SQL 数据库上运行多个查询时是否有命名 SqlCommand 的约定。例如,我已经创建了我的 SqlConnection,我希望调用一个函数
好吧,这是微不足道的,但它一直困扰着我。我有这样的代码 oCmd = new SqlCommand("getBooking", oCon); oCmd.CommandType = CommandTyp
如果我有这个变量: int value = 4; 将作为一些 sql 参数传递: SqlCommand sqlcmd = new SqlCommand(); sqlcmd.Parameters.Add
我使用以下代码从 SQL Server 表中进行选择: using (SqlConnection con = new SqlConnection(SqlConnectionString)) {
我是一名优秀的程序员,十分优秀!