以下代码应检查记录是否存在,然后更新它或添加新记录(如果没有开始)。但是它无法解析SQL查询。有什么想法吗?
var db = Database.Open("DB2");
var save = "IF EXISTS (SELECT * FROM QuestionnaireData WHERE ID=" + WebSecurity.CurrentUserId + ") UPDATE QuestionnaireData SET Q1=" + "TEST" + " WHERE ID=" + WebSecurity.CurrentUserId + " ELSE INSERT INTO QuestionnaireData VALUES (@0, @1)";
db.Execute(save, WebSecurity.CurrentUserId, "TEST");
错误:
' /'中的服务器错误应用
解析查询时出错。 [令牌行号= 1,令牌 line offset = 1,Token in error = IF]
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.Data.SqlServerCe.SqlCeException:有 解析查询时出错。 [令牌行号= 1,令牌行偏移量 = 1,令牌错误= IF]
来源错误:
第16行:var save =" IF EXISTS(SELECT * FROM QuestionnaireData WHERE ID =" + WebSecurity.CurrentUserId +")更新 问卷数据SET Q1 ='" +" TEST" +"' WHERE ID =" + WebSecurity.CurrentUserId +" ELSE INSERT INTO QuestionnaireData 价值观(@ 0,@ 1)&#34 ;;第17行:第18行:
db.Execute(save,WebSecurity.CurrentUserId," TEST");第19行:线 20:源文件:c:\ Users \ Blake \ Documents \ Visual Studio 2013 \ WebSites \ MBM \ Questionnaire \ BasicInfo.cshtml行:18
堆栈追踪:
[SqlCeException(0x80004005):解析查询时出错。 [ 令牌行号= 1,令牌行偏移= 1,令牌错误= IF]]
System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)+136
System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()+798
System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(的CommandBehavior 行为,String方法,ResultSetOptions选项)+363
System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()+53
WebMatrix.Data.Database.Execute(String commandText,Object [] args) +115 ASP._Page_Questionnaire_BasicInfo_cshtml.Execute()在c:\ Users \ Blake \ Documents \ Visual Studio中 2013 \ \网站已MBM \问卷\ BasicInfo.cshtml:18个
System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+197
System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 执行者)+68 System.Web.WebPages.WebPage.ExecutePageHierarchy() +151 System.Web.WebPages.StartPage.RunPage()+ 17 System.Web.WebPages.StartPage.ExecutePageHierarchy()+62
System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)+76
System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext)+114版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.0.30319.34212
更新的代码:
var check = "SELECT count(*) FROM QuestionnaireData WHERE ID=" + WebSecurity.CurrentUserId;
if (db.Execute(check) == 0)
{
var insert = "INSERT INTO QuestionnaireData VALUES (@0, @1)";
db.Execute(insert, WebSecurity.CurrentUserId, "TEST");
}
else {
var update = "UPDATE QuestionnaireData SET Q1='" + "TEST" + "' WHERE ID=" + WebSecurity.CurrentUserId;
db.Execute(update);
};
答案 0 :(得分:2)
编辑,因为您使用的是SQL Server CE:
SQL Server CE does not support IF statements。你必须执行
SELECT count(*) FROM QuestionnaireData WHERE ID=123
本身。然后检查结果,并执行INSERT
或UPDATE
声明。
结束编辑:原始语法错误问题:
你最终得到的SQL看起来像这样:
IF EXISTS (SELECT * FROM QuestionnaireData WHERE ID=123)
UPDATE QuestionnaireData SET Q1=TEST WHERE ID=123
ELSE
INSERT INTO QuestionnaireData VALUES (@0, @1)
您的问题是SET Q1=TEST
- TEST显然是一个字符串,因此应该引用它:SET Q1='TEST'
请注意,您需要在SQL中使用单引号作为字符串,而不是像C#中那样使用双引号。
所以,你需要改变你的C#代码:
var save = "... SET Q1='" + "TEST" + "' WHERE ...";
请注意已添加单引号。我已经把双引号留了下来,因为我认为你有一些理由 - 稍后用变量替换TEST?
当然,如果你这样做,你应该只使用另一个参数。