【发布时间】:2015-07-13 14:39:30
【问题描述】:
我正在尝试创建一个搜索函数,该函数在 GridView 中搜索某个值,然后返回该行。我在 MySQL 工作台中测试了这个查询,它可以工作,但是当查询在 Visual Studio 中运行时,我得到了这个错误:
您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 23 行的“?parameter0”附近
StringBuilder SQL = new StringBuilder(SearchSQL);
if (SearchFieldKey != null && SearchFieldKey.Length > 0)
{
if (SearchTerms != null)
{
SQL.Append(" HAVING ");
for (int i = 0; i < SearchFieldKey.Length; i++)
{
if (SearchFields.ContainsKey(SearchFieldKey[i]))
{
SQL.Append(SearchFields[SearchFieldKey[i]] + " LIKE ?parameter" + i.ToString());
param.Add(new MySqlParameter("parameter" + i.ToString(), "%" + SearchTerms[i] + "%"));
if (i != SearchFieldKey.Length - 1)
SQL.Append(" OR ");
}
else
throw new Exception("Error: Attempted to search on invalid field. Check SearchFields Argument.");
}
}
}
SQL.Append(" '); ");
SQL.Append ("prepare stmt from @sql; execute stmt; deallocate prepare stmt;");
在调试时,我复制了正在运行的确切查询并将其粘贴到 Workbench 中,它可以工作。所以我不知道为什么它不会在视觉工作室中运行。
查询从此代码运行:
DataTable dtJobs = Job.CustomFill(SQL.ToString(), param);
并且传入的参数是“%TESTING%”
显示数据库行的查询:
private static string SearchSQL
{
get
{
return @"
SET group_concat_max_len=10000000;
set @sql = null;
select
group_concat(distinct
concat(
'MAX(CASE WHEN pt.Code = ''',
pt.Code ,
''' THEN jp.AdvisedQty ELSE 0 END) AS `',
pt.Code, '`'
)
) into @sql
FROM customer c
LEFT JOIN job_address ja ON c.AccountCode = ja.Code AND c.Company_ID = ja.Company_ID
JOIN AddressType jat ON ja.AddressType = jat.ID and jat.Description = 'Debtor'
LEFT JOIN job_new jn ON ja.JobID = jn.ID
LEFT JOIN job_pieces jp ON ja.JobID = jp.ID
LEFT JOIN piecestype pt on jp.TypeID = pt.ID
WHERE c.Company_ID = ?compid;
set @sql = concat('select
c.Name,
COUNT(distinct jn.ID) as Jobs,
(SELECT Name FROM job_address WHERE AddressType =3 AND JobID = jn.ID) as CollectName,
(SELECT Name FROM job_address WHERE AddressType =2 AND JobID = jn.ID) as DeliverName,
', @sql, '
FROM customer c
LEFT JOIN job_address ja ON c.AccountCode = ja.Code AND c.Company_ID = ja.Company_ID
JOIN AddressType jat ON ja.AddressType = jat.ID and jat.Description = ''Debtor''
LEFT JOIN job_new jn ON ja.JobID = jn.ID
LEFT JOIN job_pieces jp ON ja.JobID = jp.ID
LEFT JOIN piecestype pt on jp.TypeID = pt.ID
WHERE c.Company_ID = ', ?compid,
' GROUP BY c.ID
";
}
}
所以我的搜索查询将HAVING c.Name LIKE "%PRL%" '); 放在查询中的 GROUP BY 之后。然后 Append 语句将准备好的 stmts 放在查询的末尾。
【问题讨论】:
-
我认为您需要使用 '@' 而不是 '?'绑定参数时。
-
添加代码以打印出完整的 SQL,以便您可以看到它。从中应该很明显问题是什么。如果由于某种原因,这对您来说并不明显,请将完整的 SQL 编辑到问题中,并且在这里的某个地方可能会很明显。但是,乍一看,您缺少参数之间的逻辑
AND或OR运算符。 -
@EvanMulawski MySql 可以使用
? -
参数是否已经带有百分号?如果是这样,您不需要在此处再次添加它们:param.Add(new MySqlParameter("parameter" + i.ToString(), "%" + SearchTerms[i] + "%"));
-
@KoBE 不,它还没有出现在百分号中
标签: c# mysql asp.net visual-studio